Compare commits
80 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
7110803a05 | ||
|
c41132a4f6 | ||
|
36f4177b68 | ||
|
1ff20846eb | ||
|
5202ea7a53 | ||
|
0a47157c26 | ||
|
48265e1947 | ||
|
5ab09755c8 | ||
|
8b191e85f2 | ||
|
c015ff9539 | ||
|
ac2e25e74f | ||
|
7d8c6c4b19 | ||
|
8ec535ac58 | ||
|
ca3f353d44 | ||
|
9b14e8fb8a | ||
|
5b8733f8ec | ||
|
90a63053d4 | ||
|
8a8c54b5b4 | ||
|
9938cbdf5a | ||
|
0fe0e49401 | ||
|
5b056b2579 | ||
|
4b9116a5dd | ||
|
6abbdf4cfb | ||
|
adb58bd940 | ||
|
283713bd93 | ||
|
19fb3c8da9 | ||
|
77a820ea6f | ||
|
6765ff04eb | ||
|
bb3105a862 | ||
|
0c29a9922f | ||
|
aff21c1e7c | ||
|
15ac366c8d | ||
|
5a9555bcf5 | ||
|
3f1d5001d9 | ||
|
be5f14041f | ||
|
100279cd16 | ||
|
4f138c4f92 | ||
|
78cb5588b1 | ||
|
0b600dd93f | ||
|
decb64ccd8 | ||
|
7e17e4319f | ||
|
c64e1d8ed6 | ||
|
f84ba571b5 | ||
|
5da3d00df2 | ||
|
9f831eb4de | ||
|
230480afd1 | ||
|
ccffd8bfe2 | ||
|
bd68210bc3 | ||
|
c833301bd5 | ||
|
3dbba43e5f | ||
|
055b1a5a86 | ||
|
6db1457a28 | ||
|
6ceb257a3b | ||
|
fc09c682e3 | ||
|
22c3e39e89 | ||
|
64c92d0c8d | ||
|
ba84ae0c01 | ||
|
8caafb8ec4 | ||
|
fe71150b76 | ||
|
7172d5b49d | ||
|
a0e68f8a2b | ||
|
1dc5500690 | ||
|
dab343fc15 | ||
|
a921a29c7e | ||
|
6db729b136 | ||
|
ee845f3ed6 | ||
|
19fd9d7959 | ||
|
07992907fd | ||
|
c52b282d96 | ||
|
d454efa152 | ||
|
80a62f29d8 | ||
|
8a25e9ba06 | ||
|
37fe30907a | ||
|
fd268a723e | ||
|
d0c5bb5a97 | ||
|
098b247649 | ||
|
09adcbdcd9 | ||
|
31a84ee58f | ||
|
62b7b2227e | ||
|
0f43ead321 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,3 +1,5 @@
|
|||||||
|
vendor/**/.travis.yml
|
||||||
|
|
||||||
/protoc-gen-gotemplate
|
/protoc-gen-gotemplate
|
||||||
|
|
||||||
# Compiled Object files, Static and Dynamic libs (Shared Objects)
|
# Compiled Object files, Static and Dynamic libs (Shared Objects)
|
||||||
|
34
.golangci.yml
Normal file
34
.golangci.yml
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
run:
|
||||||
|
deadline: 1m
|
||||||
|
tests: false
|
||||||
|
#skip-files:
|
||||||
|
# - ".*\\.gen\\.go"
|
||||||
|
|
||||||
|
linters-settings:
|
||||||
|
golint:
|
||||||
|
min-confidence: 0
|
||||||
|
maligned:
|
||||||
|
suggest-new: true
|
||||||
|
goconst:
|
||||||
|
min-len: 5
|
||||||
|
min-occurrences: 4
|
||||||
|
misspell:
|
||||||
|
locale: US
|
||||||
|
|
||||||
|
linters:
|
||||||
|
disable-all: true
|
||||||
|
enable:
|
||||||
|
- goconst
|
||||||
|
- misspell
|
||||||
|
- deadcode
|
||||||
|
- misspell
|
||||||
|
- structcheck
|
||||||
|
- errcheck
|
||||||
|
- unused
|
||||||
|
- varcheck
|
||||||
|
- staticcheck
|
||||||
|
- unconvert
|
||||||
|
- gofmt
|
||||||
|
- goimports
|
||||||
|
- golint
|
||||||
|
- ineffassign
|
@@ -1,12 +1,16 @@
|
|||||||
language: go
|
language: go
|
||||||
go: 1.8.x
|
go: 1.11.x
|
||||||
|
go_import_path: moul.io/protoc-gen-gotemplate
|
||||||
install:
|
install:
|
||||||
- go get github.com/Masterminds/glide
|
- go get github.com/Masterminds/glide
|
||||||
- wget https://raw.githubusercontent.com/grpc-ecosystem/grpc-gateway/master/.travis/install-protoc.sh && chmod +x install-protoc.sh && ./install-protoc.sh 3.2.0
|
- wget https://raw.githubusercontent.com/grpc-ecosystem/grpc-gateway/v1.5.0/.travis/install-protoc.sh && chmod +x install-protoc.sh && ./install-protoc.sh 3.4.0
|
||||||
- go get -u github.com/golang/protobuf/protoc-gen-go
|
- go get -u github.com/golang/protobuf/protoc-gen-go
|
||||||
|
- go get github.com/securego/gosec/cmd/gosec/...
|
||||||
|
- curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s v1.12.2
|
||||||
script:
|
script:
|
||||||
- make install
|
- make install
|
||||||
- make test
|
- make test
|
||||||
|
- PATH=$PATH:$(pwd)/bin make lint
|
||||||
cache:
|
cache:
|
||||||
directories:
|
directories:
|
||||||
- $HOME/local
|
- $HOME/local
|
||||||
|
19
Dockerfile
19
Dockerfile
@@ -1,5 +1,14 @@
|
|||||||
FROM znly/protoc
|
FROM znly/protoc:0.3.0
|
||||||
RUN apk --update add make git go rsync
|
|
||||||
COPY . /go/src/github.com/moul/protoc-gen-gotemplate
|
ENV GOPATH=/go \
|
||||||
WORKDIR /go/src/github.com/moul/protoc-gen-gotemplate
|
PATH=/go/bin:${PATH}
|
||||||
RUN go install .
|
|
||||||
|
# Install deps and common tools
|
||||||
|
RUN apk --update add make git go rsync libc-dev \
|
||||||
|
&& go get -u golang.org/x/tools/cmd/goimports
|
||||||
|
|
||||||
|
# Install protoc-gen-gotemplate
|
||||||
|
COPY . /go/src/moul.io/protoc-gen-gotemplate
|
||||||
|
WORKDIR /go/src/moul.io/protoc-gen-gotemplate
|
||||||
|
RUN git remote set-url origin https://github.com/moul/protoc-gen-gotemplate
|
||||||
|
RUN go install . ./cmd/web-editor
|
||||||
|
10
Makefile
10
Makefile
@@ -5,9 +5,11 @@ build:
|
|||||||
.PHONY: install
|
.PHONY: install
|
||||||
install:
|
install:
|
||||||
go install .
|
go install .
|
||||||
|
go install ./cmd/web-editor
|
||||||
|
|
||||||
.PHONY: test
|
.PHONY: test
|
||||||
test: install
|
test: install
|
||||||
|
cd examples/time && make
|
||||||
cd examples/enum && make
|
cd examples/enum && make
|
||||||
cd examples/import && make
|
cd examples/import && make
|
||||||
cd examples/dummy && make
|
cd examples/dummy && make
|
||||||
@@ -16,7 +18,9 @@ test: install
|
|||||||
cd examples/flow && make
|
cd examples/flow && make
|
||||||
cd examples/sitemap && make
|
cd examples/sitemap && make
|
||||||
cd examples/go-generate && make
|
cd examples/go-generate && make
|
||||||
cd examples/single-package-mode && make
|
# cd examples/single-package-mode && make
|
||||||
|
cd examples/helpers && make
|
||||||
|
cd examples/arithmetics && make
|
||||||
# cd examples/go-kit && make
|
# cd examples/go-kit && make
|
||||||
|
|
||||||
.PHONY: docker.build
|
.PHONY: docker.build
|
||||||
@@ -26,3 +30,7 @@ docker.build:
|
|||||||
.PHONY: docker.push
|
.PHONY: docker.push
|
||||||
docker.push: docker.build
|
docker.push: docker.build
|
||||||
docker push moul/protoc-gen-gotemplate
|
docker push moul/protoc-gen-gotemplate
|
||||||
|
|
||||||
|
.PHONY: lint
|
||||||
|
lint:
|
||||||
|
golangci-lint run --verbose . ./helpers ./cmd/...
|
||||||
|
81
README.md
81
README.md
@@ -22,6 +22,12 @@ The plugin parses **protobuf** files, generates an **ast**, and walks a local **
|
|||||||
3. the `ast` is given to [Golang's `text/template` engine](https://golang.org/pkg/text/template/) for each *user* template files
|
3. the `ast` is given to [Golang's `text/template` engine](https://golang.org/pkg/text/template/) for each *user* template files
|
||||||
4. the *funcmap* enriching the template engine is based on [Masterminds/sprig](https://github.com/Masterminds/sprig), and contains type-manipulation, iteration and language-specific helpers
|
4. the *funcmap* enriching the template engine is based on [Masterminds/sprig](https://github.com/Masterminds/sprig), and contains type-manipulation, iteration and language-specific helpers
|
||||||
|
|
||||||
|
## Web editor
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Demo server](http://protoc-gen-gotemplate.m.42.am/)
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
`protoc-gen-gotemplate` requires a **template_dir** directory *(by default `./templates`)*.
|
`protoc-gen-gotemplate` requires a **template_dir** directory *(by default `./templates`)*.
|
||||||
@@ -67,33 +73,59 @@ See [examples](./examples).
|
|||||||
|
|
||||||
This project uses [Masterminds/sprig](https://github.com/Masterminds/sprig) library and additional functions to extend the builtin [text/template](https://golang.org/pkg/text/template) helpers.
|
This project uses [Masterminds/sprig](https://github.com/Masterminds/sprig) library and additional functions to extend the builtin [text/template](https://golang.org/pkg/text/template) helpers.
|
||||||
|
|
||||||
Non-exhaustive list of new helpers:s
|
Non-exhaustive list of new helpers:
|
||||||
|
|
||||||
* **all the functions from [sprig](https://github.com/Masterminds/sprig)**
|
* **all the functions from [sprig](https://github.com/Masterminds/sprig)**
|
||||||
* `json`
|
* `add`
|
||||||
* `prettyjson`
|
* `boolFieldExtension`
|
||||||
* `first`
|
|
||||||
* `last`
|
|
||||||
* `splitArray`
|
|
||||||
* `upperFirst`
|
|
||||||
* `lowerFirst`
|
|
||||||
* `camelCase`
|
* `camelCase`
|
||||||
* `lowerCamelCase`
|
* `contains`
|
||||||
* `kebabCase`
|
* `divide`
|
||||||
* `snakeCase`
|
* `fieldMapKeyType`
|
||||||
* `getProtoFile`
|
* `fieldMapValueType`
|
||||||
* `getMessageType`
|
* `first`
|
||||||
* `getEnumValue`
|
* `getEnumValue`
|
||||||
|
* `getMessageType`
|
||||||
|
* `getProtoFile`
|
||||||
|
* `goNormalize`
|
||||||
|
* `goTypeWithPackage`
|
||||||
|
* `goType`
|
||||||
|
* `goZeroValue`
|
||||||
|
* `haskellType`
|
||||||
|
* `httpBody`
|
||||||
|
* `httpPath`
|
||||||
|
* `httpPathsAdditionalBindings`
|
||||||
|
* `httpVerb`
|
||||||
|
* `index`
|
||||||
|
* `int64FieldExtension`
|
||||||
|
* `isFieldMap`
|
||||||
|
* `isFieldMessageTimeStamp`
|
||||||
* `isFieldMessage`
|
* `isFieldMessage`
|
||||||
* `isFieldRepeated`
|
* `isFieldRepeated`
|
||||||
* `goType`
|
|
||||||
* `goTypeWithPackage`
|
|
||||||
* `jsType`
|
|
||||||
* `jsSuffixReserved`
|
* `jsSuffixReserved`
|
||||||
|
* `jsType`
|
||||||
|
* `json`
|
||||||
|
* `kebabCase`
|
||||||
|
* `last`
|
||||||
|
* `leadingComment`
|
||||||
|
* `leadingDetachedComments`
|
||||||
|
* `lowerCamelCase`
|
||||||
|
* `lowerFirst`
|
||||||
|
* `lowerGoNormalize`
|
||||||
|
* `multiply`
|
||||||
* `namespacedFlowType`
|
* `namespacedFlowType`
|
||||||
* `httpVerb`
|
* `prettyjson`
|
||||||
* `httpPath`
|
* `replaceDict`
|
||||||
* `shortType`
|
* `shortType`
|
||||||
|
* `snakeCase`
|
||||||
|
* `splitArray`
|
||||||
|
* `stringFieldExtension`
|
||||||
|
* `stringMethodOptionsExtension`
|
||||||
|
* `string`
|
||||||
|
* `subtract`
|
||||||
|
* `trailingComment`
|
||||||
|
* `trimstr`
|
||||||
|
* `upperFirst`
|
||||||
* `urlHasVarsFromMessage`
|
* `urlHasVarsFromMessage`
|
||||||
|
|
||||||
See the project helpers for the complete list.
|
See the project helpers for the complete list.
|
||||||
@@ -102,7 +134,18 @@ See the project helpers for the complete list.
|
|||||||
|
|
||||||
* Install the **Go** compiler and tools from https://golang.org/doc/install
|
* Install the **Go** compiler and tools from https://golang.org/doc/install
|
||||||
* Install **protobuf**: `go get -u github.com/golang/protobuf/{proto,protoc-gen-go}`
|
* Install **protobuf**: `go get -u github.com/golang/protobuf/{proto,protoc-gen-go}`
|
||||||
* Install **protoc-gen-gotemplate**: `go get -u github.com/moul/protoc-gen-gotemplate`
|
* Install **protoc-gen-gotemplate**: `go get -u moul.io/protoc-gen-gotemplate`
|
||||||
|
|
||||||
|
## Docker
|
||||||
|
|
||||||
|
* automated docker hub build: [https://hub.docker.com/r/moul/protoc-gen-gotemplate/](https://hub.docker.com/r/moul/protoc-gen-gotemplate/)
|
||||||
|
* Based on [http://github.com/znly/protoc](http://github.com/znly/protoc)
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$> docker run --rm -v "$(pwd):$(pwd)" -w "$(pwd)" moul/protoc-gen-gotemplate -I. --gotemplate_out=./output/ ./*.proto
|
||||||
|
```
|
||||||
|
|
||||||
## Projects using `protoc-gen-gotemplate`
|
## Projects using `protoc-gen-gotemplate`
|
||||||
|
|
||||||
|
6
assets/assets
Normal file
6
assets/assets
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
/Users/moul/go/src/moul.io/protoc-gen-gotemplate/assets:
|
||||||
|
total used in directory 552 available 9223372036849978910
|
||||||
|
drwxr-xr-x 4 moul staff 128 Dec 9 11:31 .
|
||||||
|
lrwxr-xr-x 1 moul staff 33 Dec 9 11:31 .#web-editor.jpg -> moul@manfred-spacegray.local.9471
|
||||||
|
drwxr-xr-x 21 moul staff 672 Sep 13 18:05 ..
|
||||||
|
-rw-r--r--@ 1 moul staff 280357 Oct 26 2017 web-editor.jpg
|
BIN
assets/web-editor.jpg
Normal file
BIN
assets/web-editor.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 274 KiB |
118
cmd/web-editor/main.go
Normal file
118
cmd/web-editor/main.go
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
"github.com/gorilla/handlers"
|
||||||
|
"github.com/gorilla/mux"
|
||||||
|
)
|
||||||
|
|
||||||
|
func generate(w http.ResponseWriter, r *http.Request) {
|
||||||
|
// read input
|
||||||
|
decoder := json.NewDecoder(r.Body)
|
||||||
|
type Input struct {
|
||||||
|
Protobuf string `json:"protobuf"`
|
||||||
|
Template string `json:"template"`
|
||||||
|
}
|
||||||
|
var input Input
|
||||||
|
if err := decoder.Decode(&input); err != nil {
|
||||||
|
returnError(w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// create workspace
|
||||||
|
dir, err := ioutil.TempDir("", "pggt")
|
||||||
|
if err != nil {
|
||||||
|
returnError(w, err)
|
||||||
|
}
|
||||||
|
// clean up
|
||||||
|
defer func() {
|
||||||
|
if err = os.RemoveAll(dir); err != nil {
|
||||||
|
log.Printf("error: failed to remove temporary directory: %v", err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
if err = ioutil.WriteFile(filepath.Join(dir, "example.proto"), []byte(input.Protobuf), 0644); err != nil {
|
||||||
|
returnError(w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err = ioutil.WriteFile(filepath.Join(dir, "example.output.tmpl"), []byte(input.Template), 0644); err != nil {
|
||||||
|
returnError(w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate
|
||||||
|
cmd := exec.Command("protoc", "-I"+dir, "--gotemplate_out=template_dir="+dir+",debug=true:"+dir, filepath.Join(dir, "example.proto")) // #nosec
|
||||||
|
out, err := cmd.CombinedOutput()
|
||||||
|
if err != nil {
|
||||||
|
returnError(w, errors.New(string(out)))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// read output
|
||||||
|
content, err := ioutil.ReadFile(filepath.Join(dir, "example.output")) // #nosec
|
||||||
|
if err != nil {
|
||||||
|
returnError(w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
returnContent(w, content)
|
||||||
|
}
|
||||||
|
|
||||||
|
func returnContent(w http.ResponseWriter, output interface{}) {
|
||||||
|
payload := map[string]interface{}{
|
||||||
|
"output": fmt.Sprintf("%s", output),
|
||||||
|
}
|
||||||
|
response, err := json.Marshal(payload)
|
||||||
|
if err != nil {
|
||||||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
if _, err := w.Write(response); err != nil {
|
||||||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func returnError(w http.ResponseWriter, err error) {
|
||||||
|
payload := map[string]interface{}{
|
||||||
|
"error": fmt.Sprintf("%v", err),
|
||||||
|
}
|
||||||
|
response, err := json.Marshal(payload)
|
||||||
|
if err != nil {
|
||||||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
|
if _, err := w.Write(response); err != nil {
|
||||||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
r := mux.NewRouter()
|
||||||
|
|
||||||
|
r.Handle("/", http.FileServer(http.Dir("static")))
|
||||||
|
r.HandleFunc("/generate", generate)
|
||||||
|
addr := fmt.Sprintf(":%s", os.Getenv("PORT"))
|
||||||
|
if addr == ":" {
|
||||||
|
addr = ":8080"
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("Listening on %s...\n", addr)
|
||||||
|
h := handlers.LoggingHandler(os.Stderr, r)
|
||||||
|
h = handlers.CompressHandler(h)
|
||||||
|
h = handlers.RecoveryHandler()(h)
|
||||||
|
if err := http.ListenAndServe(addr, h); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
138
cmd/web-editor/static/index.html
Normal file
138
cmd/web-editor/static/index.html
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>protoc-gen-gotemplate web editor</title>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
|
||||||
|
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.4.3/angular.js"></script>
|
||||||
|
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.4.3/angular-animate.js"></script>
|
||||||
|
<script src="//angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.13.3.js"></script>
|
||||||
|
<script src="//cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.13.3/ui-bootstrap.min.js"></script>
|
||||||
|
<script src="//cdnjs.cloudflare.com/ajax/libs/ace/1.2.0/ace.min.js"></script>
|
||||||
|
<script src="//cdnjs.cloudflare.com/ajax/libs/ace/1.2.0/mode-protobuf.js"></script>
|
||||||
|
<script src="//cdnjs.cloudflare.com/ajax/libs/ace/1.2.0/mode-golang.js"></script>
|
||||||
|
<script src="//cdnjs.cloudflare.com/ajax/libs/ace/1.2.0/theme-cobalt.js"></script>
|
||||||
|
<script src="//cdnjs.cloudflare.com/ajax/libs/ace/1.2.0/worker-javascript.js"></script>
|
||||||
|
<script src="//angular-ui.github.io/ui-ace/dist/ui-ace.min.js"></script>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f<e.length){n=e.charCodeAt(f++);r=e.charCodeAt(f++);i=e.charCodeAt(f++);s=n>>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t},decode:function(e){var t="";var n,r,i;var s,o,u,a;var f=0;e=e.replace(/[^A-Za-z0-9+/=]/g,"");while(f<e.length){s=this._keyStr.indexOf(e.charAt(f++));o=this._keyStr.indexOf(e.charAt(f++));u=this._keyStr.indexOf(e.charAt(f++));a=this._keyStr.indexOf(e.charAt(f++));n=s<<2|o>>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/rn/g,"n");var t="";for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r)}else if(r>127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n<e.length){r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r);n++}else if(r>191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}}
|
||||||
|
|
||||||
|
angular.module("pggt", ['pggt.controllers','ngAnimate','ui.bootstrap', 'ui.ace']);
|
||||||
|
angular.module("pggt.controllers", [])
|
||||||
|
.controller('PggtCtrl', ['$scope', '$http', '$interval', function($scope, $http, $interval) {
|
||||||
|
$scope.requestType = 'post';
|
||||||
|
$scope.url = '/generate';
|
||||||
|
$scope.response = null;
|
||||||
|
$scope.errors = null;
|
||||||
|
|
||||||
|
$scope.inputHasChanged = false;
|
||||||
|
|
||||||
|
$scope.checkModel = {
|
||||||
|
optimize: false,
|
||||||
|
disableNetwork: false,
|
||||||
|
toArm: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.$watchCollection('checkModel', function() {
|
||||||
|
$scope.sendRequest();
|
||||||
|
});
|
||||||
|
|
||||||
|
var cron = $interval(function() {
|
||||||
|
if ($scope.inputHasChanged) {
|
||||||
|
$scope.sendRequest();
|
||||||
|
}
|
||||||
|
}, 2000);
|
||||||
|
|
||||||
|
// b64encoded version of https://github.com/grpc/grpc-go/blob/master/examples/route_guide/routeguide/route_guide.proto
|
||||||
|
$scope.protobuf = Base64.decode("Ly8gQ29weXJpZ2h0IDIwMTUgZ1JQQyBhdXRob3JzLg0KLy8NCi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQovLw0KLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLy8NCi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KDQpzeW50YXggPSAicHJvdG8zIjsNCg0Kb3B0aW9uIGphdmFfbXVsdGlwbGVfZmlsZXMgPSB0cnVlOw0Kb3B0aW9uIGphdmFfcGFja2FnZSA9ICJpby5ncnBjLmV4YW1wbGVzLnJvdXRlZ3VpZGUiOw0Kb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIlJvdXRlR3VpZGVQcm90byI7DQoNCnBhY2thZ2Ugcm91dGVndWlkZTsNCg0KLy8gSW50ZXJmYWNlIGV4cG9ydGVkIGJ5IHRoZSBzZXJ2ZXIuDQpzZXJ2aWNlIFJvdXRlR3VpZGUgew0KICAvLyBBIHNpbXBsZSBSUEMuDQogIC8vDQogIC8vIE9idGFpbnMgdGhlIGZlYXR1cmUgYXQgYSBnaXZlbiBwb3NpdGlvbi4NCiAgLy8NCiAgLy8gQSBmZWF0dXJlIHdpdGggYW4gZW1wdHkgbmFtZSBpcyByZXR1cm5lZCBpZiB0aGVyZSdzIG5vIGZlYXR1cmUgYXQgdGhlIGdpdmVuDQogIC8vIHBvc2l0aW9uLg0KICBycGMgR2V0RmVhdHVyZShQb2ludCkgcmV0dXJucyAoRmVhdHVyZSkge30NCg0KICAvLyBBIHNlcnZlci10by1jbGllbnQgc3RyZWFtaW5nIFJQQy4NCiAgLy8NCiAgLy8gT2J0YWlucyB0aGUgRmVhdHVyZXMgYXZhaWxhYmxlIHdpdGhpbiB0aGUgZ2l2ZW4gUmVjdGFuZ2xlLiAgUmVzdWx0cyBhcmUNCiAgLy8gc3RyZWFtZWQgcmF0aGVyIHRoYW4gcmV0dXJuZWQgYXQgb25jZSAoZS5nLiBpbiBhIHJlc3BvbnNlIG1lc3NhZ2Ugd2l0aCBhDQogIC8vIHJlcGVhdGVkIGZpZWxkKSwgYXMgdGhlIHJlY3RhbmdsZSBtYXkgY292ZXIgYSBsYXJnZSBhcmVhIGFuZCBjb250YWluIGENCiAgLy8gaHVnZSBudW1iZXIgb2YgZmVhdHVyZXMuDQogIHJwYyBMaXN0RmVhdHVyZXMoUmVjdGFuZ2xlKSByZXR1cm5zIChzdHJlYW0gRmVhdHVyZSkge30NCg0KICAvLyBBIGNsaWVudC10by1zZXJ2ZXIgc3RyZWFtaW5nIFJQQy4NCiAgLy8NCiAgLy8gQWNjZXB0cyBhIHN0cmVhbSBvZiBQb2ludHMgb24gYSByb3V0ZSBiZWluZyB0cmF2ZXJzZWQsIHJldHVybmluZyBhDQogIC8vIFJvdXRlU3VtbWFyeSB3aGVuIHRyYXZlcnNhbCBpcyBjb21wbGV0ZWQuDQogIHJwYyBSZWNvcmRSb3V0ZShzdHJlYW0gUG9pbnQpIHJldHVybnMgKFJvdXRlU3VtbWFyeSkge30NCg0KICAvLyBBIEJpZGlyZWN0aW9uYWwgc3RyZWFtaW5nIFJQQy4NCiAgLy8NCiAgLy8gQWNjZXB0cyBhIHN0cmVhbSBvZiBSb3V0ZU5vdGVzIHNlbnQgd2hpbGUgYSByb3V0ZSBpcyBiZWluZyB0cmF2ZXJzZWQsDQogIC8vIHdoaWxlIHJlY2VpdmluZyBvdGhlciBSb3V0ZU5vdGVzIChlLmcuIGZyb20gb3RoZXIgdXNlcnMpLg0KICBycGMgUm91dGVDaGF0KHN0cmVhbSBSb3V0ZU5vdGUpIHJldHVybnMgKHN0cmVhbSBSb3V0ZU5vdGUpIHt9DQp9DQoNCi8vIFBvaW50cyBhcmUgcmVwcmVzZW50ZWQgYXMgbGF0aXR1ZGUtbG9uZ2l0dWRlIHBhaXJzIGluIHRoZSBFNyByZXByZXNlbnRhdGlvbg0KLy8gKGRlZ3JlZXMgbXVsdGlwbGllZCBieSAxMCoqNyBhbmQgcm91bmRlZCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyKS4NCi8vIExhdGl0dWRlcyBzaG91bGQgYmUgaW4gdGhlIHJhbmdlICsvLSA5MCBkZWdyZWVzIGFuZCBsb25naXR1ZGUgc2hvdWxkIGJlIGluDQovLyB0aGUgcmFuZ2UgKy8tIDE4MCBkZWdyZWVzIChpbmNsdXNpdmUpLg0KbWVzc2FnZSBQb2ludCB7DQogIGludDMyIGxhdGl0dWRlID0gMTsNCiAgaW50MzIgbG9uZ2l0dWRlID0gMjsNCn0NCg0KLy8gQSBsYXRpdHVkZS1sb25naXR1ZGUgcmVjdGFuZ2xlLCByZXByZXNlbnRlZCBhcyB0d28gZGlhZ29uYWxseSBvcHBvc2l0ZQ0KLy8gcG9pbnRzICJsbyIgYW5kICJoaSIuDQptZXNzYWdlIFJlY3RhbmdsZSB7DQogIC8vIE9uZSBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZS4NCiAgUG9pbnQgbG8gPSAxOw0KDQogIC8vIFRoZSBvdGhlciBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZS4NCiAgUG9pbnQgaGkgPSAyOw0KfQ0KDQovLyBBIGZlYXR1cmUgbmFtZXMgc29tZXRoaW5nIGF0IGEgZ2l2ZW4gcG9pbnQuDQovLw0KLy8gSWYgYSBmZWF0dXJlIGNvdWxkIG5vdCBiZSBuYW1lZCwgdGhlIG5hbWUgaXMgZW1wdHkuDQptZXNzYWdlIEZlYXR1cmUgew0KICAvLyBUaGUgbmFtZSBvZiB0aGUgZmVhdHVyZS4NCiAgc3RyaW5nIG5hbWUgPSAxOw0KDQogIC8vIFRoZSBwb2ludCB3aGVyZSB0aGUgZmVhdHVyZSBpcyBkZXRlY3RlZC4NCiAgUG9pbnQgbG9jYXRpb24gPSAyOw0KfQ0KDQovLyBBIFJvdXRlTm90ZSBpcyBhIG1lc3NhZ2Ugc2VudCB3aGlsZSBhdCBhIGdpdmVuIHBvaW50Lg0KbWVzc2FnZSBSb3V0ZU5vdGUgew0KICAvLyBUaGUgbG9jYXRpb24gZnJvbSB3aGljaCB0aGUgbWVzc2FnZSBpcyBzZW50Lg0KICBQb2ludCBsb2NhdGlvbiA9IDE7DQoNCiAgLy8gVGhlIG1lc3NhZ2UgdG8gYmUgc2VudC4NCiAgc3RyaW5nIG1lc3NhZ2UgPSAyOw0KfQ0KDQovLyBBIFJvdXRlU3VtbWFyeSBpcyByZWNlaXZlZCBpbiByZXNwb25zZSB0byBhIFJlY29yZFJvdXRlIHJwYy4NCi8vDQovLyBJdCBjb250YWlucyB0aGUgbnVtYmVyIG9mIGluZGl2aWR1YWwgcG9pbnRzIHJlY2VpdmVkLCB0aGUgbnVtYmVyIG9mDQovLyBkZXRlY3RlZCBmZWF0dXJlcywgYW5kIHRoZSB0b3RhbCBkaXN0YW5jZSBjb3ZlcmVkIGFzIHRoZSBjdW11bGF0aXZlIHN1bSBvZg0KLy8gdGhlIGRpc3RhbmNlIGJldHdlZW4gZWFjaCBwb2ludC4NCm1lc3NhZ2UgUm91dGVTdW1tYXJ5IHsNCiAgLy8gVGhlIG51bWJlciBvZiBwb2ludHMgcmVjZWl2ZWQuDQogIGludDMyIHBvaW50X2NvdW50ID0gMTsNCg0KICAvLyBUaGUgbnVtYmVyIG9mIGtub3duIGZlYXR1cmVzIHBhc3NlZCB3aGlsZSB0cmF2ZXJzaW5nIHRoZSByb3V0ZS4NCiAgaW50MzIgZmVhdHVyZV9jb3VudCA9IDI7DQoNCiAgLy8gVGhlIGRpc3RhbmNlIGNvdmVyZWQgaW4gbWV0cmVzLg0KICBpbnQzMiBkaXN0YW5jZSA9IDM7DQoNCiAgLy8gVGhlIGR1cmF0aW9uIG9mIHRoZSB0cmF2ZXJzYWwgaW4gc2Vjb25kcy4NCiAgaW50MzIgZWxhcHNlZF90aW1lID0gNDsNCn0=");
|
||||||
|
$scope.template = Base64.decode("Ly8gQ29kZSBnZW5lcmF0ZWQgYnkgcHJvdG9jLWdlbi1nb3RlbXBsYXRlDQpwYWNrYWdlIHt7LlNlcnZpY2UuTmFtZX19cGINCg0KaW1wb3J0ICgNCiAgImdvbGFuZy5vcmcveC9uZXQvY29udGV4dCINCikNCg0KdHlwZSBTZXJ2aWNlIGludGVyZmFjZSB7DQp7ey0gcmFuZ2UgLlNlcnZpY2UuTWV0aG9kfX0NCnt7LSBpZiBhbmQgKG5vdCAuU2VydmVyU3RyZWFtaW5nKSAobm90IC5DbGllbnRTdHJlYW1pbmcpfX0NCiAge3suTmFtZX19KGNvbnRleHQuQ29udGV4dCwgKnt7Lk5hbWV9fVJlcXVlc3QpICgqe3suTmFtZX19UmVzcG9uc2UsIGVycm9yKQ0Ke3stIGVsc2UgaWYgYW5kIC5TZXJ2ZXJTdHJlYW1pbmcgKG5vdCAuQ2xpZW50U3RyZWFtaW5nKX19DQoge3suTmFtZX19KGNvbnRleHQuQ29udGV4dCwgKnt7Lk5hbWV9fVJlcXVlc3QsIGNoYW4gc3RydWN0e30pIChjaGFuICp7ey5OYW1lfX1SZXNwb25zZSwgZXJyb3IpDQp7ey0gZWxzZSBpZiBhbmQgKG5vdCAuU2VydmVyU3RyZWFtaW5nKSAuQ2xpZW50U3RyZWFtaW5nfX0NCiAge3suTmFtZX19KGNvbnRleHQuQ29udGV4dCwgY2hhbiAqe3suTmFtZX19UmVxdWVzdCkgKCp7ey5OYW1lfX1SZXNwb25zZSwgZXJyb3IpDQp7ey0gZWxzZSBpZiBhbmQgKC5TZXJ2ZXJTdHJlYW1pbmcpICguQ2xpZW50U3RyZWFtaW5nKX19DQogIHt7Lk5hbWV9fShjb250ZXh0LkNvbnRleHQsIGNoYW4gKnt7Lk5hbWV9fVJlcXVlc3QpIChjaGFuICp7ey5OYW1lfX1SZXNwb25zZSwgZXJyb3IpDQp7ey0gZW5kfX0ge3svKiBzdHJlYW1pbmcgaWZzKi99fQ0Ke3stIGVuZH19IHt7LypyYW5nZSBNZXRob2QqL319DQp9DQoNCi8vIE1ldGhvZHMNCi8vIC0tLS0tLS0NCnt7LSByYW5nZSAuU2VydmljZS5NZXRob2R9fQ0KLy8gKiB7ey5OYW1lfX0NCnt7LSBlbmR9fQ0KLy8NCi8vIE1lc3NhZ2UgdHlwZXMNCi8vIC0tLS0tLS0tLS0tLS0NCnt7LSByYW5nZSAuRmlsZS5NZXNzYWdlVHlwZX19DQovLyAqIHt7Lk5hbWV9fQ0Ke3stIGVuZH19");
|
||||||
|
|
||||||
|
$scope.inputLoaded = function(_editor) {
|
||||||
|
$scope.inputEditor = _editor;
|
||||||
|
};
|
||||||
|
$scope.outputLoaded = function(_editor) {
|
||||||
|
$scope.outputEditor = _editor;
|
||||||
|
};
|
||||||
|
$scope.inputChanged = function(e) {
|
||||||
|
$scope.inputHasChanged = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.sendRequest = function(){
|
||||||
|
$scope.inputHasChanged = false;
|
||||||
|
var data = {
|
||||||
|
protobuf: $scope.protobuf,
|
||||||
|
template: $scope.template,
|
||||||
|
};
|
||||||
|
$http.post($scope.url, data)
|
||||||
|
.success(function(data,status,headers,config) {
|
||||||
|
$scope.errors = {};
|
||||||
|
$scope.response = {};
|
||||||
|
$scope.response.data = data;
|
||||||
|
$scope.response.status = status;
|
||||||
|
$scope.response.headers = headers;
|
||||||
|
$scope.response.config = config;
|
||||||
|
$scope.outputEditor.setValue(data['output'], 1);
|
||||||
|
})
|
||||||
|
.error(function(data,status,headers,config) {
|
||||||
|
$scope.errors = {};
|
||||||
|
$scope.response = {};
|
||||||
|
$scope.errors.data = data;
|
||||||
|
$scope.errors.status = status;
|
||||||
|
$scope.errors.headers = headers;
|
||||||
|
$scope.errors.config = config;
|
||||||
|
$scope.outputEditor.setValue(data['error'], 1);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}]);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
|
||||||
|
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/styles/github.min.css">
|
||||||
|
<style>.ace_editor { height: 80%; }</style>
|
||||||
|
</head>
|
||||||
|
<body ng-app="pggt">
|
||||||
|
<div class="container-fluid" ng-controller="PggtCtrl">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-8">
|
||||||
|
<form name="dpform" ng-submit="sendRequest()" class="well">
|
||||||
|
<fieldset>
|
||||||
|
<legend>`protoc-gen-gotemplate`: input</legend>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label for="protobuf">./example.proto</label>
|
||||||
|
<div ng-model="protobuf" name="protobuf" id="protobuf" language="protobuf"
|
||||||
|
ui-ace="{mode:'protobuf',theme:'cobalt',onChange:inputChanged,onLoad:inputLoaded,useWrapMode:true}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label for="template">./example.txt.tmpl</label>
|
||||||
|
<div ng-model="template" name="template" id="template" language="text"
|
||||||
|
ui-ace="{mode:'text',theme:'cobalt',onChange:inputChanged,onLoad:inputLoaded,useWrapMode:true}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="well">
|
||||||
|
<fieldset>
|
||||||
|
<legend>Output</legend>
|
||||||
|
<label>./example.txt</label>
|
||||||
|
<div ui-ace="{mode:'text',theme:'cobalt',onLoad:outputLoaded,useWrapMode:true}" readonly></div>
|
||||||
|
</fieldset>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<div>Command: <code>protoc --gotemplate_out=template_dir=.:. example.proto</code></div>
|
||||||
|
<div>Powered by <a href="https://moul.io/protoc-gen-gotemplate">protoc-gen-gotemplate</a></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a href="https://moul.io/protoc-gen-gotemplate"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://camo.githubusercontent.com/365986a132ccd6a44c23a9169022c0b5c890c387/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f7265645f6161303030302e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png"></a>
|
||||||
|
</body>
|
||||||
|
</html>
|
38
encoder.go
38
encoder.go
@@ -3,6 +3,7 @@ package main
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"log"
|
"log"
|
||||||
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -10,7 +11,9 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/golang/protobuf/protoc-gen-go/descriptor"
|
"github.com/golang/protobuf/protoc-gen-go/descriptor"
|
||||||
"github.com/golang/protobuf/protoc-gen-go/plugin"
|
plugin_go "github.com/golang/protobuf/protoc-gen-go/plugin"
|
||||||
|
|
||||||
|
pgghelpers "moul.io/protoc-gen-gotemplate/helpers"
|
||||||
)
|
)
|
||||||
|
|
||||||
type GenericTemplateBasedEncoder struct {
|
type GenericTemplateBasedEncoder struct {
|
||||||
@@ -50,6 +53,7 @@ func NewGenericServiceTemplateBasedEncoder(templateDir string, service *descript
|
|||||||
if debug {
|
if debug {
|
||||||
log.Printf("new encoder: file=%q service=%q template-dir=%q", file.GetName(), service.GetName(), templateDir)
|
log.Printf("new encoder: file=%q service=%q template-dir=%q", file.GetName(), service.GetName(), templateDir)
|
||||||
}
|
}
|
||||||
|
pgghelpers.InitPathMap(file)
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -66,6 +70,7 @@ func NewGenericTemplateBasedEncoder(templateDir string, file *descriptor.FileDes
|
|||||||
if debug {
|
if debug {
|
||||||
log.Printf("new encoder: file=%q template-dir=%q", file.GetName(), templateDir)
|
log.Printf("new encoder: file=%q template-dir=%q", file.GetName(), templateDir)
|
||||||
}
|
}
|
||||||
|
pgghelpers.InitPathMap(file)
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -90,6 +95,7 @@ func (e *GenericTemplateBasedEncoder) templates() ([]string, error) {
|
|||||||
if e.debug {
|
if e.debug {
|
||||||
log.Printf("new template: %q", rel)
|
log.Printf("new template: %q", rel)
|
||||||
}
|
}
|
||||||
|
|
||||||
filenames = append(filenames, rel)
|
filenames = append(filenames, rel)
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
@@ -98,11 +104,20 @@ func (e *GenericTemplateBasedEncoder) templates() ([]string, error) {
|
|||||||
|
|
||||||
func (e *GenericTemplateBasedEncoder) genAst(templateFilename string) (*Ast, error) {
|
func (e *GenericTemplateBasedEncoder) genAst(templateFilename string) (*Ast, error) {
|
||||||
// prepare the ast passed to the template engine
|
// prepare the ast passed to the template engine
|
||||||
hostname, _ := os.Hostname()
|
hostname, err := os.Hostname()
|
||||||
pwd, _ := os.Getwd()
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
pwd, err := os.Getwd()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
goPwd := ""
|
goPwd := ""
|
||||||
if os.Getenv("GOPATH") != "" {
|
if os.Getenv("GOPATH") != "" {
|
||||||
goPwd, _ = filepath.Rel(os.Getenv("GOPATH")+"/src", pwd)
|
goPwd, err = filepath.Rel(os.Getenv("GOPATH")+"/src", pwd)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
if strings.Contains(goPwd, "../") {
|
if strings.Contains(goPwd, "../") {
|
||||||
goPwd = ""
|
goPwd = ""
|
||||||
}
|
}
|
||||||
@@ -122,7 +137,15 @@ func (e *GenericTemplateBasedEncoder) genAst(templateFilename string) (*Ast, err
|
|||||||
Enum: e.enum,
|
Enum: e.enum,
|
||||||
}
|
}
|
||||||
buffer := new(bytes.Buffer)
|
buffer := new(bytes.Buffer)
|
||||||
tmpl, err := template.New("").Funcs(ProtoHelpersFuncMap).Parse(templateFilename)
|
|
||||||
|
unescaped, err := url.QueryUnescape(templateFilename)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("failed to unescape filepath %q: %v", templateFilename, err)
|
||||||
|
} else {
|
||||||
|
templateFilename = unescaped
|
||||||
|
}
|
||||||
|
|
||||||
|
tmpl, err := template.New("").Funcs(pgghelpers.ProtoHelpersFuncMap).Parse(templateFilename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -137,7 +160,7 @@ func (e *GenericTemplateBasedEncoder) buildContent(templateFilename string) (str
|
|||||||
// initialize template engine
|
// initialize template engine
|
||||||
fullPath := filepath.Join(e.templateDir, templateFilename)
|
fullPath := filepath.Join(e.templateDir, templateFilename)
|
||||||
templateName := filepath.Base(fullPath)
|
templateName := filepath.Base(fullPath)
|
||||||
tmpl, err := template.New(templateName).Funcs(ProtoHelpersFuncMap).ParseFiles(fullPath)
|
tmpl, err := template.New(templateName).Funcs(pgghelpers.ProtoHelpersFuncMap).ParseFiles(fullPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", "", err
|
return "", "", err
|
||||||
}
|
}
|
||||||
@@ -168,7 +191,8 @@ func (e *GenericTemplateBasedEncoder) Files() []*plugin_go.CodeGeneratorResponse
|
|||||||
resultChan := make(chan *plugin_go.CodeGeneratorResponse_File, length)
|
resultChan := make(chan *plugin_go.CodeGeneratorResponse_File, length)
|
||||||
for _, templateFilename := range templates {
|
for _, templateFilename := range templates {
|
||||||
go func(tmpl string) {
|
go func(tmpl string) {
|
||||||
content, translatedFilename, err := e.buildContent(tmpl)
|
var translatedFilename, content string
|
||||||
|
content, translatedFilename, err = e.buildContent(tmpl)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errChan <- err
|
errChan <- err
|
||||||
return
|
return
|
||||||
|
13
examples/arithmetics/Makefile
Normal file
13
examples/arithmetics/Makefile
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
.PHONY: build
|
||||||
|
build:
|
||||||
|
mkdir -p output
|
||||||
|
protoc -I. --gotemplate_out=template_dir=templates,debug=true,all=true:output proto/*.proto
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: re
|
||||||
|
re: clean build
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
rm -rf output
|
5
examples/arithmetics/output/arithmetics
Normal file
5
examples/arithmetics/output/arithmetics
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
|
||||||
|
add(1,2) = 3
|
||||||
|
subtract(1,2) = -1
|
||||||
|
multiply(1,2) = 2
|
||||||
|
divide(2,1) = 2
|
2
examples/arithmetics/proto/arithmetics.proto
Normal file
2
examples/arithmetics/proto/arithmetics.proto
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
package Arithmetics;
|
6
examples/arithmetics/templates/arithmetics.tmpl
Normal file
6
examples/arithmetics/templates/arithmetics.tmpl
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{{with $a := 1}}{{with $b := 2}}
|
||||||
|
add(1,2) = {{add $a $b}}
|
||||||
|
subtract(1,2) = {{subtract $a $b}}
|
||||||
|
multiply(1,2) = {{multiply $a $b}}
|
||||||
|
divide(2,1) = {{divide $b $a}}
|
||||||
|
{{end}}{{end}}
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"build-date": "2017-05-02T11:50:25.063291628+02:00",
|
"build-date": "2017-05-19T20:09:45.954357761+02:00",
|
||||||
"build-hostname": "manfred-spacegray.local",
|
"build-hostname": "manfred-spacegray.aircard",
|
||||||
"build-user": "moul",
|
"build-user": "moul",
|
||||||
"pwd": "/Users/moul/Git/moul/protoc-gen-gotemplate/examples/dummy",
|
"pwd": "/Users/moul/Git/moul/protoc-gen-gotemplate/examples/dummy",
|
||||||
"debug": false,
|
"debug": false,
|
||||||
@@ -839,5 +839,6 @@
|
|||||||
"options": {}
|
"options": {}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
},
|
||||||
|
"enum": null
|
||||||
}
|
}
|
@@ -1,4 +1,4 @@
|
|||||||
package: github.com/moul/protoc-gen-gotemplate/examples/go-kit
|
package: moul.io/protoc-gen-gotemplate/examples/go-kit
|
||||||
import:
|
import:
|
||||||
- package: github.com/go-kit/kit
|
- package: github.com/go-kit/kit
|
||||||
subpackages:
|
subpackages:
|
||||||
|
@@ -12,23 +12,23 @@ import (
|
|||||||
"github.com/gorilla/handlers"
|
"github.com/gorilla/handlers"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
|
|
||||||
session_svc "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/session"
|
session_svc "moul.io/protoc-gen-gotemplate/examples/go-kit/services/session"
|
||||||
session_endpoints "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/session/gen/endpoints"
|
session_endpoints "moul.io/protoc-gen-gotemplate/examples/go-kit/services/session/gen/endpoints"
|
||||||
session_pb "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/session/gen/pb"
|
session_pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/session/gen/pb"
|
||||||
session_grpctransport "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/session/gen/transports/grpc"
|
session_grpctransport "moul.io/protoc-gen-gotemplate/examples/go-kit/services/session/gen/transports/grpc"
|
||||||
session_httptransport "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/session/gen/transports/http"
|
session_httptransport "moul.io/protoc-gen-gotemplate/examples/go-kit/services/session/gen/transports/http"
|
||||||
|
|
||||||
sprint_svc "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/sprint"
|
sprint_svc "moul.io/protoc-gen-gotemplate/examples/go-kit/services/sprint"
|
||||||
sprint_endpoints "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/endpoints"
|
sprint_endpoints "moul.io/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/endpoints"
|
||||||
sprint_pb "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/pb"
|
sprint_pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/pb"
|
||||||
sprint_grpctransport "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/transports/grpc"
|
sprint_grpctransport "moul.io/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/transports/grpc"
|
||||||
sprint_httptransport "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/transports/http"
|
sprint_httptransport "moul.io/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/transports/http"
|
||||||
|
|
||||||
user_svc "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/user"
|
user_svc "moul.io/protoc-gen-gotemplate/examples/go-kit/services/user"
|
||||||
user_endpoints "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/user/gen/endpoints"
|
user_endpoints "moul.io/protoc-gen-gotemplate/examples/go-kit/services/user/gen/endpoints"
|
||||||
user_pb "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/user/gen/pb"
|
user_pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/user/gen/pb"
|
||||||
user_grpctransport "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/user/gen/transports/grpc"
|
user_grpctransport "moul.io/protoc-gen-gotemplate/examples/go-kit/services/user/gen/transports/grpc"
|
||||||
user_httptransport "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/user/gen/transports/http"
|
user_httptransport "moul.io/protoc-gen-gotemplate/examples/go-kit/services/user/gen/transports/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
@@ -9,8 +9,8 @@ import (
|
|||||||
grpctransport "github.com/go-kit/kit/transport/grpc"
|
grpctransport "github.com/go-kit/kit/transport/grpc"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
|
|
||||||
endpoints "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/session/gen/endpoints"
|
endpoints "moul.io/protoc-gen-gotemplate/examples/go-kit/services/session/gen/endpoints"
|
||||||
pb "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/session/gen/pb"
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/session/gen/pb"
|
||||||
)
|
)
|
||||||
|
|
||||||
func New(conn *grpc.ClientConn, logger log.Logger) pb.SessionServiceServer {
|
func New(conn *grpc.ClientConn, logger log.Logger) pb.SessionServiceServer {
|
||||||
|
@@ -5,8 +5,8 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/go-kit/kit/endpoint"
|
"github.com/go-kit/kit/endpoint"
|
||||||
pb "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/session/gen/pb"
|
|
||||||
oldcontext "golang.org/x/net/context"
|
oldcontext "golang.org/x/net/context"
|
||||||
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/session/gen/pb"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ = endpoint.Chain
|
var _ = endpoint.Chain
|
||||||
|
@@ -7,8 +7,8 @@ import (
|
|||||||
grpctransport "github.com/go-kit/kit/transport/grpc"
|
grpctransport "github.com/go-kit/kit/transport/grpc"
|
||||||
oldcontext "golang.org/x/net/context"
|
oldcontext "golang.org/x/net/context"
|
||||||
|
|
||||||
endpoints "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/session/gen/endpoints"
|
endpoints "moul.io/protoc-gen-gotemplate/examples/go-kit/services/session/gen/endpoints"
|
||||||
pb "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/session/gen/pb"
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/session/gen/pb"
|
||||||
)
|
)
|
||||||
|
|
||||||
// avoid import errors
|
// avoid import errors
|
||||||
|
@@ -8,8 +8,8 @@ import (
|
|||||||
|
|
||||||
gokit_endpoint "github.com/go-kit/kit/endpoint"
|
gokit_endpoint "github.com/go-kit/kit/endpoint"
|
||||||
httptransport "github.com/go-kit/kit/transport/http"
|
httptransport "github.com/go-kit/kit/transport/http"
|
||||||
endpoints "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/session/gen/endpoints"
|
endpoints "moul.io/protoc-gen-gotemplate/examples/go-kit/services/session/gen/endpoints"
|
||||||
pb "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/session/gen/pb"
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/session/gen/pb"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ = log.Printf
|
var _ = log.Printf
|
||||||
|
@@ -5,7 +5,7 @@ import (
|
|||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
|
||||||
pb "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/session/gen/pb"
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/session/gen/pb"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Service struct{}
|
type Service struct{}
|
||||||
|
@@ -9,8 +9,8 @@ import (
|
|||||||
grpctransport "github.com/go-kit/kit/transport/grpc"
|
grpctransport "github.com/go-kit/kit/transport/grpc"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
|
|
||||||
endpoints "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/endpoints"
|
endpoints "moul.io/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/endpoints"
|
||||||
pb "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/pb"
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/pb"
|
||||||
)
|
)
|
||||||
|
|
||||||
func New(conn *grpc.ClientConn, logger log.Logger) pb.SprintServiceServer {
|
func New(conn *grpc.ClientConn, logger log.Logger) pb.SprintServiceServer {
|
||||||
|
@@ -5,8 +5,8 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/go-kit/kit/endpoint"
|
"github.com/go-kit/kit/endpoint"
|
||||||
pb "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/pb"
|
|
||||||
oldcontext "golang.org/x/net/context"
|
oldcontext "golang.org/x/net/context"
|
||||||
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/pb"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ = endpoint.Chain
|
var _ = endpoint.Chain
|
||||||
|
@@ -7,8 +7,8 @@ import (
|
|||||||
grpctransport "github.com/go-kit/kit/transport/grpc"
|
grpctransport "github.com/go-kit/kit/transport/grpc"
|
||||||
oldcontext "golang.org/x/net/context"
|
oldcontext "golang.org/x/net/context"
|
||||||
|
|
||||||
endpoints "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/endpoints"
|
endpoints "moul.io/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/endpoints"
|
||||||
pb "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/pb"
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/pb"
|
||||||
)
|
)
|
||||||
|
|
||||||
// avoid import errors
|
// avoid import errors
|
||||||
|
@@ -8,8 +8,8 @@ import (
|
|||||||
|
|
||||||
gokit_endpoint "github.com/go-kit/kit/endpoint"
|
gokit_endpoint "github.com/go-kit/kit/endpoint"
|
||||||
httptransport "github.com/go-kit/kit/transport/http"
|
httptransport "github.com/go-kit/kit/transport/http"
|
||||||
endpoints "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/endpoints"
|
endpoints "moul.io/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/endpoints"
|
||||||
pb "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/pb"
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/pb"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ = log.Printf
|
var _ = log.Printf
|
||||||
|
@@ -5,7 +5,7 @@ import (
|
|||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
|
||||||
pb "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/pb"
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/pb"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Service struct{}
|
type Service struct{}
|
||||||
|
@@ -9,8 +9,8 @@ import (
|
|||||||
grpctransport "github.com/go-kit/kit/transport/grpc"
|
grpctransport "github.com/go-kit/kit/transport/grpc"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
|
|
||||||
endpoints "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/user/gen/endpoints"
|
endpoints "moul.io/protoc-gen-gotemplate/examples/go-kit/services/user/gen/endpoints"
|
||||||
pb "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/user/gen/pb"
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/user/gen/pb"
|
||||||
)
|
)
|
||||||
|
|
||||||
func New(conn *grpc.ClientConn, logger log.Logger) pb.UserServiceServer {
|
func New(conn *grpc.ClientConn, logger log.Logger) pb.UserServiceServer {
|
||||||
|
@@ -5,8 +5,8 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/go-kit/kit/endpoint"
|
"github.com/go-kit/kit/endpoint"
|
||||||
pb "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/user/gen/pb"
|
|
||||||
oldcontext "golang.org/x/net/context"
|
oldcontext "golang.org/x/net/context"
|
||||||
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/user/gen/pb"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ = endpoint.Chain
|
var _ = endpoint.Chain
|
||||||
|
@@ -7,8 +7,8 @@ import (
|
|||||||
grpctransport "github.com/go-kit/kit/transport/grpc"
|
grpctransport "github.com/go-kit/kit/transport/grpc"
|
||||||
oldcontext "golang.org/x/net/context"
|
oldcontext "golang.org/x/net/context"
|
||||||
|
|
||||||
endpoints "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/user/gen/endpoints"
|
endpoints "moul.io/protoc-gen-gotemplate/examples/go-kit/services/user/gen/endpoints"
|
||||||
pb "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/user/gen/pb"
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/user/gen/pb"
|
||||||
)
|
)
|
||||||
|
|
||||||
// avoid import errors
|
// avoid import errors
|
||||||
|
@@ -8,8 +8,8 @@ import (
|
|||||||
|
|
||||||
gokit_endpoint "github.com/go-kit/kit/endpoint"
|
gokit_endpoint "github.com/go-kit/kit/endpoint"
|
||||||
httptransport "github.com/go-kit/kit/transport/http"
|
httptransport "github.com/go-kit/kit/transport/http"
|
||||||
endpoints "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/user/gen/endpoints"
|
endpoints "moul.io/protoc-gen-gotemplate/examples/go-kit/services/user/gen/endpoints"
|
||||||
pb "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/user/gen/pb"
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/user/gen/pb"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ = log.Printf
|
var _ = log.Printf
|
||||||
|
@@ -5,7 +5,7 @@ import (
|
|||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
|
||||||
pb "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/user/gen/pb"
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/user/gen/pb"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Service struct{}
|
type Service struct{}
|
||||||
|
0
examples/go.mod
Normal file
0
examples/go.mod
Normal file
13
examples/helpers/Makefile
Normal file
13
examples/helpers/Makefile
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
.PHONY: build
|
||||||
|
build:
|
||||||
|
mkdir -p output
|
||||||
|
protoc -I. --gotemplate_out=template_dir=.,debug=true:. *.proto
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: re
|
||||||
|
re: clean build
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
rm -rf output
|
58
examples/helpers/example.txt
Normal file
58
examples/helpers/example.txt
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
# Common variables
|
||||||
|
{{.File.Name}}: helpers.proto
|
||||||
|
{{.File.Name | upper}}: HELPERS.PROTO
|
||||||
|
{{.File.Package | base | replace "." "-"}} dummy
|
||||||
|
{{$packageDir := .File.Name | dir}}{{$packageDir}} .
|
||||||
|
{{$packageName := .File.Name | base | replace ".proto" ""}}{{$packageName}} helpers
|
||||||
|
{{$packageImport := .File.Package | replace "." "_"}}{{$packageImport}} dummy
|
||||||
|
{{$namespacedPackage := .File.Package}}{{$namespacedPackage}} dummy
|
||||||
|
{{$currentFile := .File.Name | getProtoFile}}{{$currentFile}} <nil>
|
||||||
|
{{- /*{{- $currentPackageName := $currentFile.GoPkg.Name}}{{$currentPackageName}}*/}}
|
||||||
|
# TODO: more variables
|
||||||
|
|
||||||
|
# Sprig: strings
|
||||||
|
{{trim " hello "}}: hello
|
||||||
|
{{trimAll "$" "$5.00"}}: 5.00
|
||||||
|
{{trimSuffix "-" "hello-"}}: hello
|
||||||
|
{{upper "hello"}}: HELLO
|
||||||
|
{{lower "HELLO"}}: hello
|
||||||
|
{{title "hello world"}}: Hello World
|
||||||
|
{{untitle "Hello World"}}: hello world
|
||||||
|
{{repeat 3 "hello"}}: hellohellohello
|
||||||
|
{{substr 0 5 "hello world"}}: hello
|
||||||
|
{{nospace "hello w o r l d"}}: helloworld
|
||||||
|
{{trunc 5 "hello world"}}: hello
|
||||||
|
{{abbrev 5 "hello world"}}: he...
|
||||||
|
{{abbrevboth 5 10 "1234 5678 9123"}}: ...5678...
|
||||||
|
{{initials "First Try"}}: FT
|
||||||
|
{{randNumeric 3}}: 528
|
||||||
|
{{- /*{{wrap 80 $someText}}*/}}:
|
||||||
|
{{wrapWith 5 "\t" "Hello World"}}: Hello World
|
||||||
|
{{contains "cat" "catch"}}: true
|
||||||
|
{{hasPrefix "cat" "catch"}}: true
|
||||||
|
{{cat "hello" "beautiful" "world"}}: hello beautiful world
|
||||||
|
{{- /*{{indent 4 $lots_of_text}}*/}}:
|
||||||
|
{{- /*{{indent 4 $lots_of_text}}*/}}:
|
||||||
|
{{"I Am Henry VIII" | replace " " "-"}}: I-Am-Henry-VIII
|
||||||
|
{{len .Service.Method | plural "one anchovy" "many anchovies"}}: many anchovies
|
||||||
|
{{snakecase "FirstName"}}: first_name
|
||||||
|
{{camelcase "http_server"}}: HttpServer
|
||||||
|
{{shuffle "hello"}}: holle
|
||||||
|
{{regexMatch "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}" "test@acme.com"}}: true
|
||||||
|
{{- /*{{regexFindAll "[2,4,6,8]" "123456789"}}*/}}:
|
||||||
|
{{regexFind "[a-zA-Z][1-9]" "abcd1234"}}: d1
|
||||||
|
{{regexReplaceAll "a(x*)b" "-ab-axxb-" "${1}W"}}: -W-xxW-
|
||||||
|
{{regexReplaceAllLiteral "a(x*)b" "-ab-axxb-" "${1}"}}: -${1}-${1}-
|
||||||
|
{{regexSplit "z+" "pizza" -1}}: [pi a]
|
||||||
|
|
||||||
|
# Get one specific method on array method using index
|
||||||
|
{{ index .Service.Method 1 }}: name:"Iii" input_type:".dummy.Dummy2" output_type:".dummy.Dummy1" options:<>
|
||||||
|
|
||||||
|
# Sprig: advanced
|
||||||
|
{{if contains "cat" "catch"}}yes{{else}}no{{end}}: yes
|
||||||
|
{{1 | plural "one anchovy" "many anchovies"}}: one anchovy
|
||||||
|
{{2 | plural "one anchovy" "many anchovies"}}: many anchovies
|
||||||
|
{{3 | plural "one anchovy" "many anchovies"}}: many anchovies
|
||||||
|
|
||||||
|
# TODO: more sprig examples
|
||||||
|
# TODO: all built-in examples
|
59
examples/helpers/example.txt.tmpl
Normal file
59
examples/helpers/example.txt.tmpl
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
# Common variables
|
||||||
|
{{`{{.File.Name}}`}}: {{.File.Name}}
|
||||||
|
{{`{{.File.Name | upper}}`}}: {{.File.Name | upper}}
|
||||||
|
{{`{{.File.Package | base | replace "." "-"}}`}} {{.File.Package | base | replace "." "-"}}
|
||||||
|
{{- /*{{`{{$file := .File}}{{$file}}`}} {{$file := .File}}{{$file}}*/}}
|
||||||
|
{{`{{$packageDir := .File.Name | dir}}{{$packageDir}}`}} {{$packageDir := .File.Name | dir}}{{$packageDir}}
|
||||||
|
{{`{{$packageName := .File.Name | base | replace ".proto" ""}}{{$packageName}}`}} {{$packageName := .File.Name | base | replace ".proto" ""}}{{$packageName}}
|
||||||
|
{{`{{$packageImport := .File.Package | replace "." "_"}}{{$packageImport}}`}} {{$packageImport := .File.Package | replace "." "_"}}{{$packageImport}}
|
||||||
|
{{`{{$namespacedPackage := .File.Package}}{{$namespacedPackage}}`}} {{$namespacedPackage := .File.Package}}{{$namespacedPackage}}
|
||||||
|
{{`{{$currentFile := .File.Name | getProtoFile}}{{$currentFile}}`}} {{$currentFile := .File.Name | getProtoFile}}{{$currentFile}}
|
||||||
|
{{`{{- /*{{- $currentPackageName := $currentFile.GoPkg.Name}}{{$currentPackageName}}*/}}`}} {{- /*{{- $currentPackageName := $currentFile.GoPkg.Name}}{{$currentPackageName}}*/}}
|
||||||
|
# TODO: more variables
|
||||||
|
|
||||||
|
# Sprig: strings
|
||||||
|
{{`{{trim " hello "}}`}}: {{trim " hello "}}
|
||||||
|
{{`{{trimAll "$" "$5.00"}}`}}: {{trimAll "$" "$5.00"}}
|
||||||
|
{{`{{trimSuffix "-" "hello-"}}`}}: {{trimSuffix "-" "hello-"}}
|
||||||
|
{{`{{upper "hello"}}`}}: {{upper "hello"}}
|
||||||
|
{{`{{lower "HELLO"}}`}}: {{lower "HELLO"}}
|
||||||
|
{{`{{title "hello world"}}`}}: {{title "hello world"}}
|
||||||
|
{{`{{untitle "Hello World"}}`}}: {{untitle "Hello World"}}
|
||||||
|
{{`{{repeat 3 "hello"}}`}}: {{repeat 3 "hello"}}
|
||||||
|
{{`{{substr 0 5 "hello world"}}`}}: {{substr 0 5 "hello world"}}
|
||||||
|
{{`{{nospace "hello w o r l d"}}`}}: {{nospace "hello w o r l d"}}
|
||||||
|
{{`{{trunc 5 "hello world"}}`}}: {{trunc 5 "hello world"}}
|
||||||
|
{{`{{abbrev 5 "hello world"}}`}}: {{abbrev 5 "hello world"}}
|
||||||
|
{{`{{abbrevboth 5 10 "1234 5678 9123"}}`}}: {{abbrevboth 5 10 "1234 5678 9123"}}
|
||||||
|
{{`{{initials "First Try"}}`}}: {{initials "First Try"}}
|
||||||
|
{{`{{randNumeric 3}}`}}: {{randNumeric 3}}
|
||||||
|
{{`{{- /*{{wrap 80 $someText}}*/}}`}}: {{- /*{{wrap 80 $someText}}*/}}
|
||||||
|
{{`{{wrapWith 5 "\t" "Hello World"}}`}}: {{wrapWith 5 "\t" "Hello World"}}
|
||||||
|
{{`{{contains "cat" "catch"}}`}}: {{contains "cat" "catch"}}
|
||||||
|
{{`{{hasPrefix "cat" "catch"}}`}}: {{hasPrefix "cat" "catch"}}
|
||||||
|
{{`{{cat "hello" "beautiful" "world"}}`}}: {{cat "hello" "beautiful" "world"}}
|
||||||
|
{{`{{- /*{{indent 4 $lots_of_text}}*/}}`}}: {{- /*{{indent 4 $lots_of_text}}*/}}
|
||||||
|
{{`{{- /*{{indent 4 $lots_of_text}}*/}}`}}: {{- /*{{indent 4 $lots_of_text}}*/}}
|
||||||
|
{{`{{"I Am Henry VIII" | replace " " "-"}}`}}: {{"I Am Henry VIII" | replace " " "-"}}
|
||||||
|
{{`{{len .Service.Method | plural "one anchovy" "many anchovies"}}`}}: {{len .Service.Method | plural "one anchovy" "many anchovies"}}
|
||||||
|
{{`{{snakecase "FirstName"}}`}}: {{snakecase "FirstName"}}
|
||||||
|
{{`{{camelcase "http_server"}}`}}: {{camelcase "http_server"}}
|
||||||
|
{{`{{shuffle "hello"}}`}}: {{shuffle "hello"}}
|
||||||
|
{{`{{regexMatch "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}" "test@acme.com"}}`}}: {{regexMatch "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}" "test@acme.com"}}
|
||||||
|
{{`{{- /*{{regexFindAll "[2,4,6,8]" "123456789"}}*/}}`}}: {{- /*{{regexFindAll "[2,4,6,8]" "123456789"}}*/}}
|
||||||
|
{{`{{regexFind "[a-zA-Z][1-9]" "abcd1234"}}`}}: {{regexFind "[a-zA-Z][1-9]" "abcd1234"}}
|
||||||
|
{{`{{regexReplaceAll "a(x*)b" "-ab-axxb-" "${1}W"}}`}}: {{regexReplaceAll "a(x*)b" "-ab-axxb-" "${1}W"}}
|
||||||
|
{{`{{regexReplaceAllLiteral "a(x*)b" "-ab-axxb-" "${1}"}}`}}: {{regexReplaceAllLiteral "a(x*)b" "-ab-axxb-" "${1}"}}
|
||||||
|
{{`{{regexSplit "z+" "pizza" -1}}`}}: {{regexSplit "z+" "pizza" -1}}
|
||||||
|
|
||||||
|
# Get one specific method on array method using index
|
||||||
|
{{`{{ index .Service.Method 1 }}`}}: {{ index .Service.Method 1 }}
|
||||||
|
|
||||||
|
# Sprig: advanced
|
||||||
|
{{`{{if contains "cat" "catch"}}yes{{else}}no{{end}}`}}: {{if contains "cat" "catch"}}yes{{else}}no{{end}}
|
||||||
|
{{`{{1 | plural "one anchovy" "many anchovies"}}`}}: {{1 | plural "one anchovy" "many anchovies"}}
|
||||||
|
{{`{{2 | plural "one anchovy" "many anchovies"}}`}}: {{2 | plural "one anchovy" "many anchovies"}}
|
||||||
|
{{`{{3 | plural "one anchovy" "many anchovies"}}`}}: {{3 | plural "one anchovy" "many anchovies"}}
|
||||||
|
|
||||||
|
# TODO: more sprig examples
|
||||||
|
# TODO: all built-in examples
|
25
examples/helpers/helpers.proto
Normal file
25
examples/helpers/helpers.proto
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package dummy;
|
||||||
|
|
||||||
|
option go_package = "moul.io/protoc-gen-gotemplate/examples/helpers";
|
||||||
|
|
||||||
|
message Dummy1 {
|
||||||
|
float aaa = 1;
|
||||||
|
string bbb = 2;
|
||||||
|
int32 ccc = 3;
|
||||||
|
int64 ddd = 4;
|
||||||
|
repeated string eee = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
message Dummy2 {
|
||||||
|
float fff = 1;
|
||||||
|
Dummy1 ggg = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message Dummy3 {}
|
||||||
|
|
||||||
|
service DummyService {
|
||||||
|
rpc Hhh(Dummy1) returns (Dummy2) {}
|
||||||
|
rpc Iii(Dummy2) returns (Dummy1) {}
|
||||||
|
}
|
@@ -3,7 +3,7 @@ build:
|
|||||||
mkdir -p output
|
mkdir -p output
|
||||||
|
|
||||||
# generate pb.go inluding imported proto
|
# generate pb.go inluding imported proto
|
||||||
protoc --go_out=Mproto/common.proto=github.com/moul/protoc-gen-gotemplate/examples/import/output/models/common:./output proto/article.proto
|
protoc --go_out=Mproto/common.proto=moul.io/protoc-gen-gotemplate/examples/import/output/models/common:./output proto/article.proto
|
||||||
protoc --go_out=,plugins=grpc:./output proto/common.proto
|
protoc --go_out=,plugins=grpc:./output proto/common.proto
|
||||||
|
|
||||||
# build our go file based on our template
|
# build our go file based on our template
|
||||||
|
@@ -1,6 +1,5 @@
|
|||||||
// Code generated by protoc-gen-go.
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
// source: proto/article.proto
|
// source: proto/article.proto
|
||||||
// DO NOT EDIT!
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Package article is a generated protocol buffer package.
|
Package article is a generated protocol buffer package.
|
||||||
@@ -18,7 +17,7 @@ package article
|
|||||||
import proto "github.com/golang/protobuf/proto"
|
import proto "github.com/golang/protobuf/proto"
|
||||||
import fmt "fmt"
|
import fmt "fmt"
|
||||||
import math "math"
|
import math "math"
|
||||||
import common "github.com/moul/protoc-gen-gotemplate/examples/import/output/models/common"
|
import common "moul.io/protoc-gen-gotemplate/examples/import/output/models/common"
|
||||||
|
|
||||||
// Reference imports to suppress errors if they are not otherwise used.
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
var _ = proto.Marshal
|
var _ = proto.Marshal
|
||||||
@@ -49,6 +48,8 @@ func (m *GetArticleRequest) GetGetarticle() *common.GetArticle {
|
|||||||
|
|
||||||
type GetArticleResponse struct {
|
type GetArticleResponse struct {
|
||||||
Article *Article `protobuf:"bytes,1,opt,name=article" json:"article,omitempty"`
|
Article *Article `protobuf:"bytes,1,opt,name=article" json:"article,omitempty"`
|
||||||
|
// The generated output should write []*GetArticleResponse_Storage.Storage for this field.
|
||||||
|
Storages []*GetArticleResponse_Storage `protobuf:"bytes,2,rep,name=storages" json:"storages,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *GetArticleResponse) Reset() { *m = GetArticleResponse{} }
|
func (m *GetArticleResponse) Reset() { *m = GetArticleResponse{} }
|
||||||
@@ -63,6 +64,29 @@ func (m *GetArticleResponse) GetArticle() *Article {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *GetArticleResponse) GetStorages() []*GetArticleResponse_Storage {
|
||||||
|
if m != nil {
|
||||||
|
return m.Storages
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetArticleResponse_Storage struct {
|
||||||
|
Code string `protobuf:"bytes,1,opt,name=code" json:"code,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *GetArticleResponse_Storage) Reset() { *m = GetArticleResponse_Storage{} }
|
||||||
|
func (m *GetArticleResponse_Storage) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*GetArticleResponse_Storage) ProtoMessage() {}
|
||||||
|
func (*GetArticleResponse_Storage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1, 0} }
|
||||||
|
|
||||||
|
func (m *GetArticleResponse_Storage) GetCode() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.Code
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
type Article struct {
|
type Article struct {
|
||||||
Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
|
Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
|
||||||
Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"`
|
Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"`
|
||||||
@@ -88,26 +112,30 @@ func (m *Article) GetName() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
proto.RegisterType((*GetArticleRequest)(nil), "article.GetArticleRequest")
|
proto.RegisterType((*GetArticleRequest)(nil), "company.GetArticleRequest")
|
||||||
proto.RegisterType((*GetArticleResponse)(nil), "article.GetArticleResponse")
|
proto.RegisterType((*GetArticleResponse)(nil), "company.GetArticleResponse")
|
||||||
proto.RegisterType((*Article)(nil), "article.Article")
|
proto.RegisterType((*GetArticleResponse_Storage)(nil), "company.GetArticleResponse.Storage")
|
||||||
|
proto.RegisterType((*Article)(nil), "company.Article")
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() { proto.RegisterFile("proto/article.proto", fileDescriptor0) }
|
func init() { proto.RegisterFile("proto/article.proto", fileDescriptor0) }
|
||||||
|
|
||||||
var fileDescriptor0 = []byte{
|
var fileDescriptor0 = []byte{
|
||||||
// 208 bytes of a gzipped FileDescriptorProto
|
// 256 bytes of a gzipped FileDescriptorProto
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x2e, 0x28, 0xca, 0x2f,
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0x41, 0x4b, 0xc4, 0x30,
|
||||||
0xc9, 0xd7, 0x4f, 0x2c, 0x2a, 0xc9, 0x4c, 0xce, 0x49, 0xd5, 0x03, 0xf3, 0x84, 0xd8, 0xa1, 0x5c,
|
0x10, 0x85, 0x6d, 0x15, 0xab, 0xb3, 0x20, 0x3a, 0x82, 0x94, 0x8a, 0xb0, 0xd4, 0xcb, 0x22, 0x18,
|
||||||
0x29, 0x21, 0x88, 0x6c, 0x72, 0x7e, 0x6e, 0x6e, 0x7e, 0x1e, 0x44, 0x52, 0xc9, 0x9d, 0x4b, 0xd0,
|
0xa1, 0x1e, 0x3d, 0x88, 0x5e, 0x7a, 0xaf, 0x78, 0xf1, 0x56, 0xd3, 0x61, 0x29, 0x6c, 0x3a, 0xb5,
|
||||||
0x3d, 0xb5, 0xc4, 0x11, 0xa2, 0x22, 0x28, 0xb5, 0xb0, 0x34, 0xb5, 0xb8, 0x44, 0xc8, 0x88, 0x8b,
|
0x89, 0x82, 0xff, 0xc6, 0x9f, 0x2a, 0x9b, 0x4c, 0xd7, 0x8a, 0xb2, 0xa7, 0x4e, 0xf3, 0xbe, 0xf7,
|
||||||
0x2b, 0x3d, 0xb5, 0x04, 0xaa, 0x4d, 0x82, 0x51, 0x81, 0x51, 0x83, 0xdb, 0x48, 0x48, 0x0f, 0xaa,
|
0xf2, 0xc8, 0xc0, 0x69, 0x3f, 0xb0, 0xe3, 0x9b, 0x7a, 0x70, 0xad, 0x5e, 0x91, 0xf2, 0x7f, 0x98,
|
||||||
0x0f, 0x49, 0x39, 0x92, 0x2a, 0x25, 0x07, 0x2e, 0x21, 0x64, 0x83, 0x8a, 0x0b, 0xf2, 0xf3, 0x8a,
|
0x68, 0x36, 0x7d, 0xdd, 0x7d, 0x66, 0x18, 0x54, 0xcd, 0xc6, 0x70, 0x17, 0xc4, 0xbc, 0x84, 0x93,
|
||||||
0x53, 0x85, 0xb4, 0xb8, 0xd8, 0x51, 0x8d, 0x11, 0xd0, 0x83, 0x39, 0x0e, 0xa6, 0x14, 0xa6, 0x40,
|
0x92, 0xdc, 0x43, 0x30, 0x54, 0xf4, 0xf6, 0x4e, 0xd6, 0x61, 0x01, 0xb0, 0x24, 0x27, 0x29, 0x69,
|
||||||
0x49, 0x97, 0x8b, 0x1d, 0x2a, 0x26, 0xc4, 0xc7, 0xc5, 0x94, 0x99, 0x02, 0xd6, 0xc1, 0x19, 0xc4,
|
0x34, 0x8f, 0x16, 0xb3, 0x02, 0x95, 0xf8, 0x26, 0xf8, 0x84, 0xca, 0xbf, 0x22, 0xc0, 0x69, 0x92,
|
||||||
0x94, 0x99, 0x22, 0x24, 0xc4, 0xc5, 0x92, 0x97, 0x98, 0x9b, 0x2a, 0xc1, 0x04, 0x16, 0x01, 0xb3,
|
0xed, 0xb9, 0xb3, 0x84, 0x57, 0x90, 0xfc, 0xce, 0x39, 0x56, 0x52, 0x47, 0x8d, 0xe8, 0x08, 0xe0,
|
||||||
0x8d, 0x42, 0xb9, 0xb8, 0xa0, 0x3a, 0x8b, 0xcb, 0x92, 0x85, 0xdc, 0xb9, 0xb8, 0x10, 0xd6, 0x0b,
|
0x3d, 0x1c, 0x58, 0xc7, 0x43, 0xbd, 0x24, 0x9b, 0xc6, 0xf3, 0xdd, 0xc5, 0xac, 0xb8, 0xdc, 0xc0,
|
||||||
0x49, 0xc1, 0x6d, 0xc1, 0xf0, 0x9c, 0x94, 0x34, 0x56, 0x39, 0x88, 0x7b, 0x95, 0x18, 0x9c, 0x24,
|
0x7f, 0xa3, 0xd5, 0x53, 0x60, 0xab, 0x8d, 0x29, 0xbb, 0x80, 0x44, 0x0e, 0x11, 0x61, 0x4f, 0x73,
|
||||||
0xa2, 0xc4, 0x72, 0xf3, 0x53, 0x52, 0x73, 0x8a, 0x61, 0xa1, 0x68, 0x0d, 0xa5, 0x93, 0xd8, 0xc0,
|
0x13, 0x2e, 0x3d, 0xac, 0xfc, 0x9c, 0x5f, 0x43, 0x22, 0x19, 0x78, 0x04, 0x71, 0xdb, 0x88, 0x18,
|
||||||
0x21, 0x66, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0x16, 0x18, 0x87, 0xc4, 0x65, 0x01, 0x00, 0x00,
|
0xb7, 0xcd, 0x1a, 0xef, 0x6a, 0x43, 0x69, 0x1c, 0xf0, 0xf5, 0x5c, 0x3c, 0x03, 0x48, 0x33, 0xfb,
|
||||||
|
0xa1, 0xb1, 0x04, 0xf8, 0xe9, 0x80, 0xd9, 0xbf, 0xc5, 0xfc, 0xeb, 0x65, 0xe7, 0x5b, 0x4a, 0xe7,
|
||||||
|
0x3b, 0x8f, 0xe9, 0xcb, 0x99, 0xe1, 0x86, 0x56, 0x76, 0x5c, 0xd3, 0x9d, 0x7c, 0x5f, 0xf7, 0xfd,
|
||||||
|
0x4a, 0x6e, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x93, 0xb5, 0x4a, 0x95, 0xc6, 0x01, 0x00, 0x00,
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,5 @@
|
|||||||
// Code generated by protoc-gen-go.
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
// source: proto/common.proto
|
// source: proto/common.proto
|
||||||
// DO NOT EDIT!
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Package common is a generated protocol buffer package.
|
Package common is a generated protocol buffer package.
|
||||||
|
@@ -1,11 +1,26 @@
|
|||||||
// Code generated by protoc-gen-gotemplate
|
// Code generated by protoc-gen-gotemplate
|
||||||
package article
|
package company
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/moul/protoc-gen-gotemplate/examples/import/output/models/article"
|
"context"
|
||||||
"github.com/moul/protoc-gen-gotemplate/examples/import/output/models/common"
|
|
||||||
|
"moul.io/protoc-gen-gotemplate/examples/import/output/models/article"
|
||||||
|
"moul.io/protoc-gen-gotemplate/examples/import/output/models/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Repository interface {
|
type Repository interface {
|
||||||
GetArticle(getarticle *common.GetArticle ) (*article.Article, error)
|
GetArticle(getarticle *common.GetArticle) (*company.Article, []*company.Storage, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ------------------------- Public SDK -----------------------------
|
||||||
|
|
||||||
|
// GetArticle : proto: missing extension proto: missing extension
|
||||||
|
func (sdk *Sdk) GetArticle(ctx context.Context,
|
||||||
|
getarticle *article.GetArticle, token, requestID string) (article *article.Article, storages []*article.GetArticleResponse_Storage, err error) {
|
||||||
|
|
||||||
|
out := &pb.GetArticleResponse{}
|
||||||
|
_ = out
|
||||||
|
|
||||||
|
return out.Article, out.Storages, nil
|
||||||
|
|
||||||
|
}
|
||||||
|
@@ -1,13 +1,25 @@
|
|||||||
syntax = "proto3";
|
syntax = "proto3";
|
||||||
|
|
||||||
package article;
|
package company;
|
||||||
|
|
||||||
option go_package = "models/article;article";
|
option go_package = "models/article;article";
|
||||||
|
|
||||||
import "proto/common.proto";
|
import "proto/common.proto";
|
||||||
|
|
||||||
message GetArticleRequest { common.GetArticle getarticle = 1;}
|
message GetArticleRequest {
|
||||||
message GetArticleResponse { Article article = 1;}
|
common.GetArticle getarticle = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
message GetArticleResponse {
|
||||||
|
Article article = 1;
|
||||||
|
|
||||||
|
message Storage {
|
||||||
|
string code = 1;
|
||||||
|
}
|
||||||
|
// The generated output should write []*GetArticleResponse_Storage.Storage for this field.
|
||||||
|
repeated Storage storages = 2;
|
||||||
|
}
|
||||||
|
|
||||||
message Article{
|
message Article{
|
||||||
string id = 1;
|
string id = 1;
|
||||||
|
@@ -1,11 +1,41 @@
|
|||||||
// Code generated by protoc-gen-gotemplate
|
// Code generated by protoc-gen-gotemplate
|
||||||
|
{{- $file := .File}}
|
||||||
package {{.File.Package}}
|
package {{.File.Package}}
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/moul/protoc-gen-gotemplate/examples/import/output/models/article"
|
"moul.io/protoc-gen-gotemplate/examples/import/output/models/article"
|
||||||
"github.com/moul/protoc-gen-gotemplate/examples/import/output/models/common"
|
"moul.io/protoc-gen-gotemplate/examples/import/output/models/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Repository interface {
|
type Repository interface {
|
||||||
{{range $m := .Service.Method}}{{with $t := $m.InputType | getMessageType $.File}} {{$m.Name}}({{range $f := $t.Field}}{{$f.Name|lowerCamelCase}} {{$f| goTypeWithPackage }} {{end}}) ({{with $out := $m.OutputType | getMessageType $.File}}{{range $f := $out.Field}}{{$f | goTypeWithPackage}}, {{end}}{{end}} error){{end}}{{end}}
|
{{range $m := .Service.Method}}{{with $t := $m.InputType | getMessageType $.File}} {{$m.Name}}({{range $f := $t.Field}}{{$f.Name|lowerCamelCase}} {{$f| goTypeWithPackage }} {{end}}) ({{with $out := $m.OutputType | getMessageType $.File}}{{range $f := $out.Field}}{{$f | goTypeWithPackage}}, {{end}}{{end}} error){{end}}{{end}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ------------------------- Public SDK -----------------------------
|
||||||
|
{{$pkg := "pb"}}
|
||||||
|
|
||||||
|
|
||||||
|
{{range $m := .Service.Method}}
|
||||||
|
{{with $t := $m.InputType | getMessageType $.File}}
|
||||||
|
{{if and (not $m.ServerStreaming) (not $m.ClientStreaming)}}
|
||||||
|
{{/* ----------------------------- nominal case ---------------------------- */}}
|
||||||
|
// {{$m.Name}} : {{$m | httpVerb}} {{$m | httpPath}}
|
||||||
|
func (sdk *Sdk) {{$m.Name}}(ctx context.Context, {{if $t.OneofDecl}} req *{{$pkg}}.{{$m.Name}}Request,{{else}}{{range $f := $t.Field}}
|
||||||
|
{{$f.Name|lowerCamelCase}} {{$f| goTypeWithGoPackage $.File}},{{end}}{{end}} token, requestID string)({{with $out := $m.OutputType | getMessageType $.File}}{{range $f := $out.Field}}{{$f.Name|lowerCamelCase}} {{$f | goTypeWithGoPackage $.File}}, {{end}}{{end}}err error) {
|
||||||
|
|
||||||
|
out := &{{$pkg}}.{{$m.Name}}Response{}
|
||||||
|
_ = out
|
||||||
|
|
||||||
|
{{with $out := $m.OutputType | getMessageType $.File}}
|
||||||
|
return {{range $f := $out.Field}}out.{{$f.Name|camelCase}}, {{end}}nil
|
||||||
|
{{end}} {{/* with */}}
|
||||||
|
}
|
||||||
|
|
||||||
|
{{end}} {{/* streaming ifs */}}
|
||||||
|
{{end}}{{end}} {{/* range with */}}
|
||||||
|
@@ -9,7 +9,7 @@ build:
|
|||||||
protoc -I./proto --go_out=plugins=grpc:output proto/aaa/aaa.proto
|
protoc -I./proto --go_out=plugins=grpc:output proto/aaa/aaa.proto
|
||||||
protoc -I./proto --go_out=plugins=grpc:output proto/bbb/bbb.proto
|
protoc -I./proto --go_out=plugins=grpc:output proto/bbb/bbb.proto
|
||||||
@rm -rf output/aaa output/bbb
|
@rm -rf output/aaa output/bbb
|
||||||
@mv output/github.com/moul/protoc-gen-gotemplate/examples/single-package-mode/output/* output/
|
@mv output/moul.io/protoc-gen-gotemplate/examples/single-package-mode/output/* output/
|
||||||
@rm -rf output/github.com
|
@rm -rf output/github.com
|
||||||
|
|
||||||
@# protoc-gen-gotemplate
|
@# protoc-gen-gotemplate
|
||||||
|
@@ -17,7 +17,7 @@ package bbb
|
|||||||
import proto "github.com/golang/protobuf/proto"
|
import proto "github.com/golang/protobuf/proto"
|
||||||
import fmt "fmt"
|
import fmt "fmt"
|
||||||
import math "math"
|
import math "math"
|
||||||
import the_aaa_package "github.com/moul/protoc-gen-gotemplate/examples/single-package-mode/output/aaa"
|
import the_aaa_package "moul.io/protoc-gen-gotemplate/examples/single-package-mode/output/aaa"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
context "golang.org/x/net/context"
|
context "golang.org/x/net/context"
|
||||||
|
@@ -4,8 +4,8 @@ package bbb
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/moul/protoc-gen-gotemplate/examples/single-package-mode/output/aaa"
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
"moul.io/protoc-gen-gotemplate/examples/single-package-mode/output/aaa"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Service struct{}
|
type Service struct{}
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
syntax = "proto3";
|
syntax = "proto3";
|
||||||
|
|
||||||
option go_package = "github.com/moul/protoc-gen-gotemplate/examples/single-package-mode/output/aaa";
|
option go_package = "moul.io/protoc-gen-gotemplate/examples/single-package-mode/output/aaa";
|
||||||
|
|
||||||
package the.aaa.package;
|
package the.aaa.package;
|
||||||
|
|
||||||
@@ -9,4 +9,4 @@ message AaaRequest {
|
|||||||
}
|
}
|
||||||
message AaaReply {
|
message AaaReply {
|
||||||
string error = 1;
|
string error = 1;
|
||||||
}
|
}
|
||||||
|
@@ -2,7 +2,7 @@ syntax = "proto3";
|
|||||||
|
|
||||||
package the.bbb.package;
|
package the.bbb.package;
|
||||||
|
|
||||||
option go_package = "github.com/moul/protoc-gen-gotemplate/examples/single-package-mode/output/bbb";
|
option go_package = "moul.io/protoc-gen-gotemplate/examples/single-package-mode/output/bbb";
|
||||||
|
|
||||||
import "aaa/aaa.proto";
|
import "aaa/aaa.proto";
|
||||||
|
|
||||||
@@ -16,4 +16,4 @@ message BbbRequest {
|
|||||||
}
|
}
|
||||||
message BbbReply {
|
message BbbReply {
|
||||||
bool done = 1;
|
bool done = 1;
|
||||||
}
|
}
|
||||||
|
@@ -4,18 +4,18 @@
|
|||||||
<loc>/posts</loc>
|
<loc>/posts</loc>
|
||||||
<priority>0.5</priority>
|
<priority>0.5</priority>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<lastmod>2017-03-31</lastmod>
|
<lastmod>2017-05-19</lastmod>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>/authors</loc>
|
<loc>/authors</loc>
|
||||||
<priority>0.5</priority>
|
<priority>0.5</priority>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<lastmod>2017-03-31</lastmod>
|
<lastmod>2017-05-19</lastmod>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>/comments</loc>
|
<loc>/comments</loc>
|
||||||
<priority>0.5</priority>
|
<priority>0.5</priority>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<lastmod>2017-03-31</lastmod>
|
<lastmod>2017-05-19</lastmod>
|
||||||
</url>
|
</url>
|
||||||
</urlset>
|
</urlset>
|
||||||
|
13
examples/time/Makefile
Normal file
13
examples/time/Makefile
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
.PHONY: build
|
||||||
|
build:
|
||||||
|
mkdir -p output
|
||||||
|
protoc -I. --gotemplate_out=template_dir=templates,debug=true:output proto/*.proto
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: re
|
||||||
|
re: clean build
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
rm -rf output
|
10
examples/time/output/time.go
Normal file
10
examples/time/output/time.go
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
// Code generated by protoc-gen-gotemplate
|
||||||
|
package foo
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/golang/protobuf/ptypes/timestamp"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Repository interface {
|
||||||
|
GetFoo(timestamp *timestamp.Timestamp) (*timestamp.Timestamp, error)
|
||||||
|
}
|
12
examples/time/proto/time.proto
Normal file
12
examples/time/proto/time.proto
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package foo;
|
||||||
|
|
||||||
|
import "google/protobuf/timestamp.proto";
|
||||||
|
|
||||||
|
message GetFooRequest { google.protobuf.Timestamp timestamp = 1;}
|
||||||
|
message GetFooResponse { string result = 1;}
|
||||||
|
|
||||||
|
service foosvc {
|
||||||
|
rpc GetFoo (GetFooRequest) returns (GetFooResponse){}
|
||||||
|
}
|
10
examples/time/templates/time.go.tmpl
Normal file
10
examples/time/templates/time.go.tmpl
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
// Code generated by protoc-gen-gotemplate
|
||||||
|
package {{.File.Package}}
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/golang/protobuf/ptypes/timestamp"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Repository interface {
|
||||||
|
{{range $m := .Service.Method}}{{with $t := $m.InputType | getMessageType $.File}} {{$m.Name}}({{range $f := $t.Field}}{{$f.Name|lowerCamelCase}} {{$f| goTypeWithPackage }} {{end}}) ({{with $out := $m.OutputType | getMessageType $.File}}{{range $f := $out.Field}}{{$f | goTypeWithPackage}}, {{end}}{{end}} error){{end}}{{end}}
|
||||||
|
}
|
89
glide.lock
generated
89
glide.lock
generated
@@ -1,89 +0,0 @@
|
|||||||
hash: 1944ae13e983e8da7b26c697fc40d79d34326b8c7f56c8939fb16f1ff8caca5b
|
|
||||||
updated: 2017-05-18T19:20:01.855895064+02:00
|
|
||||||
imports:
|
|
||||||
- name: github.com/aokoli/goutils
|
|
||||||
version: e57d01ace047c1a43e6a49ecf3ecc50ed2be81d1
|
|
||||||
- name: github.com/dgrijalva/jwt-go
|
|
||||||
version: c9eaceb2896dbb515dae7ec352b377a226a52721
|
|
||||||
- name: github.com/go-kit/kit
|
|
||||||
version: 9f5c614cd1e70102f80b644edbc760805ebf16d5
|
|
||||||
subpackages:
|
|
||||||
- auth/jwt
|
|
||||||
- endpoint
|
|
||||||
- log
|
|
||||||
- transport/grpc
|
|
||||||
- transport/http
|
|
||||||
- name: github.com/go-logfmt/logfmt
|
|
||||||
version: 390ab7935ee28ec6b286364bba9b4dd6410cb3d5
|
|
||||||
- name: github.com/go-stack/stack
|
|
||||||
version: 7a2f19628aabfe68f0766b59e74d6315f8347d22
|
|
||||||
- name: github.com/golang/glog
|
|
||||||
version: 23def4e6c14b4da8ac2ed8007337bc5eb5007998
|
|
||||||
- name: github.com/golang/protobuf
|
|
||||||
version: 8ee79997227bf9b34611aee7946ae64735e6fd93
|
|
||||||
subpackages:
|
|
||||||
- proto
|
|
||||||
- protoc-gen-go/descriptor
|
|
||||||
- protoc-gen-go/generator
|
|
||||||
- protoc-gen-go/plugin
|
|
||||||
- name: github.com/gorilla/handlers
|
|
||||||
version: e1b2144f2167de0e1042d1d35e5cba5119d4fb5d
|
|
||||||
- name: github.com/grpc-ecosystem/grpc-gateway
|
|
||||||
version: 589b126116b5fc961939b3e156c29e4d9d58222f
|
|
||||||
subpackages:
|
|
||||||
- protoc-gen-grpc-gateway/descriptor
|
|
||||||
- protoc-gen-grpc-gateway/httprule
|
|
||||||
- utilities
|
|
||||||
- name: github.com/huandu/xstrings
|
|
||||||
version: 3959339b333561bf62a38b424fd41517c2c90f40
|
|
||||||
- name: github.com/imdario/mergo
|
|
||||||
version: 3e95a51e0639b4cf372f2ccf74c86749d747fbdc
|
|
||||||
- name: github.com/kr/fs
|
|
||||||
version: 2788f0dbd16903de03cb8186e5c7d97b69ad387b
|
|
||||||
- name: github.com/kr/logfmt
|
|
||||||
version: b84e30acd515aadc4b783ad4ff83aff3299bdfe0
|
|
||||||
- name: github.com/Masterminds/semver
|
|
||||||
version: 59c29afe1a994eacb71c833025ca7acf874bb1da
|
|
||||||
- name: github.com/Masterminds/sprig
|
|
||||||
version: 2f4371ac162f912989f01cc2b6af4ba6660e6a30
|
|
||||||
- name: github.com/satori/go.uuid
|
|
||||||
version: 879c5887cd475cd7864858769793b2ceb0d44feb
|
|
||||||
- name: golang.org/x/crypto
|
|
||||||
version: 0fe963104e9d1877082f8fb38f816fcd97eb1d10
|
|
||||||
subpackages:
|
|
||||||
- pbkdf2
|
|
||||||
- scrypt
|
|
||||||
- name: golang.org/x/net
|
|
||||||
version: da2b4fa28524a3baf148c1b94df4440267063c88
|
|
||||||
subpackages:
|
|
||||||
- context
|
|
||||||
- context/ctxhttp
|
|
||||||
- http2
|
|
||||||
- http2/hpack
|
|
||||||
- idna
|
|
||||||
- internal/timeseries
|
|
||||||
- lex/httplex
|
|
||||||
- trace
|
|
||||||
- name: golang.org/x/text
|
|
||||||
version: a49bea13b776691cb1b49873e5d8df96ec74831a
|
|
||||||
subpackages:
|
|
||||||
- secure/bidirule
|
|
||||||
- transform
|
|
||||||
- unicode/bidi
|
|
||||||
- unicode/norm
|
|
||||||
- name: google.golang.org/genproto
|
|
||||||
version: bb3573be0c484136831138976d444b8754777aff
|
|
||||||
subpackages:
|
|
||||||
- googleapis/api/annotations
|
|
||||||
- name: google.golang.org/grpc
|
|
||||||
version: 777daa17ff9b5daef1cfdf915088a2ada3332bf0
|
|
||||||
subpackages:
|
|
||||||
- codes
|
|
||||||
- credentials
|
|
||||||
- grpclog
|
|
||||||
- internal
|
|
||||||
- metadata
|
|
||||||
- naming
|
|
||||||
- peer
|
|
||||||
- transport
|
|
||||||
testImports: []
|
|
16
glide.yaml
16
glide.yaml
@@ -1,16 +0,0 @@
|
|||||||
package: github.com/moul/protoc-gen-gotemplate
|
|
||||||
import:
|
|
||||||
- package: github.com/golang/protobuf
|
|
||||||
subpackages:
|
|
||||||
- proto
|
|
||||||
- protoc-gen-go/descriptor
|
|
||||||
- protoc-gen-go/generator
|
|
||||||
- protoc-gen-go/plugin
|
|
||||||
- package: github.com/kr/fs
|
|
||||||
- package: github.com/Masterminds/sprig
|
|
||||||
- package: github.com/huandu/xstrings
|
|
||||||
- package: google.golang.org/genproto
|
|
||||||
subpackages:
|
|
||||||
- googleapis/api/annotations
|
|
||||||
- package: github.com/grpc-ecosystem/grpc-gateway
|
|
||||||
version: 1.2.2
|
|
21
go.mod
Normal file
21
go.mod
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
module moul.io/protoc-gen-gotemplate
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/Masterminds/semver v1.2.2 // indirect
|
||||||
|
github.com/Masterminds/sprig v2.14.1+incompatible
|
||||||
|
github.com/aokoli/goutils v0.0.0-20170502144750-e57d01ace047 // indirect
|
||||||
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect
|
||||||
|
github.com/golang/protobuf v0.0.0-20161117033126-8ee79997227b
|
||||||
|
github.com/gorilla/context v0.0.0-20160226214623-1ea25387ff6f // indirect
|
||||||
|
github.com/gorilla/handlers v0.0.0-20161028133215-e1b2144f2167
|
||||||
|
github.com/gorilla/mux v1.5.0
|
||||||
|
github.com/grpc-ecosystem/grpc-gateway v1.2.2
|
||||||
|
github.com/huandu/xstrings v0.0.0-20151130125119-3959339b3335
|
||||||
|
github.com/imdario/mergo v0.0.0-20171009183408-7fe0c75c13ab // indirect
|
||||||
|
github.com/satori/go.uuid v1.1.0 // indirect
|
||||||
|
github.com/stretchr/testify v1.3.0 // indirect
|
||||||
|
golang.org/x/crypto v0.0.0-20170516161655-0fe963104e9d // indirect
|
||||||
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 // indirect
|
||||||
|
google.golang.org/genproto v0.0.0-20170517234824-bb3573be0c48
|
||||||
|
gopkg.in/yaml.v2 v2.2.2 // indirect
|
||||||
|
)
|
41
go.sum
Normal file
41
go.sum
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
github.com/Masterminds/semver v1.2.2 h1:ptelpryog9A0pR4TGFvIAvw2c8SaNrYkFtfrxhSviss=
|
||||||
|
github.com/Masterminds/semver v1.2.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
|
||||||
|
github.com/Masterminds/sprig v2.14.1+incompatible h1:rTHERm50Xp1Cbb8x7xBCeDp//jMMqqR44EWw7KwSXUQ=
|
||||||
|
github.com/Masterminds/sprig v2.14.1+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o=
|
||||||
|
github.com/aokoli/goutils v0.0.0-20170502144750-e57d01ace047 h1:Bn0iqJ/349f606hR0juIGyheAI6+hyg9XUOLhN9udLo=
|
||||||
|
github.com/aokoli/goutils v0.0.0-20170502144750-e57d01ace047/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ=
|
||||||
|
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
|
||||||
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||||
|
github.com/golang/protobuf v0.0.0-20161117033126-8ee79997227b h1:fE/yi9pibxGEc0gSJuEShcsBXE2d5FW3OudsjE9tKzQ=
|
||||||
|
github.com/golang/protobuf v0.0.0-20161117033126-8ee79997227b/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/gorilla/context v0.0.0-20160226214623-1ea25387ff6f h1:9oNbS1z4rVpbnkHBdPZU4jo9bSmrLpII768arSyMFgk=
|
||||||
|
github.com/gorilla/context v0.0.0-20160226214623-1ea25387ff6f/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
||||||
|
github.com/gorilla/handlers v0.0.0-20161028133215-e1b2144f2167 h1:uANqGlSIT3JwuQVokEBcvc9WAu5+v4cVD5szF5k+iIU=
|
||||||
|
github.com/gorilla/handlers v0.0.0-20161028133215-e1b2144f2167/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ=
|
||||||
|
github.com/gorilla/mux v1.5.0 h1:mq8bRov+5x+pZNR/uAHyUEgovR9gLgYFwDQIeuYi9TM=
|
||||||
|
github.com/gorilla/mux v1.5.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||||
|
github.com/grpc-ecosystem/grpc-gateway v1.2.2 h1:oR2ZMoJtQccW6NIJ9yFxRqAr2rkmcNsCaZKT66A9zt4=
|
||||||
|
github.com/grpc-ecosystem/grpc-gateway v1.2.2/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
|
||||||
|
github.com/huandu/xstrings v0.0.0-20151130125119-3959339b3335 h1:KZOP9q7J/P4eMBibPuVwuloXgd2dTbLAHRPqxw7NXOw=
|
||||||
|
github.com/huandu/xstrings v0.0.0-20151130125119-3959339b3335/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo=
|
||||||
|
github.com/imdario/mergo v0.0.0-20171009183408-7fe0c75c13ab h1:k/Biv+LJL35wkk0Hveko1nj7as4tSHkHdZaNlzn/gcQ=
|
||||||
|
github.com/imdario/mergo v0.0.0-20171009183408-7fe0c75c13ab/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/satori/go.uuid v1.1.0 h1:B9KXyj+GzIpJbV7gmr873NsY6zpbxNy24CBtGrk7jHo=
|
||||||
|
github.com/satori/go.uuid v1.1.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
||||||
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
|
golang.org/x/crypto v0.0.0-20170516161655-0fe963104e9d h1:qjfFh1YMn6m60QTGoG+IlwUMhNlXJbDyCa6EkHM/N2w=
|
||||||
|
golang.org/x/crypto v0.0.0-20170516161655-0fe963104e9d/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw=
|
||||||
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
google.golang.org/genproto v0.0.0-20170517234824-bb3573be0c48 h1:xfoW+Di7qQQUnjptcGb4/rpc701e3RvfNmaywfMxQVI=
|
||||||
|
google.golang.org/genproto v0.0.0-20170517234824-bb3573be0c48/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
|
||||||
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
343
helpers.go
343
helpers.go
@@ -1,343 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"regexp"
|
|
||||||
"strings"
|
|
||||||
"text/template"
|
|
||||||
|
|
||||||
"github.com/Masterminds/sprig"
|
|
||||||
"github.com/golang/protobuf/proto"
|
|
||||||
"github.com/golang/protobuf/protoc-gen-go/descriptor"
|
|
||||||
ggdescriptor "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway/descriptor"
|
|
||||||
"github.com/huandu/xstrings"
|
|
||||||
options "google.golang.org/genproto/googleapis/api/annotations"
|
|
||||||
)
|
|
||||||
|
|
||||||
var jsReservedRe *regexp.Regexp = regexp.MustCompile(`(^|[^A-Za-z])(do|if|in|for|let|new|try|var|case|else|enum|eval|false|null|this|true|void|with|break|catch|class|const|super|throw|while|yield|delete|export|import|public|return|static|switch|typeof|default|extends|finally|package|private|continue|debugger|function|arguments|interface|protected|implements|instanceof)($|[^A-Za-z])`)
|
|
||||||
|
|
||||||
var ProtoHelpersFuncMap = template.FuncMap{
|
|
||||||
"string": func(i interface {
|
|
||||||
String() string
|
|
||||||
}) string {
|
|
||||||
return i.String()
|
|
||||||
},
|
|
||||||
"json": func(v interface{}) string {
|
|
||||||
a, _ := json.Marshal(v)
|
|
||||||
return string(a)
|
|
||||||
},
|
|
||||||
"prettyjson": func(v interface{}) string {
|
|
||||||
a, _ := json.MarshalIndent(v, "", " ")
|
|
||||||
return string(a)
|
|
||||||
},
|
|
||||||
"splitArray": func(sep string, s string) []string {
|
|
||||||
return strings.Split(s, sep)
|
|
||||||
},
|
|
||||||
"first": func(a []string) string {
|
|
||||||
return a[0]
|
|
||||||
},
|
|
||||||
"last": func(a []string) string {
|
|
||||||
return a[len(a)-1]
|
|
||||||
},
|
|
||||||
"upperFirst": func(s string) string {
|
|
||||||
return strings.ToUpper(s[:1]) + s[1:]
|
|
||||||
},
|
|
||||||
"lowerFirst": func(s string) string {
|
|
||||||
return strings.ToLower(s[:1]) + s[1:]
|
|
||||||
},
|
|
||||||
"camelCase": func(s string) string {
|
|
||||||
if len(s) > 1 {
|
|
||||||
return xstrings.ToCamelCase(s)
|
|
||||||
}
|
|
||||||
|
|
||||||
return strings.ToUpper(s[:1])
|
|
||||||
},
|
|
||||||
"lowerCamelCase": func(s string) string {
|
|
||||||
if len(s) > 1 {
|
|
||||||
s = xstrings.ToCamelCase(s)
|
|
||||||
}
|
|
||||||
|
|
||||||
return strings.ToLower(s[:1]) + s[1:]
|
|
||||||
},
|
|
||||||
"kebabCase": func(s string) string {
|
|
||||||
return strings.Replace(xstrings.ToSnakeCase(s), "_", "-", -1)
|
|
||||||
},
|
|
||||||
"snakeCase": xstrings.ToSnakeCase,
|
|
||||||
"getProtoFile": getProtoFile,
|
|
||||||
"getMessageType": getMessageType,
|
|
||||||
"getEnumValue": getEnumValue,
|
|
||||||
"isFieldMessage": isFieldMessage,
|
|
||||||
"isFieldRepeated": isFieldRepeated,
|
|
||||||
"goType": goType,
|
|
||||||
"goTypeWithPackage": goTypeWithPackage,
|
|
||||||
"jsType": jsType,
|
|
||||||
"jsSuffixReserved": jsSuffixReservedKeyword,
|
|
||||||
"namespacedFlowType": namespacedFlowType,
|
|
||||||
"httpVerb": httpVerb,
|
|
||||||
"httpPath": httpPath,
|
|
||||||
"shortType": shortType,
|
|
||||||
"urlHasVarsFromMessage": urlHasVarsFromMessage,
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
for k, v := range sprig.TxtFuncMap() {
|
|
||||||
ProtoHelpersFuncMap[k] = v
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func getProtoFile(name string) *ggdescriptor.File {
|
|
||||||
if registry == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
file, err := registry.LookupFile(name)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
return file
|
|
||||||
}
|
|
||||||
|
|
||||||
func getMessageType(f *descriptor.FileDescriptorProto, name string) *ggdescriptor.Message {
|
|
||||||
if registry != nil {
|
|
||||||
msg, err := registry.LookupMsg(".", name)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
return msg
|
|
||||||
}
|
|
||||||
|
|
||||||
// name is in the form .packageName.MessageTypeName.InnerMessageTypeName...
|
|
||||||
// e.g. .article.ProductTag
|
|
||||||
splits := strings.Split(name, ".")
|
|
||||||
target := splits[len(splits)-1]
|
|
||||||
for _, m := range f.MessageType {
|
|
||||||
if target == *m.Name {
|
|
||||||
return &ggdescriptor.Message{
|
|
||||||
DescriptorProto: m,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func getEnumValue(f []*descriptor.EnumDescriptorProto, name string) []*descriptor.EnumValueDescriptorProto {
|
|
||||||
for _, item := range f {
|
|
||||||
if strings.EqualFold(*item.Name, name) {
|
|
||||||
return item.GetValue()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func isFieldMessage(f *descriptor.FieldDescriptorProto) bool {
|
|
||||||
if f.Type != nil && *f.Type == descriptor.FieldDescriptorProto_TYPE_MESSAGE {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func isFieldRepeated(f *descriptor.FieldDescriptorProto) bool {
|
|
||||||
if f.Type != nil && f.Label != nil && *f.Label == descriptor.FieldDescriptorProto_LABEL_REPEATED {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func goTypeWithPackage(f *descriptor.FieldDescriptorProto) string {
|
|
||||||
pkg := ""
|
|
||||||
if *f.Type == descriptor.FieldDescriptorProto_TYPE_MESSAGE {
|
|
||||||
pkg = getPackageTypeName(*f.TypeName)
|
|
||||||
}
|
|
||||||
return goType(pkg, f)
|
|
||||||
}
|
|
||||||
|
|
||||||
func goType(pkg string, f *descriptor.FieldDescriptorProto) string {
|
|
||||||
switch *f.Type {
|
|
||||||
case descriptor.FieldDescriptorProto_TYPE_DOUBLE:
|
|
||||||
if *f.Label == descriptor.FieldDescriptorProto_LABEL_REPEATED {
|
|
||||||
return "[]float64"
|
|
||||||
}
|
|
||||||
return "float64"
|
|
||||||
case descriptor.FieldDescriptorProto_TYPE_FLOAT:
|
|
||||||
if *f.Label == descriptor.FieldDescriptorProto_LABEL_REPEATED {
|
|
||||||
return "[]float32"
|
|
||||||
}
|
|
||||||
return "float32"
|
|
||||||
case descriptor.FieldDescriptorProto_TYPE_INT64:
|
|
||||||
if *f.Label == descriptor.FieldDescriptorProto_LABEL_REPEATED {
|
|
||||||
return "[]int64"
|
|
||||||
}
|
|
||||||
return "int64"
|
|
||||||
case descriptor.FieldDescriptorProto_TYPE_UINT64:
|
|
||||||
if *f.Label == descriptor.FieldDescriptorProto_LABEL_REPEATED {
|
|
||||||
return "[]uint64"
|
|
||||||
}
|
|
||||||
return "uint64"
|
|
||||||
case descriptor.FieldDescriptorProto_TYPE_INT32:
|
|
||||||
if *f.Label == descriptor.FieldDescriptorProto_LABEL_REPEATED {
|
|
||||||
return "[]uint32"
|
|
||||||
}
|
|
||||||
return "uint32"
|
|
||||||
case descriptor.FieldDescriptorProto_TYPE_BOOL:
|
|
||||||
if *f.Label == descriptor.FieldDescriptorProto_LABEL_REPEATED {
|
|
||||||
return "[]bool"
|
|
||||||
}
|
|
||||||
return "bool"
|
|
||||||
case descriptor.FieldDescriptorProto_TYPE_STRING:
|
|
||||||
if *f.Label == descriptor.FieldDescriptorProto_LABEL_REPEATED {
|
|
||||||
return "[]string"
|
|
||||||
}
|
|
||||||
return "string"
|
|
||||||
case descriptor.FieldDescriptorProto_TYPE_MESSAGE:
|
|
||||||
if pkg != "" {
|
|
||||||
pkg = pkg + "."
|
|
||||||
}
|
|
||||||
if *f.Label == descriptor.FieldDescriptorProto_LABEL_REPEATED {
|
|
||||||
return fmt.Sprintf("[]*%s%s", pkg, shortType(*f.TypeName))
|
|
||||||
}
|
|
||||||
return fmt.Sprintf("*%s%s", pkg, shortType(*f.TypeName))
|
|
||||||
case descriptor.FieldDescriptorProto_TYPE_BYTES:
|
|
||||||
if *f.Label == descriptor.FieldDescriptorProto_LABEL_REPEATED {
|
|
||||||
return "[]byte"
|
|
||||||
}
|
|
||||||
return "byte"
|
|
||||||
case descriptor.FieldDescriptorProto_TYPE_UINT32:
|
|
||||||
if *f.Label == descriptor.FieldDescriptorProto_LABEL_REPEATED {
|
|
||||||
return "[]uint32"
|
|
||||||
}
|
|
||||||
return "uint32"
|
|
||||||
case descriptor.FieldDescriptorProto_TYPE_ENUM:
|
|
||||||
return fmt.Sprintf("*%s.%s", pkg, shortType(*f.TypeName))
|
|
||||||
default:
|
|
||||||
return "interface{}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func jsType(f *descriptor.FieldDescriptorProto) string {
|
|
||||||
template := "%s"
|
|
||||||
if isFieldRepeated(f) == true {
|
|
||||||
template = "Array<%s>"
|
|
||||||
}
|
|
||||||
|
|
||||||
switch *f.Type {
|
|
||||||
case descriptor.FieldDescriptorProto_TYPE_MESSAGE,
|
|
||||||
descriptor.FieldDescriptorProto_TYPE_ENUM:
|
|
||||||
return fmt.Sprintf(template, namespacedFlowType(*f.TypeName))
|
|
||||||
case descriptor.FieldDescriptorProto_TYPE_DOUBLE,
|
|
||||||
descriptor.FieldDescriptorProto_TYPE_FLOAT,
|
|
||||||
descriptor.FieldDescriptorProto_TYPE_INT64,
|
|
||||||
descriptor.FieldDescriptorProto_TYPE_UINT64,
|
|
||||||
descriptor.FieldDescriptorProto_TYPE_INT32,
|
|
||||||
descriptor.FieldDescriptorProto_TYPE_FIXED64,
|
|
||||||
descriptor.FieldDescriptorProto_TYPE_FIXED32,
|
|
||||||
descriptor.FieldDescriptorProto_TYPE_UINT32,
|
|
||||||
descriptor.FieldDescriptorProto_TYPE_SFIXED32,
|
|
||||||
descriptor.FieldDescriptorProto_TYPE_SFIXED64,
|
|
||||||
descriptor.FieldDescriptorProto_TYPE_SINT32,
|
|
||||||
descriptor.FieldDescriptorProto_TYPE_SINT64:
|
|
||||||
return fmt.Sprintf(template, "number")
|
|
||||||
case descriptor.FieldDescriptorProto_TYPE_BOOL:
|
|
||||||
return fmt.Sprintf(template, "boolean")
|
|
||||||
case descriptor.FieldDescriptorProto_TYPE_BYTES:
|
|
||||||
return fmt.Sprintf(template, "Uint8Array")
|
|
||||||
case descriptor.FieldDescriptorProto_TYPE_STRING:
|
|
||||||
return fmt.Sprintf(template, "string")
|
|
||||||
default:
|
|
||||||
return fmt.Sprintf(template, "any")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func jsSuffixReservedKeyword(s string) string {
|
|
||||||
return jsReservedRe.ReplaceAllString(s, "${1}${2}_${3}")
|
|
||||||
}
|
|
||||||
|
|
||||||
func getPackageTypeName(s string) string {
|
|
||||||
if strings.Contains(s, ".") {
|
|
||||||
return strings.Split(s, ".")[1]
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func shortType(s string) string {
|
|
||||||
t := strings.Split(s, ".")
|
|
||||||
return t[len(t)-1]
|
|
||||||
}
|
|
||||||
|
|
||||||
func namespacedFlowType(s string) string {
|
|
||||||
trimmed := strings.TrimLeft(s, ".")
|
|
||||||
splitted := strings.Split(trimmed, ".")
|
|
||||||
return strings.Join(splitted, "$")
|
|
||||||
}
|
|
||||||
|
|
||||||
func httpPath(m *descriptor.MethodDescriptorProto) string {
|
|
||||||
|
|
||||||
ext, err := proto.GetExtension(m.Options, options.E_Http)
|
|
||||||
if err != nil {
|
|
||||||
return err.Error()
|
|
||||||
}
|
|
||||||
opts, ok := ext.(*options.HttpRule)
|
|
||||||
if !ok {
|
|
||||||
return fmt.Sprintf("extension is %T; want an HttpRule", ext)
|
|
||||||
}
|
|
||||||
|
|
||||||
switch t := opts.Pattern.(type) {
|
|
||||||
default:
|
|
||||||
return ""
|
|
||||||
case *options.HttpRule_Get:
|
|
||||||
return t.Get
|
|
||||||
case *options.HttpRule_Post:
|
|
||||||
return t.Post
|
|
||||||
case *options.HttpRule_Put:
|
|
||||||
return t.Put
|
|
||||||
case *options.HttpRule_Delete:
|
|
||||||
return t.Delete
|
|
||||||
case *options.HttpRule_Patch:
|
|
||||||
return t.Patch
|
|
||||||
case *options.HttpRule_Custom:
|
|
||||||
return t.Custom.Path
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func httpVerb(m *descriptor.MethodDescriptorProto) string {
|
|
||||||
|
|
||||||
ext, err := proto.GetExtension(m.Options, options.E_Http)
|
|
||||||
if err != nil {
|
|
||||||
return err.Error()
|
|
||||||
}
|
|
||||||
opts, ok := ext.(*options.HttpRule)
|
|
||||||
if !ok {
|
|
||||||
return fmt.Sprintf("extension is %T; want an HttpRule", ext)
|
|
||||||
}
|
|
||||||
|
|
||||||
switch t := opts.Pattern.(type) {
|
|
||||||
default:
|
|
||||||
return ""
|
|
||||||
case *options.HttpRule_Get:
|
|
||||||
return "GET"
|
|
||||||
case *options.HttpRule_Post:
|
|
||||||
return "POST"
|
|
||||||
case *options.HttpRule_Put:
|
|
||||||
return "PUT"
|
|
||||||
case *options.HttpRule_Delete:
|
|
||||||
return "DELETE"
|
|
||||||
case *options.HttpRule_Patch:
|
|
||||||
return "PATCH"
|
|
||||||
case *options.HttpRule_Custom:
|
|
||||||
return t.Custom.Kind
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func urlHasVarsFromMessage(path string, d *descriptor.DescriptorProto) bool {
|
|
||||||
for _, field := range d.Field {
|
|
||||||
if !isFieldMessage(field) {
|
|
||||||
if strings.Contains(path, fmt.Sprintf("{%s}", *field.Name)) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
1166
helpers/helpers.go
Normal file
1166
helpers/helpers.go
Normal file
File diff suppressed because it is too large
Load Diff
35
main.go
35
main.go
@@ -1,4 +1,4 @@
|
|||||||
package main
|
package main // import "moul.io/protoc-gen-gotemplate"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
@@ -8,14 +8,21 @@ import (
|
|||||||
|
|
||||||
"github.com/golang/protobuf/proto"
|
"github.com/golang/protobuf/proto"
|
||||||
"github.com/golang/protobuf/protoc-gen-go/generator"
|
"github.com/golang/protobuf/protoc-gen-go/generator"
|
||||||
"github.com/golang/protobuf/protoc-gen-go/plugin"
|
plugin_go "github.com/golang/protobuf/protoc-gen-go/plugin"
|
||||||
ggdescriptor "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway/descriptor"
|
ggdescriptor "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway/descriptor"
|
||||||
|
|
||||||
|
pgghelpers "moul.io/protoc-gen-gotemplate/helpers"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
registry *ggdescriptor.Registry // some helpers need access to registry
|
registry *ggdescriptor.Registry // some helpers need access to registry
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
boolTrue = "true"
|
||||||
|
boolFalse = "false"
|
||||||
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
g := generator.New()
|
g := generator.New()
|
||||||
|
|
||||||
@@ -24,7 +31,7 @@ func main() {
|
|||||||
g.Error(err, "reading input")
|
g.Error(err, "reading input")
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := proto.Unmarshal(data, g.Request); err != nil {
|
if err = proto.Unmarshal(data, g.Request); err != nil {
|
||||||
g.Error(err, "parsing input proto")
|
g.Error(err, "parsing input proto")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -52,37 +59,32 @@ func main() {
|
|||||||
switch parts[0] {
|
switch parts[0] {
|
||||||
case "template_dir":
|
case "template_dir":
|
||||||
templateDir = parts[1]
|
templateDir = parts[1]
|
||||||
break
|
|
||||||
case "destination_dir":
|
case "destination_dir":
|
||||||
destinationDir = parts[1]
|
destinationDir = parts[1]
|
||||||
break
|
|
||||||
case "single-package-mode":
|
case "single-package-mode":
|
||||||
switch strings.ToLower(parts[1]) {
|
switch strings.ToLower(parts[1]) {
|
||||||
case "true", "t":
|
case boolTrue, "t":
|
||||||
singlePackageMode = true
|
singlePackageMode = true
|
||||||
case "false", "f":
|
case boolFalse, "f":
|
||||||
default:
|
default:
|
||||||
log.Printf("Err: invalid value for single-package-mode: %q", parts[1])
|
log.Printf("Err: invalid value for single-package-mode: %q", parts[1])
|
||||||
}
|
}
|
||||||
break
|
|
||||||
case "debug":
|
case "debug":
|
||||||
switch strings.ToLower(parts[1]) {
|
switch strings.ToLower(parts[1]) {
|
||||||
case "true", "t":
|
case boolTrue, "t":
|
||||||
debug = true
|
debug = true
|
||||||
case "false", "f":
|
case boolFalse, "f":
|
||||||
default:
|
default:
|
||||||
log.Printf("Err: invalid value for debug: %q", parts[1])
|
log.Printf("Err: invalid value for debug: %q", parts[1])
|
||||||
}
|
}
|
||||||
break
|
|
||||||
case "all":
|
case "all":
|
||||||
switch strings.ToLower(parts[1]) {
|
switch strings.ToLower(parts[1]) {
|
||||||
case "true", "t":
|
case boolTrue, "t":
|
||||||
all = true
|
all = true
|
||||||
case "false", "f":
|
case boolFalse, "f":
|
||||||
default:
|
default:
|
||||||
log.Printf("Err: invalid value for debug: %q", parts[1])
|
log.Printf("Err: invalid value for debug: %q", parts[1])
|
||||||
}
|
}
|
||||||
break
|
|
||||||
default:
|
default:
|
||||||
log.Printf("Err: unknown parameter: %q", param)
|
log.Printf("Err: unknown parameter: %q", param)
|
||||||
}
|
}
|
||||||
@@ -101,7 +103,8 @@ func main() {
|
|||||||
|
|
||||||
if singlePackageMode {
|
if singlePackageMode {
|
||||||
registry = ggdescriptor.NewRegistry()
|
registry = ggdescriptor.NewRegistry()
|
||||||
if err := registry.Load(g.Request); err != nil {
|
pgghelpers.SetRegistry(registry)
|
||||||
|
if err = registry.Load(g.Request); err != nil {
|
||||||
g.Error(err, "registry: failed to load the request")
|
g.Error(err, "registry: failed to load the request")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -110,7 +113,7 @@ func main() {
|
|||||||
for _, file := range g.Request.GetProtoFile() {
|
for _, file := range g.Request.GetProtoFile() {
|
||||||
if all {
|
if all {
|
||||||
if singlePackageMode {
|
if singlePackageMode {
|
||||||
if _, err := registry.LookupFile(file.GetName()); err != nil {
|
if _, err = registry.LookupFile(file.GetName()); err != nil {
|
||||||
g.Error(err, "registry: failed to lookup file %q", file.GetName())
|
g.Error(err, "registry: failed to lookup file %q", file.GetName())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
6
renovate.json
Normal file
6
renovate.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"extends": [
|
||||||
|
"config:base"
|
||||||
|
],
|
||||||
|
"groupName": "all"
|
||||||
|
}
|
@@ -26,7 +26,7 @@
|
|||||||
* the good old ./generate.sh bash script
|
* the good old ./generate.sh bash script
|
||||||
* go:generate
|
* go:generate
|
||||||
* make
|
* make
|
||||||
* protobuf + [protoc-gen-gotemplate](https://github.com/moul/protoc-gen-gotemplate)
|
* protobuf + [protoc-gen-gotemplate](https://moul.io/protoc-gen-gotemplate)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -69,7 +69,7 @@ package sessionsvc
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
pb "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/session/gen/pb"
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/session/gen/pb"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Service struct{}
|
type Service struct{}
|
||||||
@@ -94,8 +94,8 @@ package {{.File.Package}}_httptransport
|
|||||||
import (
|
import (
|
||||||
gokit_endpoint "github.com/go-kit/kit/endpoint"
|
gokit_endpoint "github.com/go-kit/kit/endpoint"
|
||||||
httptransport "github.com/go-kit/kit/transport/http"
|
httptransport "github.com/go-kit/kit/transport/http"
|
||||||
endpoints "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/{{.File.Package}}/gen/endpoints"
|
endpoints "moul.io/protoc-gen-gotemplate/examples/go-kit/services/{{.File.Package}}/gen/endpoints"
|
||||||
pb "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/{{.File.Package}}/gen/pb"
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/{{.File.Package}}/gen/pb"
|
||||||
)
|
)
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -105,8 +105,8 @@ package user_httptransport
|
|||||||
import (
|
import (
|
||||||
gokit_endpoint "github.com/go-kit/kit/endpoint"
|
gokit_endpoint "github.com/go-kit/kit/endpoint"
|
||||||
httptransport "github.com/go-kit/kit/transport/http"
|
httptransport "github.com/go-kit/kit/transport/http"
|
||||||
endpoints "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/user/gen/endpoints"
|
endpoints "moul.io/protoc-gen-gotemplate/examples/go-kit/services/user/gen/endpoints"
|
||||||
pb "github.com/moul/protoc-gen-gotemplate/examples/go-kit/services/user/gen/pb"
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/user/gen/pb"
|
||||||
)
|
)
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -197,7 +197,7 @@ func RegisterHandlers(ctx context.Context, svc pb.UserServiceServer, mux *http.S
|
|||||||
|
|
||||||
# generation usages
|
# generation usages
|
||||||
|
|
||||||
* go-kit boilerplate (see [examples/go-kit](https://github.com/moul/protoc-gen-gotemplate/tree/master/examples/go-kit))
|
* go-kit boilerplate (see [examples/go-kit](https://moul.io/protoc-gen-gotemplate/tree/master/examples/go-kit))
|
||||||
* k8s configuration
|
* k8s configuration
|
||||||
* Dockerfile
|
* Dockerfile
|
||||||
* documentation
|
* documentation
|
||||||
@@ -243,5 +243,5 @@ func RegisterHandlers(ctx context.Context, svc pb.UserServiceServer, mux *http.S
|
|||||||
|
|
||||||
# questions?
|
# questions?
|
||||||
|
|
||||||
### github.com/moul/protoc-gen-gotemplate
|
### moul.io/protoc-gen-gotemplate
|
||||||
### @moul
|
### @moul
|
||||||
|
25
vendor/github.com/Masterminds/semver/.travis.yml
generated
vendored
25
vendor/github.com/Masterminds/semver/.travis.yml
generated
vendored
@@ -1,25 +0,0 @@
|
|||||||
language: go
|
|
||||||
|
|
||||||
go:
|
|
||||||
- 1.5
|
|
||||||
- 1.6
|
|
||||||
- 1.7
|
|
||||||
- tip
|
|
||||||
|
|
||||||
# Setting sudo access to false will let Travis CI use containers rather than
|
|
||||||
# VMs to run the tests. For more details see:
|
|
||||||
# - http://docs.travis-ci.com/user/workers/container-based-infrastructure/
|
|
||||||
# - http://docs.travis-ci.com/user/workers/standard-infrastructure/
|
|
||||||
sudo: false
|
|
||||||
|
|
||||||
script:
|
|
||||||
- GO15VENDOREXPERIMENT=1 make setup
|
|
||||||
- GO15VENDOREXPERIMENT=1 make test
|
|
||||||
|
|
||||||
notifications:
|
|
||||||
webhooks:
|
|
||||||
urls:
|
|
||||||
- https://webhooks.gitter.im/e/06e3328629952dabe3e0
|
|
||||||
on_success: change # options: [always|never|change] default: always
|
|
||||||
on_failure: always # options: [always|never|change] default: always
|
|
||||||
on_start: never # options: [always|never|change] default: always
|
|
157
vendor/github.com/Masterminds/semver/benchmark_test.go
generated
vendored
157
vendor/github.com/Masterminds/semver/benchmark_test.go
generated
vendored
@@ -1,157 +0,0 @@
|
|||||||
package semver_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/Masterminds/semver"
|
|
||||||
)
|
|
||||||
|
|
||||||
/* Constraint creation benchmarks */
|
|
||||||
|
|
||||||
func benchNewConstraint(c string, b *testing.B) {
|
|
||||||
for i := 0; i < b.N; i++ {
|
|
||||||
semver.NewConstraint(c)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkNewConstraintUnary(b *testing.B) {
|
|
||||||
benchNewConstraint("=2.0", b)
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkNewConstraintTilde(b *testing.B) {
|
|
||||||
benchNewConstraint("~2.0.0", b)
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkNewConstraintCaret(b *testing.B) {
|
|
||||||
benchNewConstraint("^2.0.0", b)
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkNewConstraintWildcard(b *testing.B) {
|
|
||||||
benchNewConstraint("1.x", b)
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkNewConstraintRange(b *testing.B) {
|
|
||||||
benchNewConstraint(">=2.1.x, <3.1.0", b)
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkNewConstraintUnion(b *testing.B) {
|
|
||||||
benchNewConstraint("~2.0.0 || =3.1.0", b)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check benchmarks */
|
|
||||||
|
|
||||||
func benchCheckVersion(c, v string, b *testing.B) {
|
|
||||||
version, _ := semver.NewVersion(v)
|
|
||||||
constraint, _ := semver.NewConstraint(c)
|
|
||||||
|
|
||||||
for i := 0; i < b.N; i++ {
|
|
||||||
constraint.Check(version)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkCheckVersionUnary(b *testing.B) {
|
|
||||||
benchCheckVersion("=2.0", "2.0.0", b)
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkCheckVersionTilde(b *testing.B) {
|
|
||||||
benchCheckVersion("~2.0.0", "2.0.5", b)
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkCheckVersionCaret(b *testing.B) {
|
|
||||||
benchCheckVersion("^2.0.0", "2.1.0", b)
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkCheckVersionWildcard(b *testing.B) {
|
|
||||||
benchCheckVersion("1.x", "1.4.0", b)
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkCheckVersionRange(b *testing.B) {
|
|
||||||
benchCheckVersion(">=2.1.x, <3.1.0", "2.4.5", b)
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkCheckVersionUnion(b *testing.B) {
|
|
||||||
benchCheckVersion("~2.0.0 || =3.1.0", "3.1.0", b)
|
|
||||||
}
|
|
||||||
|
|
||||||
func benchValidateVersion(c, v string, b *testing.B) {
|
|
||||||
version, _ := semver.NewVersion(v)
|
|
||||||
constraint, _ := semver.NewConstraint(c)
|
|
||||||
|
|
||||||
for i := 0; i < b.N; i++ {
|
|
||||||
constraint.Validate(version)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Validate benchmarks, including fails */
|
|
||||||
|
|
||||||
func BenchmarkValidateVersionUnary(b *testing.B) {
|
|
||||||
benchValidateVersion("=2.0", "2.0.0", b)
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkValidateVersionUnaryFail(b *testing.B) {
|
|
||||||
benchValidateVersion("=2.0", "2.0.1", b)
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkValidateVersionTilde(b *testing.B) {
|
|
||||||
benchValidateVersion("~2.0.0", "2.0.5", b)
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkValidateVersionTildeFail(b *testing.B) {
|
|
||||||
benchValidateVersion("~2.0.0", "1.0.5", b)
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkValidateVersionCaret(b *testing.B) {
|
|
||||||
benchValidateVersion("^2.0.0", "2.1.0", b)
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkValidateVersionCaretFail(b *testing.B) {
|
|
||||||
benchValidateVersion("^2.0.0", "4.1.0", b)
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkValidateVersionWildcard(b *testing.B) {
|
|
||||||
benchValidateVersion("1.x", "1.4.0", b)
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkValidateVersionWildcardFail(b *testing.B) {
|
|
||||||
benchValidateVersion("1.x", "2.4.0", b)
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkValidateVersionRange(b *testing.B) {
|
|
||||||
benchValidateVersion(">=2.1.x, <3.1.0", "2.4.5", b)
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkValidateVersionRangeFail(b *testing.B) {
|
|
||||||
benchValidateVersion(">=2.1.x, <3.1.0", "1.4.5", b)
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkValidateVersionUnion(b *testing.B) {
|
|
||||||
benchValidateVersion("~2.0.0 || =3.1.0", "3.1.0", b)
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkValidateVersionUnionFail(b *testing.B) {
|
|
||||||
benchValidateVersion("~2.0.0 || =3.1.0", "3.1.1", b)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Version creation benchmarks */
|
|
||||||
|
|
||||||
func benchNewVersion(v string, b *testing.B) {
|
|
||||||
for i := 0; i < b.N; i++ {
|
|
||||||
semver.NewVersion(v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkNewVersionSimple(b *testing.B) {
|
|
||||||
benchNewVersion("1.0.0", b)
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkNewVersionPre(b *testing.B) {
|
|
||||||
benchNewVersion("1.0.0-alpha", b)
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkNewVersionMeta(b *testing.B) {
|
|
||||||
benchNewVersion("1.0.0+metadata", b)
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkNewVersionMetaDash(b *testing.B) {
|
|
||||||
benchNewVersion("1.0.0+metadata-dash", b)
|
|
||||||
}
|
|
46
vendor/github.com/Masterminds/semver/collection_test.go
generated
vendored
46
vendor/github.com/Masterminds/semver/collection_test.go
generated
vendored
@@ -1,46 +0,0 @@
|
|||||||
package semver
|
|
||||||
|
|
||||||
import (
|
|
||||||
"reflect"
|
|
||||||
"sort"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestCollection(t *testing.T) {
|
|
||||||
raw := []string{
|
|
||||||
"1.2.3",
|
|
||||||
"1.0",
|
|
||||||
"1.3",
|
|
||||||
"2",
|
|
||||||
"0.4.2",
|
|
||||||
}
|
|
||||||
|
|
||||||
vs := make([]*Version, len(raw))
|
|
||||||
for i, r := range raw {
|
|
||||||
v, err := NewVersion(r)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Error parsing version: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
vs[i] = v
|
|
||||||
}
|
|
||||||
|
|
||||||
sort.Sort(Collection(vs))
|
|
||||||
|
|
||||||
e := []string{
|
|
||||||
"0.4.2",
|
|
||||||
"1.0.0",
|
|
||||||
"1.2.3",
|
|
||||||
"1.3.0",
|
|
||||||
"2.0.0",
|
|
||||||
}
|
|
||||||
|
|
||||||
a := make([]string, len(vs))
|
|
||||||
for i, v := range vs {
|
|
||||||
a[i] = v.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
if !reflect.DeepEqual(a, e) {
|
|
||||||
t.Error("Sorting Collection failed")
|
|
||||||
}
|
|
||||||
}
|
|
452
vendor/github.com/Masterminds/semver/constraints_test.go
generated
vendored
452
vendor/github.com/Masterminds/semver/constraints_test.go
generated
vendored
@@ -1,452 +0,0 @@
|
|||||||
package semver
|
|
||||||
|
|
||||||
import (
|
|
||||||
"reflect"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestParseConstraint(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
in string
|
|
||||||
f cfunc
|
|
||||||
v string
|
|
||||||
err bool
|
|
||||||
}{
|
|
||||||
{">= 1.2", constraintGreaterThanEqual, "1.2.0", false},
|
|
||||||
{"1.0", constraintTildeOrEqual, "1.0.0", false},
|
|
||||||
{"foo", nil, "", true},
|
|
||||||
{"<= 1.2", constraintLessThanEqual, "1.2.0", false},
|
|
||||||
{"=< 1.2", constraintLessThanEqual, "1.2.0", false},
|
|
||||||
{"=> 1.2", constraintGreaterThanEqual, "1.2.0", false},
|
|
||||||
{"v1.2", constraintTildeOrEqual, "1.2.0", false},
|
|
||||||
{"=1.5", constraintTildeOrEqual, "1.5.0", false},
|
|
||||||
{"> 1.3", constraintGreaterThan, "1.3.0", false},
|
|
||||||
{"< 1.4.1", constraintLessThan, "1.4.1", false},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tc := range tests {
|
|
||||||
c, err := parseConstraint(tc.in)
|
|
||||||
if tc.err && err == nil {
|
|
||||||
t.Errorf("Expected error for %s didn't occur", tc.in)
|
|
||||||
} else if !tc.err && err != nil {
|
|
||||||
t.Errorf("Unexpected error for %s", tc.in)
|
|
||||||
}
|
|
||||||
|
|
||||||
// If an error was expected continue the loop and don't try the other
|
|
||||||
// tests as they will cause errors.
|
|
||||||
if tc.err {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if tc.v != c.con.String() {
|
|
||||||
t.Errorf("Incorrect version found on %s", tc.in)
|
|
||||||
}
|
|
||||||
|
|
||||||
f1 := reflect.ValueOf(tc.f)
|
|
||||||
f2 := reflect.ValueOf(c.function)
|
|
||||||
if f1 != f2 {
|
|
||||||
t.Errorf("Wrong constraint found for %s", tc.in)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestConstraintCheck(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
constraint string
|
|
||||||
version string
|
|
||||||
check bool
|
|
||||||
}{
|
|
||||||
{"= 2.0", "1.2.3", false},
|
|
||||||
{"= 2.0", "2.0.0", true},
|
|
||||||
{"4.1", "4.1.0", true},
|
|
||||||
{"!=4.1", "4.1.0", false},
|
|
||||||
{"!=4.1", "5.1.0", true},
|
|
||||||
{">1.1", "4.1.0", true},
|
|
||||||
{">1.1", "1.1.0", false},
|
|
||||||
{"<1.1", "0.1.0", true},
|
|
||||||
{"<1.1", "1.1.0", false},
|
|
||||||
{"<1.1", "1.1.1", false},
|
|
||||||
{">=1.1", "4.1.0", true},
|
|
||||||
{">=1.1", "1.1.0", true},
|
|
||||||
{">=1.1", "0.0.9", false},
|
|
||||||
{"<=1.1", "0.1.0", true},
|
|
||||||
{"<=1.1", "1.1.0", true},
|
|
||||||
{"<=1.1", "1.1.1", false},
|
|
||||||
{">0", "0.0.1-alpha", true},
|
|
||||||
{">=0", "0.0.1-alpha", true},
|
|
||||||
{">0", "0", false},
|
|
||||||
{">=0", "0", true},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tc := range tests {
|
|
||||||
c, err := parseConstraint(tc.constraint)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("err: %s", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
v, err := NewVersion(tc.version)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("err: %s", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
a := c.check(v)
|
|
||||||
if a != tc.check {
|
|
||||||
t.Errorf("Constraint %q failing with %q", tc.constraint, tc.version)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestNewConstraint(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
input string
|
|
||||||
ors int
|
|
||||||
count int
|
|
||||||
err bool
|
|
||||||
}{
|
|
||||||
{">= 1.1", 1, 1, false},
|
|
||||||
{"2.0", 1, 1, false},
|
|
||||||
{"v2.3.5-20161202202307-sha.e8fc5e5", 1, 1, false},
|
|
||||||
{">= bar", 0, 0, true},
|
|
||||||
{">= 1.2.3, < 2.0", 1, 2, false},
|
|
||||||
{">= 1.2.3, < 2.0 || => 3.0, < 4", 2, 2, false},
|
|
||||||
|
|
||||||
// The 3 - 4 should be broken into 2 by the range rewriting
|
|
||||||
{"3 - 4 || => 3.0, < 4", 2, 2, false},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tc := range tests {
|
|
||||||
v, err := NewConstraint(tc.input)
|
|
||||||
if tc.err && err == nil {
|
|
||||||
t.Errorf("expected but did not get error for: %s", tc.input)
|
|
||||||
continue
|
|
||||||
} else if !tc.err && err != nil {
|
|
||||||
t.Errorf("unexpectederror for input %s: %s", tc.input, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if tc.err {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
l := len(v.constraints)
|
|
||||||
if tc.ors != l {
|
|
||||||
t.Errorf("Expected %s to have %d ORs but got %d",
|
|
||||||
tc.input, tc.ors, l)
|
|
||||||
}
|
|
||||||
|
|
||||||
l = len(v.constraints[0])
|
|
||||||
if tc.count != l {
|
|
||||||
t.Errorf("Expected %s to have %d constraints but got %d",
|
|
||||||
tc.input, tc.count, l)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestConstraintsCheck(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
constraint string
|
|
||||||
version string
|
|
||||||
check bool
|
|
||||||
}{
|
|
||||||
{"*", "1.2.3", true},
|
|
||||||
{"~0.0.0", "1.2.3", true},
|
|
||||||
{"= 2.0", "1.2.3", false},
|
|
||||||
{"= 2.0", "2.0.0", true},
|
|
||||||
{"4.1", "4.1.0", true},
|
|
||||||
{"4.1.x", "4.1.3", true},
|
|
||||||
{"1.x", "1.4", true},
|
|
||||||
{"!=4.1", "4.1.0", false},
|
|
||||||
{"!=4.1-alpha", "4.1.0-alpha", false},
|
|
||||||
{"!=4.1-alpha", "4.1.0", true},
|
|
||||||
{"!=4.1", "5.1.0", true},
|
|
||||||
{"!=4.x", "5.1.0", true},
|
|
||||||
{"!=4.x", "4.1.0", false},
|
|
||||||
{"!=4.1.x", "4.2.0", true},
|
|
||||||
{"!=4.2.x", "4.2.3", false},
|
|
||||||
{">1.1", "4.1.0", true},
|
|
||||||
{">1.1", "1.1.0", false},
|
|
||||||
{"<1.1", "0.1.0", true},
|
|
||||||
{"<1.1", "1.1.0", false},
|
|
||||||
{"<1.1", "1.1.1", false},
|
|
||||||
{"<1.x", "1.1.1", true},
|
|
||||||
{"<1.x", "2.1.1", false},
|
|
||||||
{"<1.1.x", "1.2.1", false},
|
|
||||||
{"<1.1.x", "1.1.500", true},
|
|
||||||
{"<1.2.x", "1.1.1", true},
|
|
||||||
{">=1.1", "4.1.0", true},
|
|
||||||
{">=1.1", "4.1.0-beta", false},
|
|
||||||
{">=1.1", "1.1.0", true},
|
|
||||||
{">=1.1", "0.0.9", false},
|
|
||||||
{"<=1.1", "0.1.0", true},
|
|
||||||
{"<=1.1", "0.1.0-alpha", false},
|
|
||||||
{"<=1.1-a", "0.1.0-alpha", true},
|
|
||||||
{"<=1.1", "1.1.0", true},
|
|
||||||
{"<=1.x", "1.1.0", true},
|
|
||||||
{"<=2.x", "3.1.0", false},
|
|
||||||
{"<=1.1", "1.1.1", false},
|
|
||||||
{"<=1.1.x", "1.2.500", false},
|
|
||||||
{">1.1, <2", "1.1.1", true},
|
|
||||||
{">1.1, <3", "4.3.2", false},
|
|
||||||
{">=1.1, <2, !=1.2.3", "1.2.3", false},
|
|
||||||
{">=1.1, <2, !=1.2.3 || > 3", "3.1.2", true},
|
|
||||||
{">=1.1, <2, !=1.2.3 || >= 3", "3.0.0", true},
|
|
||||||
{">=1.1, <2, !=1.2.3 || > 3", "3.0.0", false},
|
|
||||||
{">=1.1, <2, !=1.2.3 || > 3", "1.2.3", false},
|
|
||||||
{"1.1 - 2", "1.1.1", true},
|
|
||||||
{"1.1-3", "4.3.2", false},
|
|
||||||
{"^1.1", "1.1.1", true},
|
|
||||||
{"^1.1", "4.3.2", false},
|
|
||||||
{"^1.x", "1.1.1", true},
|
|
||||||
{"^2.x", "1.1.1", false},
|
|
||||||
{"^1.x", "2.1.1", false},
|
|
||||||
{"^1.x", "1.1.1-beta1", false},
|
|
||||||
{"^1.1.2-alpha", "1.2.1-beta1", true},
|
|
||||||
{"^1.2.x-alpha", "1.1.1-beta1", false},
|
|
||||||
{"~*", "2.1.1", true},
|
|
||||||
{"~1.x", "2.1.1", false},
|
|
||||||
{"~1.x", "1.3.5", true},
|
|
||||||
{"~1.x", "1.4", true},
|
|
||||||
{"~1.1", "1.1.1", true},
|
|
||||||
{"~1.1", "1.1.1-alpha", false},
|
|
||||||
{"~1.1-alpha", "1.1.1-beta", true},
|
|
||||||
{"~1.1.1-beta", "1.1.1-alpha", false},
|
|
||||||
{"~1.1.1-beta", "1.1.1", true},
|
|
||||||
{"~1.2.3", "1.2.5", true},
|
|
||||||
{"~1.2.3", "1.2.2", false},
|
|
||||||
{"~1.2.3", "1.3.2", false},
|
|
||||||
{"~1.1", "1.2.3", false},
|
|
||||||
{"~1.3", "2.4.5", false},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tc := range tests {
|
|
||||||
c, err := NewConstraint(tc.constraint)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("err: %s", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
v, err := NewVersion(tc.version)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("err: %s", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
a := c.Check(v)
|
|
||||||
if a != tc.check {
|
|
||||||
t.Errorf("Constraint '%s' failing with '%s'", tc.constraint, tc.version)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestRewriteRange(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
c string
|
|
||||||
nc string
|
|
||||||
}{
|
|
||||||
{"2 - 3", ">= 2, <= 3"},
|
|
||||||
{"2 - 3, 2 - 3", ">= 2, <= 3,>= 2, <= 3"},
|
|
||||||
{"2 - 3, 4.0.0 - 5.1", ">= 2, <= 3,>= 4.0.0, <= 5.1"},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tc := range tests {
|
|
||||||
o := rewriteRange(tc.c)
|
|
||||||
|
|
||||||
if o != tc.nc {
|
|
||||||
t.Errorf("Range %s rewritten incorrectly as '%s'", tc.c, o)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestIsX(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
t string
|
|
||||||
c bool
|
|
||||||
}{
|
|
||||||
{"A", false},
|
|
||||||
{"%", false},
|
|
||||||
{"X", true},
|
|
||||||
{"x", true},
|
|
||||||
{"*", true},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tc := range tests {
|
|
||||||
a := isX(tc.t)
|
|
||||||
if a != tc.c {
|
|
||||||
t.Errorf("Function isX error on %s", tc.t)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestConstraintsValidate(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
constraint string
|
|
||||||
version string
|
|
||||||
check bool
|
|
||||||
}{
|
|
||||||
{"*", "1.2.3", true},
|
|
||||||
{"~0.0.0", "1.2.3", true},
|
|
||||||
{"= 2.0", "1.2.3", false},
|
|
||||||
{"= 2.0", "2.0.0", true},
|
|
||||||
{"4.1", "4.1.0", true},
|
|
||||||
{"4.1.x", "4.1.3", true},
|
|
||||||
{"1.x", "1.4", true},
|
|
||||||
{"!=4.1", "4.1.0", false},
|
|
||||||
{"!=4.1", "5.1.0", true},
|
|
||||||
{"!=4.x", "5.1.0", true},
|
|
||||||
{"!=4.x", "4.1.0", false},
|
|
||||||
{"!=4.1.x", "4.2.0", true},
|
|
||||||
{"!=4.2.x", "4.2.3", false},
|
|
||||||
{">1.1", "4.1.0", true},
|
|
||||||
{">1.1", "1.1.0", false},
|
|
||||||
{"<1.1", "0.1.0", true},
|
|
||||||
{"<1.1", "1.1.0", false},
|
|
||||||
{"<1.1", "1.1.1", false},
|
|
||||||
{"<1.x", "1.1.1", true},
|
|
||||||
{"<1.x", "2.1.1", false},
|
|
||||||
{"<1.1.x", "1.2.1", false},
|
|
||||||
{"<1.1.x", "1.1.500", true},
|
|
||||||
{"<1.2.x", "1.1.1", true},
|
|
||||||
{">=1.1", "4.1.0", true},
|
|
||||||
{">=1.1", "1.1.0", true},
|
|
||||||
{">=1.1", "0.0.9", false},
|
|
||||||
{"<=1.1", "0.1.0", true},
|
|
||||||
{"<=1.1", "1.1.0", true},
|
|
||||||
{"<=1.x", "1.1.0", true},
|
|
||||||
{"<=2.x", "3.1.0", false},
|
|
||||||
{"<=1.1", "1.1.1", false},
|
|
||||||
{"<=1.1.x", "1.2.500", false},
|
|
||||||
{">1.1, <2", "1.1.1", true},
|
|
||||||
{">1.1, <3", "4.3.2", false},
|
|
||||||
{">=1.1, <2, !=1.2.3", "1.2.3", false},
|
|
||||||
{">=1.1, <2, !=1.2.3 || > 3", "3.1.2", true},
|
|
||||||
{">=1.1, <2, !=1.2.3 || >= 3", "3.0.0", true},
|
|
||||||
{">=1.1, <2, !=1.2.3 || > 3", "3.0.0", false},
|
|
||||||
{">=1.1, <2, !=1.2.3 || > 3", "1.2.3", false},
|
|
||||||
{"1.1 - 2", "1.1.1", true},
|
|
||||||
{"1.1-3", "4.3.2", false},
|
|
||||||
{"^1.1", "1.1.1", true},
|
|
||||||
{"^1.1", "1.1.1-alpha", false},
|
|
||||||
{"^1.1.1-alpha", "1.1.1-beta", true},
|
|
||||||
{"^1.1.1-beta", "1.1.1-alpha", false},
|
|
||||||
{"^1.1", "4.3.2", false},
|
|
||||||
{"^1.x", "1.1.1", true},
|
|
||||||
{"^2.x", "1.1.1", false},
|
|
||||||
{"^1.x", "2.1.1", false},
|
|
||||||
{"~*", "2.1.1", true},
|
|
||||||
{"~1.x", "2.1.1", false},
|
|
||||||
{"~1.x", "1.3.5", true},
|
|
||||||
{"~1.x", "1.3.5-beta", false},
|
|
||||||
{"~1.3.6-alpha", "1.3.5-beta", false},
|
|
||||||
{"~1.3.5-alpha", "1.3.5-beta", true},
|
|
||||||
{"~1.3.5-beta", "1.3.5-alpha", false},
|
|
||||||
{"~1.x", "1.4", true},
|
|
||||||
{"~1.1", "1.1.1", true},
|
|
||||||
{"~1.2.3", "1.2.5", true},
|
|
||||||
{"~1.2.3", "1.2.2", false},
|
|
||||||
{"~1.2.3", "1.3.2", false},
|
|
||||||
{"~1.1", "1.2.3", false},
|
|
||||||
{"~1.3", "2.4.5", false},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tc := range tests {
|
|
||||||
c, err := NewConstraint(tc.constraint)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("err: %s", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
v, err := NewVersion(tc.version)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("err: %s", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
a, msgs := c.Validate(v)
|
|
||||||
if a != tc.check {
|
|
||||||
t.Errorf("Constraint '%s' failing with '%s'", tc.constraint, tc.version)
|
|
||||||
} else if !a && len(msgs) == 0 {
|
|
||||||
t.Errorf("%q failed with %q but no errors returned", tc.constraint, tc.version)
|
|
||||||
}
|
|
||||||
|
|
||||||
// if a == false {
|
|
||||||
// for _, m := range msgs {
|
|
||||||
// t.Errorf("%s", m)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
||||||
v, err := NewVersion("1.2.3")
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("err: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
c, err := NewConstraint("!= 1.2.5, ^2, <= 1.1.x")
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("err: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
_, msgs := c.Validate(v)
|
|
||||||
if len(msgs) != 2 {
|
|
||||||
t.Error("Invalid number of validations found")
|
|
||||||
}
|
|
||||||
e := msgs[0].Error()
|
|
||||||
if e != "1.2.3 does not have same major version as 2" {
|
|
||||||
t.Error("Did not get expected message: 1.2.3 does not have same major version as 2")
|
|
||||||
}
|
|
||||||
e = msgs[1].Error()
|
|
||||||
if e != "1.2.3 is greater than 1.1.x" {
|
|
||||||
t.Error("Did not get expected message: 1.2.3 is greater than 1.1.x")
|
|
||||||
}
|
|
||||||
|
|
||||||
tests2 := []struct {
|
|
||||||
constraint, version, msg string
|
|
||||||
}{
|
|
||||||
{"= 2.0", "1.2.3", "1.2.3 is not equal to 2.0"},
|
|
||||||
{"!=4.1", "4.1.0", "4.1.0 is equal to 4.1"},
|
|
||||||
{"!=4.x", "4.1.0", "4.1.0 is equal to 4.x"},
|
|
||||||
{"!=4.2.x", "4.2.3", "4.2.3 is equal to 4.2.x"},
|
|
||||||
{">1.1", "1.1.0", "1.1.0 is less than or equal to 1.1"},
|
|
||||||
{"<1.1", "1.1.0", "1.1.0 is greater than or equal to 1.1"},
|
|
||||||
{"<1.1", "1.1.1", "1.1.1 is greater than or equal to 1.1"},
|
|
||||||
{"<1.x", "2.1.1", "2.1.1 is greater than or equal to 1.x"},
|
|
||||||
{"<1.1.x", "1.2.1", "1.2.1 is greater than or equal to 1.1.x"},
|
|
||||||
{">=1.1", "0.0.9", "0.0.9 is less than 1.1"},
|
|
||||||
{"<=2.x", "3.1.0", "3.1.0 is greater than 2.x"},
|
|
||||||
{"<=1.1", "1.1.1", "1.1.1 is greater than 1.1"},
|
|
||||||
{"<=1.1.x", "1.2.500", "1.2.500 is greater than 1.1.x"},
|
|
||||||
{">1.1, <3", "4.3.2", "4.3.2 is greater than or equal to 3"},
|
|
||||||
{">=1.1, <2, !=1.2.3", "1.2.3", "1.2.3 is equal to 1.2.3"},
|
|
||||||
{">=1.1, <2, !=1.2.3 || > 3", "3.0.0", "3.0.0 is greater than or equal to 2"},
|
|
||||||
{">=1.1, <2, !=1.2.3 || > 3", "1.2.3", "1.2.3 is equal to 1.2.3"},
|
|
||||||
{"1.1 - 3", "4.3.2", "4.3.2 is greater than 3"},
|
|
||||||
{"^1.1", "4.3.2", "4.3.2 does not have same major version as 1.1"},
|
|
||||||
{"^2.x", "1.1.1", "1.1.1 does not have same major version as 2.x"},
|
|
||||||
{"^1.x", "2.1.1", "2.1.1 does not have same major version as 1.x"},
|
|
||||||
{"~1.x", "2.1.1", "2.1.1 does not have same major and minor version as 1.x"},
|
|
||||||
{"~1.2.3", "1.2.2", "1.2.2 does not have same major and minor version as 1.2.3"},
|
|
||||||
{"~1.2.3", "1.3.2", "1.3.2 does not have same major and minor version as 1.2.3"},
|
|
||||||
{"~1.1", "1.2.3", "1.2.3 does not have same major and minor version as 1.1"},
|
|
||||||
{"~1.3", "2.4.5", "2.4.5 does not have same major and minor version as 1.3"},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tc := range tests2 {
|
|
||||||
c, err := NewConstraint(tc.constraint)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("err: %s", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
v, err := NewVersion(tc.version)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("err: %s", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
_, msgs := c.Validate(v)
|
|
||||||
e := msgs[0].Error()
|
|
||||||
if e != tc.msg {
|
|
||||||
t.Errorf("Did not get expected message %q: %s", tc.msg, e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
450
vendor/github.com/Masterminds/semver/version_test.go
generated
vendored
450
vendor/github.com/Masterminds/semver/version_test.go
generated
vendored
@@ -1,450 +0,0 @@
|
|||||||
package semver
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestNewVersion(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
version string
|
|
||||||
err bool
|
|
||||||
}{
|
|
||||||
{"1.2.3", false},
|
|
||||||
{"v1.2.3", false},
|
|
||||||
{"1.0", false},
|
|
||||||
{"v1.0", false},
|
|
||||||
{"1", false},
|
|
||||||
{"v1", false},
|
|
||||||
{"1.2.beta", true},
|
|
||||||
{"v1.2.beta", true},
|
|
||||||
{"foo", true},
|
|
||||||
{"1.2-5", false},
|
|
||||||
{"v1.2-5", false},
|
|
||||||
{"1.2-beta.5", false},
|
|
||||||
{"v1.2-beta.5", false},
|
|
||||||
{"\n1.2", true},
|
|
||||||
{"\nv1.2", true},
|
|
||||||
{"1.2.0-x.Y.0+metadata", false},
|
|
||||||
{"v1.2.0-x.Y.0+metadata", false},
|
|
||||||
{"1.2.0-x.Y.0+metadata-width-hypen", false},
|
|
||||||
{"v1.2.0-x.Y.0+metadata-width-hypen", false},
|
|
||||||
{"1.2.3-rc1-with-hypen", false},
|
|
||||||
{"v1.2.3-rc1-with-hypen", false},
|
|
||||||
{"1.2.3.4", true},
|
|
||||||
{"v1.2.3.4", true},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tc := range tests {
|
|
||||||
_, err := NewVersion(tc.version)
|
|
||||||
if tc.err && err == nil {
|
|
||||||
t.Fatalf("expected error for version: %s", tc.version)
|
|
||||||
} else if !tc.err && err != nil {
|
|
||||||
t.Fatalf("error for version %s: %s", tc.version, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestOriginal(t *testing.T) {
|
|
||||||
tests := []string{
|
|
||||||
"1.2.3",
|
|
||||||
"v1.2.3",
|
|
||||||
"1.0",
|
|
||||||
"v1.0",
|
|
||||||
"1",
|
|
||||||
"v1",
|
|
||||||
"1.2-5",
|
|
||||||
"v1.2-5",
|
|
||||||
"1.2-beta.5",
|
|
||||||
"v1.2-beta.5",
|
|
||||||
"1.2.0-x.Y.0+metadata",
|
|
||||||
"v1.2.0-x.Y.0+metadata",
|
|
||||||
"1.2.0-x.Y.0+metadata-width-hypen",
|
|
||||||
"v1.2.0-x.Y.0+metadata-width-hypen",
|
|
||||||
"1.2.3-rc1-with-hypen",
|
|
||||||
"v1.2.3-rc1-with-hypen",
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tc := range tests {
|
|
||||||
v, err := NewVersion(tc)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Error parsing version %s", tc)
|
|
||||||
}
|
|
||||||
|
|
||||||
o := v.Original()
|
|
||||||
if o != tc {
|
|
||||||
t.Errorf("Error retrieving originl. Expected '%s' but got '%s'", tc, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestParts(t *testing.T) {
|
|
||||||
v, err := NewVersion("1.2.3-beta.1+build.123")
|
|
||||||
if err != nil {
|
|
||||||
t.Error("Error parsing version 1.2.3-beta.1+build.123")
|
|
||||||
}
|
|
||||||
|
|
||||||
if v.Major() != 1 {
|
|
||||||
t.Error("Major() returning wrong value")
|
|
||||||
}
|
|
||||||
if v.Minor() != 2 {
|
|
||||||
t.Error("Minor() returning wrong value")
|
|
||||||
}
|
|
||||||
if v.Patch() != 3 {
|
|
||||||
t.Error("Patch() returning wrong value")
|
|
||||||
}
|
|
||||||
if v.Prerelease() != "beta.1" {
|
|
||||||
t.Error("Prerelease() returning wrong value")
|
|
||||||
}
|
|
||||||
if v.Metadata() != "build.123" {
|
|
||||||
t.Error("Metadata() returning wrong value")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestString(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
version string
|
|
||||||
expected string
|
|
||||||
}{
|
|
||||||
{"1.2.3", "1.2.3"},
|
|
||||||
{"v1.2.3", "1.2.3"},
|
|
||||||
{"1.0", "1.0.0"},
|
|
||||||
{"v1.0", "1.0.0"},
|
|
||||||
{"1", "1.0.0"},
|
|
||||||
{"v1", "1.0.0"},
|
|
||||||
{"1.2-5", "1.2.0-5"},
|
|
||||||
{"v1.2-5", "1.2.0-5"},
|
|
||||||
{"1.2-beta.5", "1.2.0-beta.5"},
|
|
||||||
{"v1.2-beta.5", "1.2.0-beta.5"},
|
|
||||||
{"1.2.0-x.Y.0+metadata", "1.2.0-x.Y.0+metadata"},
|
|
||||||
{"v1.2.0-x.Y.0+metadata", "1.2.0-x.Y.0+metadata"},
|
|
||||||
{"1.2.0-x.Y.0+metadata-width-hypen", "1.2.0-x.Y.0+metadata-width-hypen"},
|
|
||||||
{"v1.2.0-x.Y.0+metadata-width-hypen", "1.2.0-x.Y.0+metadata-width-hypen"},
|
|
||||||
{"1.2.3-rc1-with-hypen", "1.2.3-rc1-with-hypen"},
|
|
||||||
{"v1.2.3-rc1-with-hypen", "1.2.3-rc1-with-hypen"},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tc := range tests {
|
|
||||||
v, err := NewVersion(tc.version)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Error parsing version %s", tc)
|
|
||||||
}
|
|
||||||
|
|
||||||
s := v.String()
|
|
||||||
if s != tc.expected {
|
|
||||||
t.Errorf("Error generating string. Expected '%s' but got '%s'", tc.expected, s)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCompare(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
v1 string
|
|
||||||
v2 string
|
|
||||||
expected int
|
|
||||||
}{
|
|
||||||
{"1.2.3", "1.5.1", -1},
|
|
||||||
{"2.2.3", "1.5.1", 1},
|
|
||||||
{"2.2.3", "2.2.2", 1},
|
|
||||||
{"3.2-beta", "3.2-beta", 0},
|
|
||||||
{"1.3", "1.1.4", 1},
|
|
||||||
{"4.2", "4.2-beta", 1},
|
|
||||||
{"4.2-beta", "4.2", -1},
|
|
||||||
{"4.2-alpha", "4.2-beta", -1},
|
|
||||||
{"4.2-alpha", "4.2-alpha", 0},
|
|
||||||
{"4.2-beta.2", "4.2-beta.1", 1},
|
|
||||||
{"4.2-beta2", "4.2-beta1", 1},
|
|
||||||
{"4.2-beta", "4.2-beta.2", -1},
|
|
||||||
{"4.2-beta", "4.2-beta.foo", 1},
|
|
||||||
{"4.2-beta.2", "4.2-beta", 1},
|
|
||||||
{"4.2-beta.foo", "4.2-beta", -1},
|
|
||||||
{"1.2+bar", "1.2+baz", 0},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tc := range tests {
|
|
||||||
v1, err := NewVersion(tc.v1)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Error parsing version: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
v2, err := NewVersion(tc.v2)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Error parsing version: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
a := v1.Compare(v2)
|
|
||||||
e := tc.expected
|
|
||||||
if a != e {
|
|
||||||
t.Errorf(
|
|
||||||
"Comparison of '%s' and '%s' failed. Expected '%d', got '%d'",
|
|
||||||
tc.v1, tc.v2, e, a,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestLessThan(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
v1 string
|
|
||||||
v2 string
|
|
||||||
expected bool
|
|
||||||
}{
|
|
||||||
{"1.2.3", "1.5.1", true},
|
|
||||||
{"2.2.3", "1.5.1", false},
|
|
||||||
{"3.2-beta", "3.2-beta", false},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tc := range tests {
|
|
||||||
v1, err := NewVersion(tc.v1)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Error parsing version: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
v2, err := NewVersion(tc.v2)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Error parsing version: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
a := v1.LessThan(v2)
|
|
||||||
e := tc.expected
|
|
||||||
if a != e {
|
|
||||||
t.Errorf(
|
|
||||||
"Comparison of '%s' and '%s' failed. Expected '%t', got '%t'",
|
|
||||||
tc.v1, tc.v2, e, a,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestGreaterThan(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
v1 string
|
|
||||||
v2 string
|
|
||||||
expected bool
|
|
||||||
}{
|
|
||||||
{"1.2.3", "1.5.1", false},
|
|
||||||
{"2.2.3", "1.5.1", true},
|
|
||||||
{"3.2-beta", "3.2-beta", false},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tc := range tests {
|
|
||||||
v1, err := NewVersion(tc.v1)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Error parsing version: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
v2, err := NewVersion(tc.v2)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Error parsing version: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
a := v1.GreaterThan(v2)
|
|
||||||
e := tc.expected
|
|
||||||
if a != e {
|
|
||||||
t.Errorf(
|
|
||||||
"Comparison of '%s' and '%s' failed. Expected '%t', got '%t'",
|
|
||||||
tc.v1, tc.v2, e, a,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestEqual(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
v1 string
|
|
||||||
v2 string
|
|
||||||
expected bool
|
|
||||||
}{
|
|
||||||
{"1.2.3", "1.5.1", false},
|
|
||||||
{"2.2.3", "1.5.1", false},
|
|
||||||
{"3.2-beta", "3.2-beta", true},
|
|
||||||
{"3.2-beta+foo", "3.2-beta+bar", true},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tc := range tests {
|
|
||||||
v1, err := NewVersion(tc.v1)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Error parsing version: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
v2, err := NewVersion(tc.v2)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Error parsing version: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
a := v1.Equal(v2)
|
|
||||||
e := tc.expected
|
|
||||||
if a != e {
|
|
||||||
t.Errorf(
|
|
||||||
"Comparison of '%s' and '%s' failed. Expected '%t', got '%t'",
|
|
||||||
tc.v1, tc.v2, e, a,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestInc(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
v1 string
|
|
||||||
expected string
|
|
||||||
how string
|
|
||||||
expectedOriginal string
|
|
||||||
}{
|
|
||||||
{"1.2.3", "1.2.4", "patch", "1.2.4"},
|
|
||||||
{"v1.2.4", "1.2.5", "patch", "v1.2.5"},
|
|
||||||
{"1.2.3", "1.3.0", "minor", "1.3.0"},
|
|
||||||
{"v1.2.4", "1.3.0", "minor", "v1.3.0"},
|
|
||||||
{"1.2.3", "2.0.0", "major", "2.0.0"},
|
|
||||||
{"v1.2.4", "2.0.0", "major", "v2.0.0"},
|
|
||||||
{"1.2.3+meta", "1.2.4", "patch", "1.2.4"},
|
|
||||||
{"1.2.3-beta+meta", "1.2.3", "patch", "1.2.3"},
|
|
||||||
{"v1.2.4-beta+meta", "1.2.4", "patch", "v1.2.4"},
|
|
||||||
{"1.2.3-beta+meta", "1.3.0", "minor", "1.3.0"},
|
|
||||||
{"v1.2.4-beta+meta", "1.3.0", "minor", "v1.3.0"},
|
|
||||||
{"1.2.3-beta+meta", "2.0.0", "major", "2.0.0"},
|
|
||||||
{"v1.2.4-beta+meta", "2.0.0", "major", "v2.0.0"},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tc := range tests {
|
|
||||||
v1, err := NewVersion(tc.v1)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Error parsing version: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
var v2 Version
|
|
||||||
switch tc.how {
|
|
||||||
case "patch":
|
|
||||||
v2 = v1.IncPatch()
|
|
||||||
case "minor":
|
|
||||||
v2 = v1.IncMinor()
|
|
||||||
case "major":
|
|
||||||
v2 = v1.IncMajor()
|
|
||||||
}
|
|
||||||
|
|
||||||
a := v2.String()
|
|
||||||
e := tc.expected
|
|
||||||
if a != e {
|
|
||||||
t.Errorf(
|
|
||||||
"Inc %q failed. Expected %q got %q",
|
|
||||||
tc.how, e, a,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
a = v2.Original()
|
|
||||||
e = tc.expectedOriginal
|
|
||||||
if a != e {
|
|
||||||
t.Errorf(
|
|
||||||
"Inc %q failed. Expected original %q got %q",
|
|
||||||
tc.how, e, a,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestSetPrerelease(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
v1 string
|
|
||||||
prerelease string
|
|
||||||
expectedVersion string
|
|
||||||
expectedPrerelease string
|
|
||||||
expectedOriginal string
|
|
||||||
expectedErr error
|
|
||||||
}{
|
|
||||||
{"1.2.3", "**", "1.2.3", "", "1.2.3", ErrInvalidPrerelease},
|
|
||||||
{"1.2.3", "beta", "1.2.3-beta", "beta", "1.2.3-beta", nil},
|
|
||||||
{"v1.2.4", "beta", "1.2.4-beta", "beta", "v1.2.4-beta", nil},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tc := range tests {
|
|
||||||
v1, err := NewVersion(tc.v1)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Error parsing version: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
v2, err := v1.SetPrerelease(tc.prerelease)
|
|
||||||
if err != tc.expectedErr {
|
|
||||||
t.Errorf("Expected to get err=%s, but got err=%s", tc.expectedErr, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
a := v2.Prerelease()
|
|
||||||
e := tc.expectedPrerelease
|
|
||||||
if a != e {
|
|
||||||
t.Errorf("Expected prerelease value=%q, but got %q", e, a)
|
|
||||||
}
|
|
||||||
|
|
||||||
a = v2.String()
|
|
||||||
e = tc.expectedVersion
|
|
||||||
if a != e {
|
|
||||||
t.Errorf("Expected version string=%q, but got %q", e, a)
|
|
||||||
}
|
|
||||||
|
|
||||||
a = v2.Original()
|
|
||||||
e = tc.expectedOriginal
|
|
||||||
if a != e {
|
|
||||||
t.Errorf("Expected version original=%q, but got %q", e, a)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestSetMetadata(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
v1 string
|
|
||||||
metadata string
|
|
||||||
expectedVersion string
|
|
||||||
expectedMetadata string
|
|
||||||
expectedOriginal string
|
|
||||||
expectedErr error
|
|
||||||
}{
|
|
||||||
{"1.2.3", "**", "1.2.3", "", "1.2.3", ErrInvalidMetadata},
|
|
||||||
{"1.2.3", "meta", "1.2.3+meta", "meta", "1.2.3+meta", nil},
|
|
||||||
{"v1.2.4", "meta", "1.2.4+meta", "meta", "v1.2.4+meta", nil},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tc := range tests {
|
|
||||||
v1, err := NewVersion(tc.v1)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Error parsing version: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
v2, err := v1.SetMetadata(tc.metadata)
|
|
||||||
if err != tc.expectedErr {
|
|
||||||
t.Errorf("Expected to get err=%s, but got err=%s", tc.expectedErr, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
a := v2.Metadata()
|
|
||||||
e := tc.expectedMetadata
|
|
||||||
if a != e {
|
|
||||||
t.Errorf("Expected metadata value=%q, but got %q", e, a)
|
|
||||||
}
|
|
||||||
|
|
||||||
a = v2.String()
|
|
||||||
e = tc.expectedVersion
|
|
||||||
if e != a {
|
|
||||||
t.Errorf("Expected version string=%q, but got %q", e, a)
|
|
||||||
}
|
|
||||||
|
|
||||||
a = v2.Original()
|
|
||||||
e = tc.expectedOriginal
|
|
||||||
if a != e {
|
|
||||||
t.Errorf("Expected version original=%q, but got %q", e, a)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestOriginalVPrefix(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
version string
|
|
||||||
vprefix string
|
|
||||||
}{
|
|
||||||
{"1.2.3", ""},
|
|
||||||
{"v1.2.4", "v"},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tc := range tests {
|
|
||||||
v1, _ := NewVersion(tc.version)
|
|
||||||
a := v1.originalVPrefix()
|
|
||||||
e := tc.vprefix
|
|
||||||
if a != e {
|
|
||||||
t.Errorf("Expected vprefix=%q, but got %q", e, a)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
24
vendor/github.com/Masterminds/sprig/.travis.yml
generated
vendored
24
vendor/github.com/Masterminds/sprig/.travis.yml
generated
vendored
@@ -1,24 +0,0 @@
|
|||||||
language: go
|
|
||||||
|
|
||||||
go:
|
|
||||||
- 1.6
|
|
||||||
- 1.7
|
|
||||||
- 1.8
|
|
||||||
- tip
|
|
||||||
|
|
||||||
# Setting sudo access to false will let Travis CI use containers rather than
|
|
||||||
# VMs to run the tests. For more details see:
|
|
||||||
# - http://docs.travis-ci.com/user/workers/container-based-infrastructure/
|
|
||||||
# - http://docs.travis-ci.com/user/workers/standard-infrastructure/
|
|
||||||
sudo: false
|
|
||||||
|
|
||||||
script:
|
|
||||||
- make setup test
|
|
||||||
|
|
||||||
notifications:
|
|
||||||
webhooks:
|
|
||||||
urls:
|
|
||||||
- https://webhooks.gitter.im/e/06e3328629952dabe3e0
|
|
||||||
on_success: change # options: [always|never|change] default: always
|
|
||||||
on_failure: always # options: [always|never|change] default: always
|
|
||||||
on_start: never # options: [always|never|change] default: always
|
|
121
vendor/github.com/Masterminds/sprig/CHANGELOG.md
generated
vendored
121
vendor/github.com/Masterminds/sprig/CHANGELOG.md
generated
vendored
@@ -1,16 +1,131 @@
|
|||||||
# Release 1.2.0 (2016-02-01)
|
# Changelog
|
||||||
|
|
||||||
|
## Release 2.14.1 (2017-12-01)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- #60: Fix typo in function name documentation (thanks @neil-ca-moore)
|
||||||
|
- #61: Removing line with {{ due to blocking github pages genertion
|
||||||
|
- #64: Update the list functions to handle int, string, and other slices for compatibility
|
||||||
|
|
||||||
|
## Release 2.14.0 (2017-10-06)
|
||||||
|
|
||||||
|
This new version of Sprig adds a set of functions for generating and working with SSL certificates.
|
||||||
|
|
||||||
|
- `genCA` generates an SSL Certificate Authority
|
||||||
|
- `genSelfSignedCert` generates an SSL self-signed certificate
|
||||||
|
- `genSignedCert` generates an SSL certificate and key based on a given CA
|
||||||
|
|
||||||
|
## Release 2.13.0 (2017-09-18)
|
||||||
|
|
||||||
|
This release adds new functions, including:
|
||||||
|
|
||||||
|
- `regexMatch`, `regexFindAll`, `regexFind`, `regexReplaceAll`, `regexReplaceAllLiteral`, and `regexSplit` to work with regular expressions
|
||||||
|
- `floor`, `ceil`, and `round` math functions
|
||||||
|
- `toDate` converts a string to a date
|
||||||
|
- `nindent` is just like `indent` but also prepends a new line
|
||||||
|
- `ago` returns the time from `time.Now`
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- #40: Added basic regex functionality (thanks @alanquillin)
|
||||||
|
- #41: Added ceil floor and round functions (thanks @alanquillin)
|
||||||
|
- #48: Added toDate function (thanks @andreynering)
|
||||||
|
- #50: Added nindent function (thanks @binoculars)
|
||||||
|
- #46: Added ago function (thanks @slayer)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- #51: Updated godocs to include new string functions (thanks @curtisallen)
|
||||||
|
- #49: Added ability to merge multiple dicts (thanks @binoculars)
|
||||||
|
|
||||||
|
## Release 2.12.0 (2017-05-17)
|
||||||
|
|
||||||
|
- `snakecase`, `camelcase`, and `shuffle` are three new string functions
|
||||||
|
- `fail` allows you to bail out of a template render when conditions are not met
|
||||||
|
|
||||||
|
## Release 2.11.0 (2017-05-02)
|
||||||
|
|
||||||
|
- Added `toJson` and `toPrettyJson`
|
||||||
|
- Added `merge`
|
||||||
|
- Refactored documentation
|
||||||
|
|
||||||
|
## Release 2.10.0 (2017-03-15)
|
||||||
|
|
||||||
|
- Added `semver` and `semverCompare` for Semantic Versions
|
||||||
|
- `list` replaces `tuple`
|
||||||
|
- Fixed issue with `join`
|
||||||
|
- Added `first`, `last`, `intial`, `rest`, `prepend`, `append`, `toString`, `toStrings`, `sortAlpha`, `reverse`, `coalesce`, `pluck`, `pick`, `compact`, `keys`, `omit`, `uniq`, `has`, `without`
|
||||||
|
|
||||||
|
## Release 2.9.0 (2017-02-23)
|
||||||
|
|
||||||
|
- Added `splitList` to split a list
|
||||||
|
- Added crypto functions of `genPrivateKey` and `derivePassword`
|
||||||
|
|
||||||
|
## Release 2.8.0 (2016-12-21)
|
||||||
|
|
||||||
|
- Added access to several path functions (`base`, `dir`, `clean`, `ext`, and `abs`)
|
||||||
|
- Added functions for _mutating_ dictionaries (`set`, `unset`, `hasKey`)
|
||||||
|
|
||||||
|
## Release 2.7.0 (2016-12-01)
|
||||||
|
|
||||||
|
- Added `sha256sum` to generate a hash of an input
|
||||||
|
- Added functions to convert a numeric or string to `int`, `int64`, `float64`
|
||||||
|
|
||||||
|
## Release 2.6.0 (2016-10-03)
|
||||||
|
|
||||||
|
- Added a `uuidv4` template function for generating UUIDs inside of a template.
|
||||||
|
|
||||||
|
## Release 2.5.0 (2016-08-19)
|
||||||
|
|
||||||
|
- New `trimSuffix`, `trimPrefix`, `hasSuffix`, and `hasPrefix` functions
|
||||||
|
- New aliases have been added for a few functions that didn't follow the naming conventions (`trimAll` and `abbrevBoth`)
|
||||||
|
- `trimall` and `abbrevboth` (notice the case) are deprecated and will be removed in 3.0.0
|
||||||
|
|
||||||
|
## Release 2.4.0 (2016-08-16)
|
||||||
|
|
||||||
|
- Adds two functions: `until` and `untilStep`
|
||||||
|
|
||||||
|
## Release 2.3.0 (2016-06-21)
|
||||||
|
|
||||||
|
- cat: Concatenate strings with whitespace separators.
|
||||||
|
- replace: Replace parts of a string: `replace " " "-" "Me First"` renders "Me-First"
|
||||||
|
- plural: Format plurals: `len "foo" | plural "one foo" "many foos"` renders "many foos"
|
||||||
|
- indent: Indent blocks of text in a way that is sensitive to "\n" characters.
|
||||||
|
|
||||||
|
## Release 2.2.0 (2016-04-21)
|
||||||
|
|
||||||
|
- Added a `genPrivateKey` function (Thanks @bacongobbler)
|
||||||
|
|
||||||
|
## Release 2.1.0 (2016-03-30)
|
||||||
|
|
||||||
|
- `default` now prints the default value when it does not receive a value down the pipeline. It is much safer now to do `{{.Foo | default "bar"}}`.
|
||||||
|
- Added accessors for "hermetic" functions. These return only functions that, when given the same input, produce the same output.
|
||||||
|
|
||||||
|
## Release 2.0.0 (2016-03-29)
|
||||||
|
|
||||||
|
Because we switched from `int` to `int64` as the return value for all integer math functions, the library's major version number has been incremented.
|
||||||
|
|
||||||
|
- `min` complements `max` (formerly `biggest`)
|
||||||
|
- `empty` indicates that a value is the empty value for its type
|
||||||
|
- `tuple` creates a tuple inside of a template: `{{$t := tuple "a", "b" "c"}}`
|
||||||
|
- `dict` creates a dictionary inside of a template `{{$d := dict "key1" "val1" "key2" "val2"}}`
|
||||||
|
- Date formatters have been added for HTML dates (as used in `date` input fields)
|
||||||
|
- Integer math functions can convert from a number of types, including `string` (via `strconv.ParseInt`).
|
||||||
|
|
||||||
|
## Release 1.2.0 (2016-02-01)
|
||||||
|
|
||||||
- Added quote and squote
|
- Added quote and squote
|
||||||
- Added b32enc and b32dec
|
- Added b32enc and b32dec
|
||||||
- add now takes varargs
|
- add now takes varargs
|
||||||
- biggest now takes varargs
|
- biggest now takes varargs
|
||||||
|
|
||||||
# Release 1.1.0 (2015-12-29)
|
## Release 1.1.0 (2015-12-29)
|
||||||
|
|
||||||
- Added #4: Added contains function. strings.Contains, but with the arguments
|
- Added #4: Added contains function. strings.Contains, but with the arguments
|
||||||
switched to simplify common pipelines. (thanks krancour)
|
switched to simplify common pipelines. (thanks krancour)
|
||||||
- Added Travis-CI testing support
|
- Added Travis-CI testing support
|
||||||
|
|
||||||
# Release 1.0.0 (2015-12-23)
|
## Release 1.0.0 (2015-12-23)
|
||||||
|
|
||||||
- Initial release
|
- Initial release
|
||||||
|
232
vendor/github.com/Masterminds/sprig/crypto.go
generated
vendored
232
vendor/github.com/Masterminds/sprig/crypto.go
generated
vendored
@@ -10,12 +10,16 @@ import (
|
|||||||
"crypto/rsa"
|
"crypto/rsa"
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
"crypto/x509"
|
"crypto/x509"
|
||||||
|
"crypto/x509/pkix"
|
||||||
"encoding/asn1"
|
"encoding/asn1"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"encoding/pem"
|
"encoding/pem"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/big"
|
"math/big"
|
||||||
|
"net"
|
||||||
|
"time"
|
||||||
|
|
||||||
uuid "github.com/satori/go.uuid"
|
uuid "github.com/satori/go.uuid"
|
||||||
"golang.org/x/crypto/scrypt"
|
"golang.org/x/crypto/scrypt"
|
||||||
@@ -146,3 +150,231 @@ func pemBlockForKey(priv interface{}) *pem.Block {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type certificate struct {
|
||||||
|
Cert string
|
||||||
|
Key string
|
||||||
|
}
|
||||||
|
|
||||||
|
func generateCertificateAuthority(
|
||||||
|
cn string,
|
||||||
|
daysValid int,
|
||||||
|
) (certificate, error) {
|
||||||
|
ca := certificate{}
|
||||||
|
|
||||||
|
template, err := getBaseCertTemplate(cn, nil, nil, daysValid)
|
||||||
|
if err != nil {
|
||||||
|
return ca, err
|
||||||
|
}
|
||||||
|
// Override KeyUsage and IsCA
|
||||||
|
template.KeyUsage = x509.KeyUsageKeyEncipherment |
|
||||||
|
x509.KeyUsageDigitalSignature |
|
||||||
|
x509.KeyUsageCertSign
|
||||||
|
template.IsCA = true
|
||||||
|
|
||||||
|
priv, err := rsa.GenerateKey(rand.Reader, 2048)
|
||||||
|
if err != nil {
|
||||||
|
return ca, fmt.Errorf("error generating rsa key: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
ca.Cert, ca.Key, err = getCertAndKey(template, priv, template, priv)
|
||||||
|
if err != nil {
|
||||||
|
return ca, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return ca, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func generateSelfSignedCertificate(
|
||||||
|
cn string,
|
||||||
|
ips []interface{},
|
||||||
|
alternateDNS []interface{},
|
||||||
|
daysValid int,
|
||||||
|
) (certificate, error) {
|
||||||
|
cert := certificate{}
|
||||||
|
|
||||||
|
template, err := getBaseCertTemplate(cn, ips, alternateDNS, daysValid)
|
||||||
|
if err != nil {
|
||||||
|
return cert, err
|
||||||
|
}
|
||||||
|
|
||||||
|
priv, err := rsa.GenerateKey(rand.Reader, 2048)
|
||||||
|
if err != nil {
|
||||||
|
return cert, fmt.Errorf("error generating rsa key: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
cert.Cert, cert.Key, err = getCertAndKey(template, priv, template, priv)
|
||||||
|
if err != nil {
|
||||||
|
return cert, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return cert, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func generateSignedCertificate(
|
||||||
|
cn string,
|
||||||
|
ips []interface{},
|
||||||
|
alternateDNS []interface{},
|
||||||
|
daysValid int,
|
||||||
|
ca certificate,
|
||||||
|
) (certificate, error) {
|
||||||
|
cert := certificate{}
|
||||||
|
|
||||||
|
decodedSignerCert, _ := pem.Decode([]byte(ca.Cert))
|
||||||
|
if decodedSignerCert == nil {
|
||||||
|
return cert, errors.New("unable to decode certificate")
|
||||||
|
}
|
||||||
|
signerCert, err := x509.ParseCertificate(decodedSignerCert.Bytes)
|
||||||
|
if err != nil {
|
||||||
|
return cert, fmt.Errorf(
|
||||||
|
"error parsing certificate: decodedSignerCert.Bytes: %s",
|
||||||
|
err,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
decodedSignerKey, _ := pem.Decode([]byte(ca.Key))
|
||||||
|
if decodedSignerKey == nil {
|
||||||
|
return cert, errors.New("unable to decode key")
|
||||||
|
}
|
||||||
|
signerKey, err := x509.ParsePKCS1PrivateKey(decodedSignerKey.Bytes)
|
||||||
|
if err != nil {
|
||||||
|
return cert, fmt.Errorf(
|
||||||
|
"error parsing prive key: decodedSignerKey.Bytes: %s",
|
||||||
|
err,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
template, err := getBaseCertTemplate(cn, ips, alternateDNS, daysValid)
|
||||||
|
if err != nil {
|
||||||
|
return cert, err
|
||||||
|
}
|
||||||
|
|
||||||
|
priv, err := rsa.GenerateKey(rand.Reader, 2048)
|
||||||
|
if err != nil {
|
||||||
|
return cert, fmt.Errorf("error generating rsa key: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
cert.Cert, cert.Key, err = getCertAndKey(
|
||||||
|
template,
|
||||||
|
priv,
|
||||||
|
signerCert,
|
||||||
|
signerKey,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return cert, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return cert, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getCertAndKey(
|
||||||
|
template *x509.Certificate,
|
||||||
|
signeeKey *rsa.PrivateKey,
|
||||||
|
parent *x509.Certificate,
|
||||||
|
signingKey *rsa.PrivateKey,
|
||||||
|
) (string, string, error) {
|
||||||
|
derBytes, err := x509.CreateCertificate(
|
||||||
|
rand.Reader,
|
||||||
|
template,
|
||||||
|
parent,
|
||||||
|
&signeeKey.PublicKey,
|
||||||
|
signingKey,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return "", "", fmt.Errorf("error creating certificate: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
certBuffer := bytes.Buffer{}
|
||||||
|
if err := pem.Encode(
|
||||||
|
&certBuffer,
|
||||||
|
&pem.Block{Type: "CERTIFICATE", Bytes: derBytes},
|
||||||
|
); err != nil {
|
||||||
|
return "", "", fmt.Errorf("error pem-encoding certificate: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
keyBuffer := bytes.Buffer{}
|
||||||
|
if err := pem.Encode(
|
||||||
|
&keyBuffer,
|
||||||
|
&pem.Block{
|
||||||
|
Type: "RSA PRIVATE KEY",
|
||||||
|
Bytes: x509.MarshalPKCS1PrivateKey(signeeKey),
|
||||||
|
},
|
||||||
|
); err != nil {
|
||||||
|
return "", "", fmt.Errorf("error pem-encoding key: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return string(certBuffer.Bytes()), string(keyBuffer.Bytes()), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getBaseCertTemplate(
|
||||||
|
cn string,
|
||||||
|
ips []interface{},
|
||||||
|
alternateDNS []interface{},
|
||||||
|
daysValid int,
|
||||||
|
) (*x509.Certificate, error) {
|
||||||
|
ipAddresses, err := getNetIPs(ips)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
dnsNames, err := getAlternateDNSStrs(alternateDNS)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &x509.Certificate{
|
||||||
|
SerialNumber: big.NewInt(1),
|
||||||
|
Subject: pkix.Name{
|
||||||
|
CommonName: cn,
|
||||||
|
},
|
||||||
|
IPAddresses: ipAddresses,
|
||||||
|
DNSNames: dnsNames,
|
||||||
|
NotBefore: time.Now(),
|
||||||
|
NotAfter: time.Now().Add(time.Hour * 24 * time.Duration(daysValid)),
|
||||||
|
KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
|
||||||
|
ExtKeyUsage: []x509.ExtKeyUsage{
|
||||||
|
x509.ExtKeyUsageServerAuth,
|
||||||
|
x509.ExtKeyUsageClientAuth,
|
||||||
|
},
|
||||||
|
BasicConstraintsValid: true,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getNetIPs(ips []interface{}) ([]net.IP, error) {
|
||||||
|
if ips == nil {
|
||||||
|
return []net.IP{}, nil
|
||||||
|
}
|
||||||
|
var ipStr string
|
||||||
|
var ok bool
|
||||||
|
var netIP net.IP
|
||||||
|
netIPs := make([]net.IP, len(ips))
|
||||||
|
for i, ip := range ips {
|
||||||
|
ipStr, ok = ip.(string)
|
||||||
|
if !ok {
|
||||||
|
return nil, fmt.Errorf("error parsing ip: %v is not a string", ip)
|
||||||
|
}
|
||||||
|
netIP = net.ParseIP(ipStr)
|
||||||
|
if netIP == nil {
|
||||||
|
return nil, fmt.Errorf("error parsing ip: %s", ipStr)
|
||||||
|
}
|
||||||
|
netIPs[i] = netIP
|
||||||
|
}
|
||||||
|
return netIPs, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getAlternateDNSStrs(alternateDNS []interface{}) ([]string, error) {
|
||||||
|
if alternateDNS == nil {
|
||||||
|
return []string{}, nil
|
||||||
|
}
|
||||||
|
var dnsStr string
|
||||||
|
var ok bool
|
||||||
|
alternateDNSStrs := make([]string, len(alternateDNS))
|
||||||
|
for i, dns := range alternateDNS {
|
||||||
|
dnsStr, ok = dns.(string)
|
||||||
|
if !ok {
|
||||||
|
return nil, fmt.Errorf(
|
||||||
|
"error processing alternate dns name: %v is not a string",
|
||||||
|
dns,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
alternateDNSStrs[i] = dnsStr
|
||||||
|
}
|
||||||
|
return alternateDNSStrs, nil
|
||||||
|
}
|
||||||
|
110
vendor/github.com/Masterminds/sprig/crypto_test.go
generated
vendored
110
vendor/github.com/Masterminds/sprig/crypto_test.go
generated
vendored
@@ -1,110 +0,0 @@
|
|||||||
package sprig
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strings"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestSha256Sum(t *testing.T) {
|
|
||||||
tpl := `{{"abc" | sha256sum}}`
|
|
||||||
if err := runt(tpl, "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"); err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestDerivePassword(t *testing.T) {
|
|
||||||
expectations := map[string]string{
|
|
||||||
`{{derivePassword 1 "long" "password" "user" "example.com"}}`: "ZedaFaxcZaso9*",
|
|
||||||
`{{derivePassword 2 "long" "password" "user" "example.com"}}`: "Fovi2@JifpTupx",
|
|
||||||
`{{derivePassword 1 "maximum" "password" "user" "example.com"}}`: "pf4zS1LjCg&LjhsZ7T2~",
|
|
||||||
`{{derivePassword 1 "medium" "password" "user" "example.com"}}`: "ZedJuz8$",
|
|
||||||
`{{derivePassword 1 "basic" "password" "user" "example.com"}}`: "pIS54PLs",
|
|
||||||
`{{derivePassword 1 "short" "password" "user" "example.com"}}`: "Zed5",
|
|
||||||
`{{derivePassword 1 "pin" "password" "user" "example.com"}}`: "6685",
|
|
||||||
}
|
|
||||||
|
|
||||||
for tpl, result := range expectations {
|
|
||||||
out, err := runRaw(tpl, nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
if 0 != strings.Compare(out, result) {
|
|
||||||
t.Error("Generated password does not match for", tpl)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE(bacongobbler): this test is really _slow_ because of how long it takes to compute
|
|
||||||
// and generate a new crypto key.
|
|
||||||
func TestGenPrivateKey(t *testing.T) {
|
|
||||||
// test that calling by default generates an RSA private key
|
|
||||||
tpl := `{{genPrivateKey ""}}`
|
|
||||||
out, err := runRaw(tpl, nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
if !strings.Contains(out, "RSA PRIVATE KEY") {
|
|
||||||
t.Error("Expected RSA PRIVATE KEY")
|
|
||||||
}
|
|
||||||
// test all acceptable arguments
|
|
||||||
tpl = `{{genPrivateKey "rsa"}}`
|
|
||||||
out, err = runRaw(tpl, nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
if !strings.Contains(out, "RSA PRIVATE KEY") {
|
|
||||||
t.Error("Expected RSA PRIVATE KEY")
|
|
||||||
}
|
|
||||||
tpl = `{{genPrivateKey "dsa"}}`
|
|
||||||
out, err = runRaw(tpl, nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
if !strings.Contains(out, "DSA PRIVATE KEY") {
|
|
||||||
t.Error("Expected DSA PRIVATE KEY")
|
|
||||||
}
|
|
||||||
tpl = `{{genPrivateKey "ecdsa"}}`
|
|
||||||
out, err = runRaw(tpl, nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
if !strings.Contains(out, "EC PRIVATE KEY") {
|
|
||||||
t.Error("Expected EC PRIVATE KEY")
|
|
||||||
}
|
|
||||||
// test bad
|
|
||||||
tpl = `{{genPrivateKey "bad"}}`
|
|
||||||
out, err = runRaw(tpl, nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
if out != "Unknown type bad" {
|
|
||||||
t.Error("Expected type 'bad' to be an unknown crypto algorithm")
|
|
||||||
}
|
|
||||||
// ensure that we can base64 encode the string
|
|
||||||
tpl = `{{genPrivateKey "rsa" | b64enc}}`
|
|
||||||
out, err = runRaw(tpl, nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestUUIDGeneration(t *testing.T) {
|
|
||||||
tpl := `{{uuidv4}}`
|
|
||||||
out, err := runRaw(tpl, nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(out) != 36 {
|
|
||||||
t.Error("Expected UUID of length 36")
|
|
||||||
}
|
|
||||||
|
|
||||||
out2, err := runRaw(tpl, nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if out == out2 {
|
|
||||||
t.Error("Expected subsequent UUID generations to be different")
|
|
||||||
}
|
|
||||||
}
|
|
23
vendor/github.com/Masterminds/sprig/date.go
generated
vendored
23
vendor/github.com/Masterminds/sprig/date.go
generated
vendored
@@ -51,3 +51,26 @@ func dateModify(fmt string, date time.Time) time.Time {
|
|||||||
}
|
}
|
||||||
return date.Add(d)
|
return date.Add(d)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func dateAgo(date interface{}) string {
|
||||||
|
var t time.Time
|
||||||
|
|
||||||
|
switch date := date.(type) {
|
||||||
|
default:
|
||||||
|
t = time.Now()
|
||||||
|
case time.Time:
|
||||||
|
t = date
|
||||||
|
case int64:
|
||||||
|
t = time.Unix(date, 0)
|
||||||
|
case int:
|
||||||
|
t = time.Unix(int64(date), 0)
|
||||||
|
}
|
||||||
|
// Drop resolution to seconds
|
||||||
|
duration := time.Since(t) / time.Second * time.Second
|
||||||
|
return duration.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
func toDate(fmt, str string) time.Time {
|
||||||
|
t, _ := time.ParseInLocation(fmt, str, time.Local)
|
||||||
|
return t
|
||||||
|
}
|
||||||
|
13
vendor/github.com/Masterminds/sprig/date_test.go
generated
vendored
13
vendor/github.com/Masterminds/sprig/date_test.go
generated
vendored
@@ -1,13 +0,0 @@
|
|||||||
package sprig
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestHtmlDate(t *testing.T) {
|
|
||||||
t.Skip()
|
|
||||||
tpl := `{{ htmlDate 0}}`
|
|
||||||
if err := runt(tpl, "1970-01-01"); err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
}
|
|
107
vendor/github.com/Masterminds/sprig/defaults_test.go
generated
vendored
107
vendor/github.com/Masterminds/sprig/defaults_test.go
generated
vendored
@@ -1,107 +0,0 @@
|
|||||||
package sprig
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestDefault(t *testing.T) {
|
|
||||||
tpl := `{{"" | default "foo"}}`
|
|
||||||
if err := runt(tpl, "foo"); err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
tpl = `{{default "foo" 234}}`
|
|
||||||
if err := runt(tpl, "234"); err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
tpl = `{{default "foo" 2.34}}`
|
|
||||||
if err := runt(tpl, "2.34"); err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
tpl = `{{ .Nothing | default "123" }}`
|
|
||||||
if err := runt(tpl, "123"); err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
tpl = `{{ default "123" }}`
|
|
||||||
if err := runt(tpl, "123"); err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestEmpty(t *testing.T) {
|
|
||||||
tpl := `{{if empty 1}}1{{else}}0{{end}}`
|
|
||||||
if err := runt(tpl, "0"); err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
tpl = `{{if empty 0}}1{{else}}0{{end}}`
|
|
||||||
if err := runt(tpl, "1"); err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
tpl = `{{if empty ""}}1{{else}}0{{end}}`
|
|
||||||
if err := runt(tpl, "1"); err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
tpl = `{{if empty 0.0}}1{{else}}0{{end}}`
|
|
||||||
if err := runt(tpl, "1"); err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
tpl = `{{if empty false}}1{{else}}0{{end}}`
|
|
||||||
if err := runt(tpl, "1"); err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
dict := map[string]interface{}{"top": map[string]interface{}{}}
|
|
||||||
tpl = `{{if empty .top.NoSuchThing}}1{{else}}0{{end}}`
|
|
||||||
if err := runtv(tpl, "1", dict); err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
tpl = `{{if empty .bottom.NoSuchThing}}1{{else}}0{{end}}`
|
|
||||||
if err := runtv(tpl, "1", dict); err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
func TestCoalesce(t *testing.T) {
|
|
||||||
tests := map[string]string{
|
|
||||||
`{{ coalesce 1 }}`: "1",
|
|
||||||
`{{ coalesce "" 0 nil 2 }}`: "2",
|
|
||||||
`{{ $two := 2 }}{{ coalesce "" 0 nil $two }}`: "2",
|
|
||||||
`{{ $two := 2 }}{{ coalesce "" $two 0 0 0 }}`: "2",
|
|
||||||
`{{ $two := 2 }}{{ coalesce "" $two 3 4 5 }}`: "2",
|
|
||||||
`{{ coalesce }}`: "<no value>",
|
|
||||||
}
|
|
||||||
for tpl, expect := range tests {
|
|
||||||
assert.NoError(t, runt(tpl, expect))
|
|
||||||
}
|
|
||||||
|
|
||||||
dict := map[string]interface{}{"top": map[string]interface{}{}}
|
|
||||||
tpl := `{{ coalesce .top.NoSuchThing .bottom .bottom.dollar "airplane"}}`
|
|
||||||
if err := runtv(tpl, "airplane", dict); err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestToJson(t *testing.T) {
|
|
||||||
dict := map[string]interface{}{"Top": map[string]interface{}{"bool": true, "string": "test", "number": 42}}
|
|
||||||
|
|
||||||
tpl := `{{.Top | toJson}}`
|
|
||||||
expected := `{"bool":true,"number":42,"string":"test"}`
|
|
||||||
if err := runtv(tpl, expected, dict); err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestToPrettyJson(t *testing.T) {
|
|
||||||
dict := map[string]interface{}{"Top": map[string]interface{}{"bool": true, "string": "test", "number": 42}}
|
|
||||||
tpl := `{{.Top | toPrettyJson}}`
|
|
||||||
expected := `{
|
|
||||||
"bool": true,
|
|
||||||
"number": 42,
|
|
||||||
"string": "test"
|
|
||||||
}`
|
|
||||||
if err := runtv(tpl, expected, dict); err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
}
|
|
10
vendor/github.com/Masterminds/sprig/dict.go
generated
vendored
10
vendor/github.com/Masterminds/sprig/dict.go
generated
vendored
@@ -75,10 +75,12 @@ func dict(v ...interface{}) map[string]interface{} {
|
|||||||
return dict
|
return dict
|
||||||
}
|
}
|
||||||
|
|
||||||
func merge(dst map[string]interface{}, src map[string]interface{}) interface{} {
|
func merge(dst map[string]interface{}, srcs ...map[string]interface{}) interface{} {
|
||||||
if err := mergo.Merge(&dst, src); err != nil {
|
for _, src := range srcs {
|
||||||
// Swallow errors inside of a template.
|
if err := mergo.Merge(&dst, src); err != nil {
|
||||||
return ""
|
// Swallow errors inside of a template.
|
||||||
|
return ""
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return dst
|
return dst
|
||||||
}
|
}
|
||||||
|
174
vendor/github.com/Masterminds/sprig/dict_test.go
generated
vendored
174
vendor/github.com/Masterminds/sprig/dict_test.go
generated
vendored
@@ -1,174 +0,0 @@
|
|||||||
package sprig
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strings"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestDict(t *testing.T) {
|
|
||||||
tpl := `{{$d := dict 1 2 "three" "four" 5}}{{range $k, $v := $d}}{{$k}}{{$v}}{{end}}`
|
|
||||||
out, err := runRaw(tpl, nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
if len(out) != 12 {
|
|
||||||
t.Errorf("Expected length 12, got %d", len(out))
|
|
||||||
}
|
|
||||||
// dict does not guarantee ordering because it is backed by a map.
|
|
||||||
if !strings.Contains(out, "12") {
|
|
||||||
t.Error("Expected grouping 12")
|
|
||||||
}
|
|
||||||
if !strings.Contains(out, "threefour") {
|
|
||||||
t.Error("Expected grouping threefour")
|
|
||||||
}
|
|
||||||
if !strings.Contains(out, "5") {
|
|
||||||
t.Error("Expected 5")
|
|
||||||
}
|
|
||||||
tpl = `{{$t := dict "I" "shot" "the" "albatross"}}{{$t.the}} {{$t.I}}`
|
|
||||||
if err := runt(tpl, "albatross shot"); err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestUnset(t *testing.T) {
|
|
||||||
tpl := `{{- $d := dict "one" 1 "two" 222222 -}}
|
|
||||||
{{- $_ := unset $d "two" -}}
|
|
||||||
{{- range $k, $v := $d}}{{$k}}{{$v}}{{- end -}}
|
|
||||||
`
|
|
||||||
|
|
||||||
expect := "one1"
|
|
||||||
if err := runt(tpl, expect); err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
func TestHasKey(t *testing.T) {
|
|
||||||
tpl := `{{- $d := dict "one" 1 "two" 222222 -}}
|
|
||||||
{{- if hasKey $d "one" -}}1{{- end -}}
|
|
||||||
`
|
|
||||||
|
|
||||||
expect := "1"
|
|
||||||
if err := runt(tpl, expect); err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestPluck(t *testing.T) {
|
|
||||||
tpl := `
|
|
||||||
{{- $d := dict "one" 1 "two" 222222 -}}
|
|
||||||
{{- $d2 := dict "one" 1 "two" 33333 -}}
|
|
||||||
{{- $d3 := dict "one" 1 -}}
|
|
||||||
{{- $d4 := dict "one" 1 "two" 4444 -}}
|
|
||||||
{{- pluck "two" $d $d2 $d3 $d4 -}}
|
|
||||||
`
|
|
||||||
|
|
||||||
expect := "[222222 33333 4444]"
|
|
||||||
if err := runt(tpl, expect); err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestKeys(t *testing.T) {
|
|
||||||
tests := map[string]string{
|
|
||||||
`{{ dict "foo" 1 "bar" 2 | keys | sortAlpha }}`: "[bar foo]",
|
|
||||||
`{{ dict | keys }}`: "[]",
|
|
||||||
}
|
|
||||||
for tpl, expect := range tests {
|
|
||||||
if err := runt(tpl, expect); err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestPick(t *testing.T) {
|
|
||||||
tests := map[string]string{
|
|
||||||
`{{- $d := dict "one" 1 "two" 222222 }}{{ pick $d "two" | len -}}`: "1",
|
|
||||||
`{{- $d := dict "one" 1 "two" 222222 }}{{ pick $d "two" -}}`: "map[two:222222]",
|
|
||||||
`{{- $d := dict "one" 1 "two" 222222 }}{{ pick $d "one" "two" | len -}}`: "2",
|
|
||||||
`{{- $d := dict "one" 1 "two" 222222 }}{{ pick $d "one" "two" "three" | len -}}`: "2",
|
|
||||||
`{{- $d := dict }}{{ pick $d "two" | len -}}`: "0",
|
|
||||||
}
|
|
||||||
for tpl, expect := range tests {
|
|
||||||
if err := runt(tpl, expect); err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
func TestOmit(t *testing.T) {
|
|
||||||
tests := map[string]string{
|
|
||||||
`{{- $d := dict "one" 1 "two" 222222 }}{{ omit $d "one" | len -}}`: "1",
|
|
||||||
`{{- $d := dict "one" 1 "two" 222222 }}{{ omit $d "one" -}}`: "map[two:222222]",
|
|
||||||
`{{- $d := dict "one" 1 "two" 222222 }}{{ omit $d "one" "two" | len -}}`: "0",
|
|
||||||
`{{- $d := dict "one" 1 "two" 222222 }}{{ omit $d "two" "three" | len -}}`: "1",
|
|
||||||
`{{- $d := dict }}{{ omit $d "two" | len -}}`: "0",
|
|
||||||
}
|
|
||||||
for tpl, expect := range tests {
|
|
||||||
if err := runt(tpl, expect); err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestSet(t *testing.T) {
|
|
||||||
tpl := `{{- $d := dict "one" 1 "two" 222222 -}}
|
|
||||||
{{- $_ := set $d "two" 2 -}}
|
|
||||||
{{- $_ := set $d "three" 3 -}}
|
|
||||||
{{- if hasKey $d "one" -}}{{$d.one}}{{- end -}}
|
|
||||||
{{- if hasKey $d "two" -}}{{$d.two}}{{- end -}}
|
|
||||||
{{- if hasKey $d "three" -}}{{$d.three}}{{- end -}}
|
|
||||||
`
|
|
||||||
|
|
||||||
expect := "123"
|
|
||||||
if err := runt(tpl, expect); err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCompact(t *testing.T) {
|
|
||||||
tests := map[string]string{
|
|
||||||
`{{ list 1 0 "" "hello" | compact }}`: `[1 hello]`,
|
|
||||||
`{{ list "" "" | compact }}`: `[]`,
|
|
||||||
`{{ list | compact }}`: `[]`,
|
|
||||||
}
|
|
||||||
for tpl, expect := range tests {
|
|
||||||
assert.NoError(t, runt(tpl, expect))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestMerge(t *testing.T) {
|
|
||||||
dict := map[string]interface{}{
|
|
||||||
"src": map[string]interface{}{
|
|
||||||
"a": 1,
|
|
||||||
"b": 2,
|
|
||||||
"d": map[string]interface{}{
|
|
||||||
"e": "four",
|
|
||||||
},
|
|
||||||
"g": []int{6, 7},
|
|
||||||
},
|
|
||||||
"dst": map[string]interface{}{
|
|
||||||
"a": "one",
|
|
||||||
"c": 3,
|
|
||||||
"d": map[string]interface{}{
|
|
||||||
"f": 5,
|
|
||||||
},
|
|
||||||
"g": []int{8, 9},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
tpl := `{{merge .dst .src}}`
|
|
||||||
_, err := runRaw(tpl, dict)
|
|
||||||
if err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
expected := map[string]interface{}{
|
|
||||||
"a": "one", // key overridden
|
|
||||||
"b": 2, // merged from src
|
|
||||||
"c": 3, // merged from dst
|
|
||||||
"d": map[string]interface{}{ // deep merge
|
|
||||||
"e": "four",
|
|
||||||
"f": 5,
|
|
||||||
},
|
|
||||||
"g": []int{8, 9}, // overridden - arrays are not merged
|
|
||||||
}
|
|
||||||
assert.Equal(t, expected, dict["dst"])
|
|
||||||
}
|
|
7
vendor/github.com/Masterminds/sprig/doc.go
generated
vendored
7
vendor/github.com/Masterminds/sprig/doc.go
generated
vendored
@@ -48,6 +48,10 @@ String Functions
|
|||||||
- randAlpha: Given a length, generate an alphabetic string
|
- randAlpha: Given a length, generate an alphabetic string
|
||||||
- randAscii: Given a length, generate a random ASCII string (symbols included)
|
- randAscii: Given a length, generate a random ASCII string (symbols included)
|
||||||
- randNumeric: Given a length, generate a string of digits.
|
- randNumeric: Given a length, generate a string of digits.
|
||||||
|
- swapcase: SwapCase swaps the case of a string using a word based algorithm. see https://godoc.org/github.com/Masterminds/goutils#SwapCase
|
||||||
|
- shuffle: Shuffle randomizes runes in a string and returns the result. It uses default random source in `math/rand`
|
||||||
|
- snakecase: convert all upper case characters in a string to underscore format.
|
||||||
|
- camelcase: convert all lower case characters behind underscores to upper case character
|
||||||
- wrap: Force a line wrap at the given width. `wrap 80 "imagine a longer string"`
|
- wrap: Force a line wrap at the given width. `wrap 80 "imagine a longer string"`
|
||||||
- wrapWith: Wrap a line at the given length, but using 'sep' instead of a newline. `wrapWith 50, "<br>", $html`
|
- wrapWith: Wrap a line at the given length, but using 'sep' instead of a newline. `wrapWith 50, "<br>", $html`
|
||||||
- contains: strings.Contains, but with the arguments switched: `contains substr str`. (This simplifies common pipelines)
|
- contains: strings.Contains, but with the arguments switched: `contains substr str`. (This simplifies common pipelines)
|
||||||
@@ -57,6 +61,7 @@ String Functions
|
|||||||
- squote: Wrap string(s) in double quotation marks, does not escape content.
|
- squote: Wrap string(s) in double quotation marks, does not escape content.
|
||||||
- cat: Concatenate strings, separating them by spaces. `cat $a $b $c`.
|
- cat: Concatenate strings, separating them by spaces. `cat $a $b $c`.
|
||||||
- indent: Indent a string using space characters. `indent 4 "foo\nbar"` produces " foo\n bar"
|
- indent: Indent a string using space characters. `indent 4 "foo\nbar"` produces " foo\n bar"
|
||||||
|
- nindent: Indent a string using space characters and prepend a new line. `indent 4 "foo\nbar"` produces "\n foo\n bar"
|
||||||
- replace: Replace an old with a new in a string: `$name | replace " " "-"`
|
- replace: Replace an old with a new in a string: `$name | replace " " "-"`
|
||||||
- plural: Choose singular or plural based on length: `len $fish | plural "one anchovy" "many anchovies"`
|
- plural: Choose singular or plural based on length: `len $fish | plural "one anchovy" "many anchovies"`
|
||||||
- sha256sum: Generate a hex encoded sha256 hash of the input
|
- sha256sum: Generate a hex encoded sha256 hash of the input
|
||||||
@@ -84,7 +89,7 @@ Integer Slice Functions:
|
|||||||
Conversions:
|
Conversions:
|
||||||
|
|
||||||
- atoi: Convert a string to an integer. 0 if the integer could not be parsed.
|
- atoi: Convert a string to an integer. 0 if the integer could not be parsed.
|
||||||
- in64: Convert a string or another numeric type to an int64.
|
- int64: Convert a string or another numeric type to an int64.
|
||||||
- int: Convert a string or another numeric type to an int.
|
- int: Convert a string or another numeric type to an int.
|
||||||
- float64: Convert a string or another numeric type to a float64.
|
- float64: Convert a string or another numeric type to a float64.
|
||||||
|
|
||||||
|
1
vendor/github.com/Masterminds/sprig/docs/_config.yml
generated
vendored
1
vendor/github.com/Masterminds/sprig/docs/_config.yml
generated
vendored
@@ -1 +0,0 @@
|
|||||||
theme: jekyll-theme-slate
|
|
25
vendor/github.com/Masterminds/sprig/docs/conversion.md
generated
vendored
25
vendor/github.com/Masterminds/sprig/docs/conversion.md
generated
vendored
@@ -1,25 +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`
|
|
||||||
- `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.
|
|
37
vendor/github.com/Masterminds/sprig/docs/crypto.md
generated
vendored
37
vendor/github.com/Masterminds/sprig/docs/crypto.md
generated
vendored
@@ -1,37 +0,0 @@
|
|||||||
# Cryptographic and Security Functions
|
|
||||||
|
|
||||||
Sprig provides a couple of advanced cryptographic functions.
|
|
||||||
|
|
||||||
## 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.
|
|
||||||
|
|
||||||
## derivePassword
|
|
||||||
|
|
||||||
The `derivePassword` function can be used to derive a specific password based on
|
|
||||||
some shared "master password" constraints. The algorithm for this is
|
|
||||||
[well specified](http://masterpasswordapp.com/algorithm.html).
|
|
||||||
|
|
||||||
```
|
|
||||||
derivePassword 1 "long" "password" "user" "example.com"
|
|
||||||
```
|
|
||||||
|
|
||||||
Note that it is considered insecure to store the parts directly in the template.
|
|
||||||
|
|
||||||
## generatePrivateKey
|
|
||||||
|
|
||||||
The `generatePrivateKey` function generates a new private key encoded into a PEM
|
|
||||||
block.
|
|
||||||
|
|
||||||
It takes one of the values for its first param:
|
|
||||||
|
|
||||||
- `ecdsa`: Generate an elyptical curve DSA key (P256)
|
|
||||||
- `dsa`: Generate a DSA key (L2048N256)
|
|
||||||
- `rsa`: Generate an RSA 4096 key
|
|
62
vendor/github.com/Masterminds/sprig/docs/date.md
generated
vendored
62
vendor/github.com/Masterminds/sprig/docs/date.md
generated
vendored
@@ -1,62 +0,0 @@
|
|||||||
# Date Functions
|
|
||||||
|
|
||||||
## now
|
|
||||||
|
|
||||||
The current date/time. Use this in conjunction with other date functions.
|
|
||||||
|
|
||||||
## 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.
|
|
||||||
|
|
||||||
```
|
|
||||||
date "2006-01-02" (now) "UTC"
|
|
||||||
```
|
|
||||||
|
|
||||||
## dateModify
|
|
||||||
|
|
||||||
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"
|
|
||||||
```
|
|
||||||
|
|
||||||
## htmlDate
|
|
||||||
|
|
||||||
The `htmlDate` function formates a date for inserting into an HTML date picker
|
|
||||||
input field.
|
|
||||||
|
|
||||||
```
|
|
||||||
now | htmlDate
|
|
||||||
```
|
|
||||||
|
|
||||||
## htmlDateInZone
|
|
||||||
|
|
||||||
Same as htmlDate, but with a timezone.
|
|
||||||
|
|
||||||
```
|
|
||||||
htmlDate (now) "UTC"
|
|
||||||
```
|
|
||||||
|
|
59
vendor/github.com/Masterminds/sprig/docs/defaults.md
generated
vendored
59
vendor/github.com/Masterminds/sprig/docs/defaults.md
generated
vendored
@@ -1,59 +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`.
|
|
124
vendor/github.com/Masterminds/sprig/docs/dicts.md
generated
vendored
124
vendor/github.com/Masterminds/sprig/docs/dicts.md
generated
vendored
@@ -1,124 +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"
|
|
||||||
```
|
|
||||||
|
|
||||||
## 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.
|
|
||||||
|
|
||||||
## merge
|
|
||||||
|
|
||||||
Merge two dictionaries into one, giving precedence to the dest dictionary:
|
|
||||||
|
|
||||||
```
|
|
||||||
$newdict := merge $dest $source
|
|
||||||
```
|
|
||||||
|
|
||||||
This is a deep merge operation.
|
|
||||||
|
|
||||||
## keys
|
|
||||||
|
|
||||||
The `keys` function will return a `list` of all of the keys in a `dict`. Since
|
|
||||||
a dictionary is _unordered_, the keys will not be in a predictable order. They
|
|
||||||
can be sorted with `sortAlpha`.
|
|
||||||
|
|
||||||
```
|
|
||||||
keys $myDict | sortAlpha
|
|
||||||
```
|
|
||||||
|
|
||||||
## pick
|
|
||||||
|
|
||||||
The `pick` function selects just the given keys out of a dictionary, creating a
|
|
||||||
new `dict`.
|
|
||||||
|
|
||||||
```
|
|
||||||
$new := pick $myDict "name1" "name3"
|
|
||||||
```
|
|
||||||
|
|
||||||
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}`
|
|
||||||
|
|
||||||
## A Note on Dict Internals
|
|
||||||
|
|
||||||
A `dict` is implemented in Go as a `map[string]interface{}`. Go developers can
|
|
||||||
pass `map[string]interface{}` values into the context to make them available
|
|
||||||
to templates as `dict`s.
|
|
6
vendor/github.com/Masterminds/sprig/docs/encoding.md
generated
vendored
6
vendor/github.com/Masterminds/sprig/docs/encoding.md
generated
vendored
@@ -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
|
|
11
vendor/github.com/Masterminds/sprig/docs/flow_control.md
generated
vendored
11
vendor/github.com/Masterminds/sprig/docs/flow_control.md
generated
vendored
@@ -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"
|
|
||||||
```
|
|
23
vendor/github.com/Masterminds/sprig/docs/index.md
generated
vendored
23
vendor/github.com/Masterminds/sprig/docs/index.md
generated
vendored
@@ -1,23 +0,0 @@
|
|||||||
# Sprig Function Documentation
|
|
||||||
|
|
||||||
The Sprig library provides over 70 template functions for Go's template language.
|
|
||||||
|
|
||||||
- [String Functions](strings.md): `trim`, `wrap`, `randAlpha`, `plural`, etc.
|
|
||||||
- [String List Functions](string_slice.md): `splitList`, `sortAlpha`, etc.
|
|
||||||
- [Math Functions](math.md): `add`, `max`, `mul`, etc.
|
|
||||||
- [Integer Slice Functions](integer_slice.md): `until`, `untilStep`
|
|
||||||
- [Date Functions](date.md): `now`, `date`, etc.
|
|
||||||
- [Defaults Functions](defaults.md): `default`, `empty`, `coalesce`
|
|
||||||
- [Encoding Functions](encoding.md): `b64enc`, `b64dec`, etc.
|
|
||||||
- [Lists and List Functions](lists.md): `list`, `first`, `uniq`, etc.
|
|
||||||
- [Dictionaries and Dict Functions](dicts.md): `dict`, `hasKey`, `pluck`, etc.
|
|
||||||
- [Type Conversion Functions](conversion.md): `atoi`, `int64`, `toString`, etc.
|
|
||||||
- [File Path Functions](paths.md): `base`, `dir`, `ext`, `clean`, `isAbs`
|
|
||||||
- [Flow Control Functions](flow_control.md): `fail`
|
|
||||||
- Advanced Functions
|
|
||||||
- [UUID Functions](uuid.md): `uuidv4`
|
|
||||||
- [OS Functions](os.md): `env`, `expandenv`
|
|
||||||
- [Version Comparison Functions](semver.md): `semver`, `semverCompare`
|
|
||||||
- [Reflection](reflection.md): `typeOf`, `kindIs`, `typeIsLike`, etc.
|
|
||||||
- [Cryptographic and Security Functions](crypto.md): `derivePassword`, `sha256sum`, `genPrivateKey`
|
|
||||||
|
|
25
vendor/github.com/Masterminds/sprig/docs/integer_slice.md
generated
vendored
25
vendor/github.com/Masterminds/sprig/docs/integer_slice.md
generated
vendored
@@ -1,25 +0,0 @@
|
|||||||
# Integer Slice 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.
|
|
111
vendor/github.com/Masterminds/sprig/docs/lists.md
generated
vendored
111
vendor/github.com/Masterminds/sprig/docs/lists.md
generated
vendored
@@ -1,111 +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
|
|
||||||
|
|
||||||
To get the head item on a list, use `first`.
|
|
||||||
|
|
||||||
`first $myList` returns `1`
|
|
||||||
|
|
||||||
## rest
|
|
||||||
|
|
||||||
To get the tail of the list (everything but the first item), use `rest`.
|
|
||||||
|
|
||||||
`rest $myList` returns `[2 3 4 5]`
|
|
||||||
|
|
||||||
## last
|
|
||||||
|
|
||||||
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`.
|
|
||||||
|
|
||||||
## initial
|
|
||||||
|
|
||||||
This compliments `last` by returning all _but_ the last element.
|
|
||||||
`initial $myList` returns `[1 2 3 4]`.
|
|
||||||
|
|
||||||
## append
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
## prepend
|
|
||||||
|
|
||||||
Push an alement 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.
|
|
||||||
|
|
||||||
## reverse
|
|
||||||
|
|
||||||
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]`.
|
|
||||||
|
|
||||||
## uniq
|
|
||||||
|
|
||||||
Generate a list with all of the duplicates removed.
|
|
||||||
|
|
||||||
```
|
|
||||||
list 1 1 1 2 | uniq
|
|
||||||
```
|
|
||||||
|
|
||||||
The above would produce `[1 2]`
|
|
||||||
|
|
||||||
## without
|
|
||||||
|
|
||||||
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]`
|
|
||||||
|
|
||||||
## has
|
|
||||||
|
|
||||||
Test to see if a list has a particular element.
|
|
||||||
|
|
||||||
```
|
|
||||||
has $myList 4
|
|
||||||
```
|
|
||||||
|
|
||||||
The above would return `true`, while `has $myList "hello"` would return false.
|
|
||||||
|
|
||||||
## 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.
|
|
46
vendor/github.com/Masterminds/sprig/docs/math.md
generated
vendored
46
vendor/github.com/Masterminds/sprig/docs/math.md
generated
vendored
@@ -1,46 +0,0 @@
|
|||||||
# Math Functions
|
|
||||||
|
|
||||||
All math functions operate on `int64` values unless specified otherwise.
|
|
||||||
|
|
||||||
(In the future, these will be extended to handle floats as well)
|
|
||||||
|
|
||||||
## add
|
|
||||||
|
|
||||||
Sum numbers with `add`
|
|
||||||
|
|
||||||
## 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`
|
|
||||||
|
|
||||||
## 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`.
|
|
||||||
|
|
24
vendor/github.com/Masterminds/sprig/docs/os.md
generated
vendored
24
vendor/github.com/Masterminds/sprig/docs/os.md
generated
vendored
@@ -1,24 +0,0 @@
|
|||||||
# OS Functions
|
|
||||||
|
|
||||||
_WARNING:_ These functions can lead to information leakage if not used
|
|
||||||
appropriately.
|
|
||||||
|
|
||||||
_WARNING:_ Some notable implementations of Sprig (such as
|
|
||||||
[Kubernetes Helm](http://helm.sh) _do not provide these functions for security
|
|
||||||
reasons_.
|
|
||||||
|
|
||||||
## env
|
|
||||||
|
|
||||||
The `env` function reads an environment variable:
|
|
||||||
|
|
||||||
```
|
|
||||||
env "HOME"
|
|
||||||
```
|
|
||||||
|
|
||||||
## expandenv
|
|
||||||
|
|
||||||
To substitute environment variables in a string, use `expandenv`:
|
|
||||||
|
|
||||||
```
|
|
||||||
expandenv "Your path is set to $PATH"
|
|
||||||
```
|
|
43
vendor/github.com/Masterminds/sprig/docs/paths.md
generated
vendored
43
vendor/github.com/Masterminds/sprig/docs/paths.md
generated
vendored
@@ -1,43 +0,0 @@
|
|||||||
# File Path Functions
|
|
||||||
|
|
||||||
While Sprig does not grant access to the filesystem, it does provide functions
|
|
||||||
for working with strings that follow file path conventions.
|
|
||||||
|
|
||||||
# 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 file path is absolute, use `isAbs`.
|
|
38
vendor/github.com/Masterminds/sprig/docs/reflection.md
generated
vendored
38
vendor/github.com/Masterminds/sprig/docs/reflection.md
generated
vendored
@@ -1,38 +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
|
|
||||||
`isKind` 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 `kindIs`, 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.
|
|
124
vendor/github.com/Masterminds/sprig/docs/semver.md
generated
vendored
124
vendor/github.com/Masterminds/sprig/docs/semver.md
generated
vendored
@@ -1,124 +0,0 @@
|
|||||||
# Semantic Version Functions
|
|
||||||
|
|
||||||
Some version schemes are easily parseable and comparable. Sprig provides functions
|
|
||||||
for working with [SemVer 2](http://semver.org) versions.
|
|
||||||
|
|
||||||
## semver
|
|
||||||
|
|
||||||
The `semver` function parses a string into a Semantic Version:
|
|
||||||
|
|
||||||
```
|
|
||||||
$version := semver "1.2.3-alpha.1+123"
|
|
||||||
```
|
|
||||||
|
|
||||||
_If the parser fails, it will cause template execution to halt with an error._
|
|
||||||
|
|
||||||
At this point, `$version` is a pointer to a `Version` object with the following
|
|
||||||
properties:
|
|
||||||
|
|
||||||
- `$version.Major`: The major number (`1` above)
|
|
||||||
- `$version.Minor`: The minor number (`2` above)
|
|
||||||
- `$version.Patch`: The patch number (`3` above)
|
|
||||||
- `$version.Prerelease`: The prerelease (`alpha.1` above)
|
|
||||||
- `$version.Metadata`: The build metadata (`123` above)
|
|
||||||
- `$version.Original`: The original version as a string
|
|
||||||
|
|
||||||
Additionally, you can compare a `Version` to another `version` using the `Compare`
|
|
||||||
function:
|
|
||||||
|
|
||||||
```
|
|
||||||
semver "1.4.3" | (semver "1.2.3").Compare
|
|
||||||
```
|
|
||||||
|
|
||||||
The above will return `-1`.
|
|
||||||
|
|
||||||
The return values are:
|
|
||||||
|
|
||||||
- `-1` if the given semver is greater than the semver whose `Compare` method was called
|
|
||||||
- `1` if the version who's `Compare` function was called is greater.
|
|
||||||
- `0` if they are the same version
|
|
||||||
|
|
||||||
(Note that in SemVer, the `Metadata` field is not compared during version
|
|
||||||
comparison operations.)
|
|
||||||
|
|
||||||
|
|
||||||
## semverCompare
|
|
||||||
|
|
||||||
A more robust comparison function is provided as `semverCompare`. This version
|
|
||||||
supports version ranges:
|
|
||||||
|
|
||||||
- `semverCompare "1.2.3" "1.2.3"` checks for an exact match
|
|
||||||
- `semverCompare "^1.2.0" "1.2.3"` checks that the major and minor versions match, and that the patch
|
|
||||||
number of the second version is _greater than or equal to_ the first parameter.
|
|
||||||
|
|
||||||
The SemVer functions use the [Masterminds semver library](https://github.com/Masterminds/semver),
|
|
||||||
from the creators of Sprig.
|
|
||||||
|
|
||||||
|
|
||||||
## Basic Comparisons
|
|
||||||
|
|
||||||
There are two elements to the comparisons. First, a comparison string is a list
|
|
||||||
of comma separated and comparisons. These are then separated by || separated or
|
|
||||||
comparisons. For example, `">= 1.2, < 3.0.0 || >= 4.2.3"` is looking for a
|
|
||||||
comparison that's greater than or equal to 1.2 and less than 3.0.0 or is
|
|
||||||
greater than or equal to 4.2.3.
|
|
||||||
|
|
||||||
The basic comparisons are:
|
|
||||||
|
|
||||||
* `=`: equal (aliased to no operator)
|
|
||||||
* `!=`: not equal
|
|
||||||
* `>`: greater than
|
|
||||||
* `<`: less than
|
|
||||||
* `>=`: greater than or equal to
|
|
||||||
* `<=`: less than or equal to
|
|
||||||
|
|
||||||
_Note, according to the Semantic Version specification pre-releases may not be
|
|
||||||
API compliant with their release counterpart. It says,_
|
|
||||||
|
|
||||||
> _A pre-release version indicates that the version is unstable and might not satisfy the intended compatibility requirements as denoted by its associated normal version._
|
|
||||||
|
|
||||||
_SemVer comparisons without a pre-release value will skip pre-release versions.
|
|
||||||
For example, `>1.2.3` will skip pre-releases when looking at a list of values
|
|
||||||
while `>1.2.3-alpha.1` will evaluate pre-releases._
|
|
||||||
|
|
||||||
## Hyphen Range Comparisons
|
|
||||||
|
|
||||||
There are multiple methods to handle ranges and the first is hyphens ranges.
|
|
||||||
These look like:
|
|
||||||
|
|
||||||
* `1.2 - 1.4.5` which is equivalent to `>= 1.2, <= 1.4.5`
|
|
||||||
* `2.3.4 - 4.5` which is equivalent to `>= 2.3.4, <= 4.5`
|
|
||||||
|
|
||||||
## Wildcards In Comparisons
|
|
||||||
|
|
||||||
The `x`, `X`, and `*` characters can be used as a wildcard character. This works
|
|
||||||
for all comparison operators. When used on the `=` operator it falls
|
|
||||||
back to the pack level comparison (see tilde below). For example,
|
|
||||||
|
|
||||||
* `1.2.x` is equivalent to `>= 1.2.0, < 1.3.0`
|
|
||||||
* `>= 1.2.x` is equivalent to `>= 1.2.0`
|
|
||||||
* `<= 2.x` is equivalent to `<= 3`
|
|
||||||
* `*` is equivalent to `>= 0.0.0`
|
|
||||||
|
|
||||||
## Tilde Range Comparisons (Patch)
|
|
||||||
|
|
||||||
The tilde (`~`) comparison operator is for patch level ranges when a minor
|
|
||||||
version is specified and major level changes when the minor number is missing.
|
|
||||||
For example,
|
|
||||||
|
|
||||||
* `~1.2.3` is equivalent to `>= 1.2.3, < 1.3.0`
|
|
||||||
* `~1` is equivalent to `>= 1, < 2`
|
|
||||||
* `~2.3` is equivalent to `>= 2.3, < 2.4`
|
|
||||||
* `~1.2.x` is equivalent to `>= 1.2.0, < 1.3.0`
|
|
||||||
* `~1.x` is equivalent to `>= 1, < 2`
|
|
||||||
|
|
||||||
## Caret Range Comparisons (Major)
|
|
||||||
|
|
||||||
The caret (`^`) comparison operator is for major level changes. This is useful
|
|
||||||
when comparisons of API versions as a major change is API breaking. For example,
|
|
||||||
|
|
||||||
* `^1.2.3` is equivalent to `>= 1.2.3, < 2.0.0`
|
|
||||||
* `^1.2.x` is equivalent to `>= 1.2.0, < 2.0.0`
|
|
||||||
* `^2.3` is equivalent to `>= 2.3, < 3`
|
|
||||||
* `^2.x` is equivalent to `>= 2.0.0, < 3`
|
|
||||||
|
|
55
vendor/github.com/Masterminds/sprig/docs/string_slice.md
generated
vendored
55
vendor/github.com/Masterminds/sprig/docs/string_slice.md
generated
vendored
@@ -1,55 +0,0 @@
|
|||||||
# String Slice 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`
|
|
||||||
|
|
||||||
## 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.
|
|
322
vendor/github.com/Masterminds/sprig/docs/strings.md
generated
vendored
322
vendor/github.com/Masterminds/sprig/docs/strings.md
generated
vendored
@@ -1,322 +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`
|
|
||||||
|
|
||||||
## 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`
|
|
||||||
|
|
||||||
## untitle
|
|
||||||
|
|
||||||
Remove title casing. `untitle "Hello World"` produces `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)
|
|
||||||
- length (int)
|
|
||||||
- string (string)
|
|
||||||
|
|
||||||
```
|
|
||||||
substr 0 5 "hello world"
|
|
||||||
```
|
|
||||||
|
|
||||||
The above returns `hello`
|
|
||||||
|
|
||||||
## nospace
|
|
||||||
|
|
||||||
Remove all whitespace from a string.
|
|
||||||
|
|
||||||
```
|
|
||||||
nospace "hello w o r l d"
|
|
||||||
```
|
|
||||||
|
|
||||||
The above returns `helloworld`
|
|
||||||
|
|
||||||
## trunc
|
|
||||||
|
|
||||||
Truncate a string (and add no suffix)
|
|
||||||
|
|
||||||
```
|
|
||||||
trunc 5 "hello world"
|
|
||||||
```
|
|
||||||
|
|
||||||
The above produces `hello`.
|
|
||||||
|
|
||||||
## abbrev
|
|
||||||
|
|
||||||
Truncate a string with ellipses (`...`)
|
|
||||||
|
|
||||||
Parameters:
|
|
||||||
- max length
|
|
||||||
- the string
|
|
||||||
|
|
||||||
```
|
|
||||||
abbrev 5 "hello world"
|
|
||||||
```
|
|
||||||
|
|
||||||
The above returns `he...`, since it counts the width of the ellipses against the
|
|
||||||
maximum length.
|
|
||||||
|
|
||||||
## abbrevboth
|
|
||||||
|
|
||||||
Abbreviate both sides:
|
|
||||||
|
|
||||||
```
|
|
||||||
abbrevboth 5 10 "1234 5678 9123"
|
|
||||||
```
|
|
||||||
|
|
||||||
the above produces `...5678...`
|
|
||||||
|
|
||||||
It takes:
|
|
||||||
|
|
||||||
- left offset
|
|
||||||
- max length
|
|
||||||
- the string
|
|
||||||
|
|
||||||
## initials
|
|
||||||
|
|
||||||
Given multiple words, take the first letter of each word and combine.
|
|
||||||
|
|
||||||
```
|
|
||||||
initials "First Try"
|
|
||||||
```
|
|
||||||
|
|
||||||
The above returns `FT`
|
|
||||||
|
|
||||||
## randAlphaNum, randAlpha, randNumeric, and randAscii
|
|
||||||
|
|
||||||
These four functions generate random strings, but with different base character
|
|
||||||
sets:
|
|
||||||
|
|
||||||
- `randAlphaNum` uses `0-9a-zA-Z`
|
|
||||||
- `randAlpha` uses `a-zA-Z`
|
|
||||||
- `randNumeric` uses `0-9`
|
|
||||||
- `randAscii` uses all printable ASCII characters
|
|
||||||
|
|
||||||
Each of them takes one parameter: the integer length of the string.
|
|
||||||
|
|
||||||
```
|
|
||||||
randNumeric 3
|
|
||||||
```
|
|
||||||
|
|
||||||
The above will produce a random string with three digits.
|
|
||||||
|
|
||||||
## wrap
|
|
||||||
|
|
||||||
Wrap text at a given column count:
|
|
||||||
|
|
||||||
```
|
|
||||||
wrap 80 $someText
|
|
||||||
```
|
|
||||||
|
|
||||||
The above will wrap the string in `$someText` at 80 columns.
|
|
||||||
|
|
||||||
## wrapWith
|
|
||||||
|
|
||||||
`wrapWith` works as `wrap`, but lets you specify the string to wrap with.
|
|
||||||
(`wrap` uses `\n`)
|
|
||||||
|
|
||||||
```
|
|
||||||
wrapWith 5 "\t" "Hello World"
|
|
||||||
```
|
|
||||||
|
|
||||||
The above produces `hello world` (where the whitespace is an ASCII tab
|
|
||||||
character)
|
|
||||||
|
|
||||||
## 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.
|
|
||||||
|
|
||||||
## 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.
|
|
||||||
|
|
||||||
## snakecase
|
|
||||||
|
|
||||||
Convert string from camelCase to snake_case.
|
|
||||||
|
|
||||||
Introduced in 2.12.0.
|
|
||||||
|
|
||||||
```
|
|
||||||
snakecase "FirstName"
|
|
||||||
```
|
|
||||||
|
|
||||||
This above will produce `first_name`.
|
|
||||||
|
|
||||||
## camelcase
|
|
||||||
|
|
||||||
Convert string from snake_case to CamelCase
|
|
||||||
|
|
||||||
Introduced in 2.12.0.
|
|
||||||
|
|
||||||
```
|
|
||||||
camelcase "http_server"
|
|
||||||
```
|
|
||||||
|
|
||||||
This above will produce `HttpServer`.
|
|
||||||
|
|
||||||
## shuffle
|
|
||||||
|
|
||||||
Shuffle a string.
|
|
||||||
|
|
||||||
Introduced in 2.12.0.
|
|
||||||
|
|
||||||
|
|
||||||
```
|
|
||||||
shuffle "hello"
|
|
||||||
```
|
|
||||||
|
|
||||||
The above will randomize the letters in `hello`, perhaps producing `oelhl`.
|
|
||||||
|
|
||||||
## See Also...
|
|
||||||
|
|
||||||
The [Conversion Functions](conversion.html) contain functions for converting
|
|
||||||
strings. The [String Slice Functions](string_slice.html) contains functions
|
|
||||||
for working with an array of strings.
|
|
9
vendor/github.com/Masterminds/sprig/docs/uuid.md
generated
vendored
9
vendor/github.com/Masterminds/sprig/docs/uuid.md
generated
vendored
@@ -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.
|
|
25
vendor/github.com/Masterminds/sprig/example_test.go
generated
vendored
25
vendor/github.com/Masterminds/sprig/example_test.go
generated
vendored
@@ -1,25 +0,0 @@
|
|||||||
package sprig
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
"text/template"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Example() {
|
|
||||||
// Set up variables and template.
|
|
||||||
vars := map[string]interface{}{"Name": " John Jacob Jingleheimer Schmidt "}
|
|
||||||
tpl := `Hello {{.Name | trim | lower}}`
|
|
||||||
|
|
||||||
// Get the Sprig function map.
|
|
||||||
fmap := TxtFuncMap()
|
|
||||||
t := template.Must(template.New("test").Funcs(fmap).Parse(tpl))
|
|
||||||
|
|
||||||
err := t.Execute(os.Stdout, vars)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Printf("Error during template execution: %s", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// Output:
|
|
||||||
// Hello john jacob jingleheimer schmidt
|
|
||||||
}
|
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user