1
0
mirror of https://github.com/strongdm/comply synced 2024-11-25 09:04:54 +00:00
comply/vendor/gopkg.in/blang/semver.v1
2019-07-14 13:51:10 -03:00
..
LICENSE chore: migrate to go modules 2019-07-14 13:51:10 -03:00
README.md chore: migrate to go modules 2019-07-14 13:51:10 -03:00
semver.go chore: migrate to go modules 2019-07-14 13:51:10 -03:00
sql.go chore: migrate to go modules 2019-07-14 13:51:10 -03:00

semver for golang Build Status GoDoc Coverage Status

semver is a Semantic Versioning library written in golang. It fully covers spec version 2.0.0.

Usage

$ go get github.com/blang/semver
import github.com/blang/semver
v1, err := semver.New("1.0.0-beta")
v2, err := semver.New("2.0.0-beta")
v1.Compare(v2)

Also check the GoDocs.

Why should I use this lib?

  • Fully spec compatible
  • No reflection
  • No regex
  • Fully tested (Coverage >99%)
  • Readable parsing/validation errors
  • Fast (See Benchmarks)
  • Only Stdlib

Features

  • Parsing and validation at all levels
  • Comparator-like comparisons
  • Compare Helper Methods
  • InPlace manipulation
  • database/sql compatible (sql.Scanner/Valuer)

Example

Have a look at full examples in examples/main.go

import github.com/blang/semver

v, err := semver.New("0.0.1-alpha.preview+123.github")
fmt.Printf("Major: %d\n", v.Major)
fmt.Printf("Minor: %d\n", v.Minor)
fmt.Printf("Patch: %d\n", v.Patch)
fmt.Printf("Pre: %s\n", v.Pre)
fmt.Printf("Build: %s\n", v.Build)

// Prerelease versions array
if len(v.Pre) > 0 {
    fmt.Println("Prerelease versions:")
    for i, pre := range v.Pre {
        fmt.Printf("%d: %q\n", i, pre)
    }
}

// Build meta data array
if len(v.Build) > 0 {
    fmt.Println("Build meta data:")
    for i, build := range v.Build {
        fmt.Printf("%d: %q\n", i, build)
    }
}

v001, err := semver.New("0.0.1")
// Compare using helpers: v.GT(v2), v.LT, v.GTE, v.LTE
v001.GT(v) == true
v.LT(v001) == true
v.GTE(v) == true
v.LTE(v) == true

// Or use v.Compare(v2) for comparisons (-1, 0, 1):
v001.Compare(v) == 1
v.Compare(v001) == -1
v.Compare(v) == 0

// Manipulate Version in place:
v.Pre[0], err = semver.NewPRVersion("beta")
if err != nil {
    fmt.Printf("Error parsing pre release version: %q", err)
}

fmt.Println("\nValidate versions:")
v.Build[0] = "?"

err = v.Validate()
if err != nil {
    fmt.Printf("Validation failed: %s\n", err)
}

Benchmarks

BenchmarkParseSimple        5000000           442    ns/op
BenchmarkParseComplex       1000000          2441    ns/op
BenchmarkParseAverage       1000000          1497    ns/op
BenchmarkValidateSimple   500000000             4.83 ns/op
BenchmarkValidateComplex    1000000          1236    ns/op
BenchmarkValidateAverage    5000000           580    ns/op
BenchmarkCompareSimple    500000000             5.43 ns/op
BenchmarkCompareComplex   100000000            26.3  ns/op
BenchmarkCompareAverage   100000000            29.6  ns/op

See benchmark cases at semver_test.go

Motivation

I simply couldn't find any lib supporting the full spec. Others were just wrong or used reflection and regex which i don't like.

Contribution

Feel free to make a pull request. For bigger changes create a issue first to discuss about it.

License

See LICENSE file.