diff --git a/README.md b/README.md index 391dbd61..097f1c1b 100644 --- a/README.md +++ b/README.md @@ -281,6 +281,13 @@ string is passed in, functions will attempt to conver with {{ derivePassword 1 "long" "password" "user" "example.com" }} ``` +## SemVer Functions: + +These functions provide version parsing and comparisons for SemVer 2 version +strings. + +- semver: Parse a semantic version and return a Version object. +- semverCompare: Compare a SemVer range to a particular version. ## Principles: diff --git a/doc.go b/doc.go index 5306b2db..7ecb5e25 100644 --- a/doc.go +++ b/doc.go @@ -213,5 +213,13 @@ Crypto Functions: Given parameters (in order) are: `counter` (starting with 1), `password_type` (maximum, long, medium, short, basic, or pin), `password`, `user`, and `site` + +SemVer Functions: + +These functions provide version parsing and comparisons for SemVer 2 version +strings. + + - semver: Parse a semantic version and return a Version object. + - semverCompare: Compare a SemVer range to a particular version. */ package sprig diff --git a/functions.go b/functions.go index ef9cf498..be108360 100644 --- a/functions.go +++ b/functions.go @@ -243,4 +243,8 @@ var genericMap = map[string]interface{}{ // UUIDs: "uuidv4": uuidv4, + + // SemVer: + "semver": semver, + "semverCompare": semverCompare, } diff --git a/glide.lock b/glide.lock index bd968c2a..209cefcb 100644 --- a/glide.lock +++ b/glide.lock @@ -1,8 +1,10 @@ -hash: 6e5af84de9810bc5784f56d5a321887db57b3454d45888153202b4b1e191018b -updated: 2017-03-13T15:10:35.206679863-06:00 +hash: c2d7cb87ff32a0aba767b90bff630c3e4c1ca9904fc72568414d20d79a41e70f +updated: 2017-03-13T18:38:30.597881175-06:00 imports: - name: github.com/aokoli/goutils version: 9c37978a95bd5c709a15883b6242714ea6709e64 +- name: github.com/Masterminds/semver + version: 59c29afe1a994eacb71c833025ca7acf874bb1da - name: github.com/satori/go.uuid version: 879c5887cd475cd7864858769793b2ceb0d44feb - name: golang.org/x/crypto diff --git a/glide.yaml b/glide.yaml index 42536d34..b6c8b616 100644 --- a/glide.yaml +++ b/glide.yaml @@ -6,3 +6,5 @@ import: - package: golang.org/x/crypto subpackages: - scrypt +- package: github.com/Masterminds/semver + version: v1.2.2 diff --git a/semver.go b/semver.go new file mode 100644 index 00000000..c2bf8a1f --- /dev/null +++ b/semver.go @@ -0,0 +1,23 @@ +package sprig + +import ( + sv2 "github.com/Masterminds/semver" +) + +func semverCompare(constraint, version string) (bool, error) { + c, err := sv2.NewConstraint(constraint) + if err != nil { + return false, err + } + + v, err := sv2.NewVersion(version) + if err != nil { + return false, err + } + + return c.Check(v), nil +} + +func semver(version string) (*sv2.Version, error) { + return sv2.NewVersion(version) +} diff --git a/semver_test.go b/semver_test.go new file mode 100644 index 00000000..53d3c8be --- /dev/null +++ b/semver_test.go @@ -0,0 +1,31 @@ +package sprig + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestSemverCompare(t *testing.T) { + tests := map[string]string{ + `{{ semverCompare "1.2.3" "1.2.3" }}`: `true`, + `{{ semverCompare "^1.2.0" "1.2.3" }}`: `true`, + `{{ semverCompare "^1.2.0" "2.2.3" }}`: `false`, + } + for tpl, expect := range tests { + assert.NoError(t, runt(tpl, expect)) + } +} + +func TestSemver(t *testing.T) { + tests := map[string]string{ + `{{ $s := semver "1.2.3-beta.1+c0ff33" }}{{ $s.Prerelease }}`: "beta.1", + `{{ $s := semver "1.2.3-beta.1+c0ff33" }}{{ $s.Major}}`: "1", + `{{ semver "1.2.3" | (semver "1.2.3").Compare }}`: `0`, + `{{ semver "1.2.3" | (semver "1.3.3").Compare }}`: `1`, + `{{ semver "1.4.3" | (semver "1.2.3").Compare }}`: `-1`, + } + for tpl, expect := range tests { + assert.NoError(t, runt(tpl, expect)) + } +}