diff --git a/.drone.yml b/.drone.yml deleted file mode 100644 index 8a10191..0000000 --- a/.drone.yml +++ /dev/null @@ -1,11 +0,0 @@ -workspace: - base: /go - path: src/github.com/jpoles1/gopherbadger -pipeline: - app: - image: golang:1.10.3 - commands: - - go get github.com/golang/dep/cmd/dep - - dep ensure - - make run - environment: \ No newline at end of file diff --git a/Gopkg.lock b/Gopkg.lock deleted file mode 100644 index d78a74b..0000000 --- a/Gopkg.lock +++ /dev/null @@ -1,80 +0,0 @@ -# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. - - -[[projects]] - digest = "1:4bb94bb2d837b5c7489d9e5e1fcffbc81fa1cb43024cbb4fe827787378f01e3b" - name = "github.com/fatih/color" - packages = ["."] - pruneopts = "UT" - revision = "507f6050b8568533fb3f5504de8e5205fa62a114" - version = "v1.6.0" - -[[projects]] - digest = "1:d45d0ae9aa93470f49280bcf0953419e867f8f26a6ec3218aafc31fb427d5bd0" - name = "github.com/fogleman/gg" - packages = ["."] - pruneopts = "UT" - revision = "6166aa3c1afaee416f384645a81636267aee6d25" - version = "v1.0.0" - -[[projects]] - branch = "master" - digest = "1:62c57507df491b657e9ae2645f30958d9964c8eeb380600469eedc951ebb3a0e" - name = "github.com/golang/freetype" - packages = [ - "raster", - "truetype", - ] - pruneopts = "UT" - revision = "e2365dfdc4a05e4b8299a783240d4a7d5a65d4e4" - -[[projects]] - digest = "1:c658e84ad3916da105a761660dcaeb01e63416c8ec7bc62256a9b411a05fcd67" - name = "github.com/mattn/go-colorable" - packages = ["."] - pruneopts = "UT" - revision = "167de6bfdfba052fa6b2d3664c8f5272e23c9072" - version = "v0.0.9" - -[[projects]] - digest = "1:d4d17353dbd05cb52a2a52b7fe1771883b682806f68db442b436294926bbfafb" - name = "github.com/mattn/go-isatty" - packages = ["."] - pruneopts = "UT" - revision = "0360b2af4f38e8d38c7fce2a9f4e702702d73a39" - version = "v0.0.3" - -[[projects]] - branch = "master" - digest = "1:53e6f54885d63f2c9afc898f10481d28295471dee95bb7faa74cee8a1df85e56" - name = "golang.org/x/image" - packages = [ - "font", - "font/basicfont", - "font/gofont/goregular", - "font/plan9font", - "math/fixed", - ] - pruneopts = "UT" - revision = "f3a9b89b59def9194717c1d0bd4c0d08fa1afa7b" - -[[projects]] - branch = "master" - digest = "1:bcdbc1c6f88196580500afc96255fb81b89e996ea43917c4973675c567f825ae" - name = "golang.org/x/sys" - packages = ["unix"] - pruneopts = "UT" - revision = "2f1e207ee39ff70f3433e49c6eb52677a515e3b5" - -[solve-meta] - analyzer-name = "dep" - analyzer-version = 1 - input-imports = [ - "github.com/fatih/color", - "github.com/fogleman/gg", - "github.com/golang/freetype/truetype", - "golang.org/x/image/font", - "golang.org/x/image/font/gofont/goregular", - ] - solver-name = "gps-cdcl" - solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml deleted file mode 100644 index cd2648c..0000000 --- a/Gopkg.toml +++ /dev/null @@ -1,38 +0,0 @@ -# Gopkg.toml example -# -# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md -# for detailed Gopkg.toml documentation. -# -# required = ["github.com/user/thing/cmd/thing"] -# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] -# -# [[constraint]] -# name = "github.com/user/project" -# version = "1.0.0" -# -# [[constraint]] -# name = "github.com/user/project2" -# branch = "dev" -# source = "github.com/myfork/project2" -# -# [[override]] -# name = "github.com/x/y" -# version = "2.4.0" -# -# [prune] -# non-go = false -# go-tests = true -# unused-packages = true - - -[[constraint]] - name = "github.com/fatih/color" - version = "1.6.0" - -[[constraint]] - name = "github.com/fogleman/gg" - version = "1.0.0" - -[prune] - go-tests = true - unused-packages = true diff --git a/Makefile b/Makefile index 6118732..3564ba3 100644 --- a/Makefile +++ b/Makefile @@ -1,16 +1,14 @@ build: - go build + @go build run: make build && ./gopherbadger -md="README.md" test: - go test -v + @go test -v cover: - go test ./... -coverprofile=coverage.out && go tool cover -html=coverage.out -o=coverage.html + @go test ./... -coverprofile=coverage.out && go tool cover -html=coverage.out -o=coverage.html coverage: make cover configure: make dep dep: - if ! [ -x "$(command -v dep)" ]; then\ - go get github.com/golang/dep/cmd/dep;\ - fi && dep ensure; + @go mod tidy diff --git a/coverage_badge.png b/coverage_badge.png index a7d2fcd..5e3661a 100644 Binary files a/coverage_badge.png and b/coverage_badge.png differ diff --git a/coverbadge/coverbadge.go b/coverbadge/coverbadge.go index 2dc893c..3987a34 100644 --- a/coverbadge/coverbadge.go +++ b/coverbadge/coverbadge.go @@ -2,12 +2,15 @@ package coverbadge import ( "fmt" - "github.com/jpoles1/gopherbadger/logging" "io" "io/ioutil" + "math" "net/http" "os" "regexp" + "strconv" + + "github.com/jpoles1/gopherbadger/logging" ) type Badge struct { @@ -20,8 +23,8 @@ func (badge Badge) generateBadgeBadgeURL(coverageFloat float64) string { if badge.CoveragePrefix != "" { badge.CoveragePrefix += "%20" } - urlTemplate := "https://img.shields.io/badge/%sCoverage-%.f%%25-brightgreen%s?longCache=true&style=%s" - return fmt.Sprintf(urlTemplate, badge.CoveragePrefix, coverageFloat, badge.ImageExtension, badge.Style) + urlTemplate := "https://img.shields.io/badge/%sCoverage-%s%%25-brightgreen%s?longCache=true&style=%s" + return fmt.Sprintf(urlTemplate, badge.CoveragePrefix, strconv.FormatFloat(math.Ceil(coverageFloat*10)/10, 'f', -1, 64), badge.ImageExtension, badge.Style) } func (badge Badge) DownloadBadge(filepath string, coverageFloat float64) { @@ -47,8 +50,6 @@ func (badge Badge) DownloadBadge(filepath string, coverageFloat float64) { logging.Fatal("Writing file to disk", err) return } - - return } func (badge Badge) WriteBadgeToMd(filepath string, coverageFloat float64) { diff --git a/coverbadge/coverbadge_test.go b/coverbadge/coverbadge_test.go index 6a93ca1..b4fd77d 100644 --- a/coverbadge/coverbadge_test.go +++ b/coverbadge/coverbadge_test.go @@ -3,6 +3,7 @@ package coverbadge import ( "testing" ) + var coverageBadge = Badge{ CoveragePrefix: "Go", Style: "flat", @@ -16,13 +17,13 @@ func TestWriteBadgeToMd(t *testing.T) { coverageBadge.WriteBadgeToMd("coverage_test.md", 22) } func TestGenerateBadgeBadgeURL_1(t *testing.T) { - testUrl(t, 1.1, "https://img.shields.io/badge/Go%20Coverage-1%25-brightgreen.png?longCache=true&style=flat") + testUrl(t, 1.1, "https://img.shields.io/badge/Go%20Coverage-1.1%25-brightgreen.png?longCache=true&style=flat") } func TestGenerateBadgeBadgeURL_10(t *testing.T) { - testUrl(t, 10.1, "https://img.shields.io/badge/Go%20Coverage-10%25-brightgreen.png?longCache=true&style=flat") + testUrl(t, 10.1, "https://img.shields.io/badge/Go%20Coverage-10.1%25-brightgreen.png?longCache=true&style=flat") } func TestGenerateBadgeBadgeURL_100(t *testing.T) { - testUrl(t, 100.1, "https://img.shields.io/badge/Go%20Coverage-100%25-brightgreen.png?longCache=true&style=flat") + testUrl(t, 100.0, "https://img.shields.io/badge/Go%20Coverage-100%25-brightgreen.png?longCache=true&style=flat") } func testUrl(t *testing.T, coverageFloat float64, expected string) { url := coverageBadge.generateBadgeBadgeURL(coverageFloat) diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..0ef964e --- /dev/null +++ b/go.mod @@ -0,0 +1,14 @@ +module github.com/jpoles1/gopherbadger + +go 1.15 + +require ( + github.com/ex-preman/gopherbadger/v3 v3.0.0 // indirect + github.com/fatih/color v1.6.0 + github.com/fogleman/gg v1.0.0 + github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 + github.com/mattn/go-colorable v0.0.9 // indirect + github.com/mattn/go-isatty v0.0.3 // indirect + golang.org/x/image v0.0.0-20180314180248-f3a9b89b59de + golang.org/x/sys v0.0.0-20180316202216-2f1e207ee39f // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..20bfb70 --- /dev/null +++ b/go.sum @@ -0,0 +1,18 @@ +github.com/ex-preman/gopherbadger v1.0.0 h1:w2iPAyJ0I/xEELQJIBDaZdjEVKFWbG3uqXsCUDyRRAs= +github.com/ex-preman/gopherbadger v2.4.0+incompatible h1:udvRB6XU/F15Wf34GPMMoSnBWYFqZGf3J7DW2Cjlkg8= +github.com/ex-preman/gopherbadger/v3 v3.0.0 h1:2d/gce392J+fB4b+YY1yHvwjnxk8wff04REbp/EVDb8= +github.com/ex-preman/gopherbadger/v3 v3.0.0/go.mod h1:FCEGvQZPUmoZGgEmcvq5jSD0RrF5cYUTF/JZ5b+6/UE= +github.com/fatih/color v1.6.0 h1:66qjqZk8kalYAvDRtM1AdAJQI0tj4Wrue3Eq3B3pmFU= +github.com/fatih/color v1.6.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fogleman/gg v1.0.0 h1:O2ToZn8ijCP2gXhVY701P1b1jrxKoVPh6CkaX2/PACE= +github.com/fogleman/gg v1.0.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.3 h1:ns/ykhmWi7G9O+8a448SecJU3nSMBXJfqQkl0upE1jI= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +golang.org/x/image v0.0.0-20180314180248-f3a9b89b59de h1:moc8EjTGZXlnKJcoDZDWCDV1Vn3Zt/MZDpIRmIs7qt0= +golang.org/x/image v0.0.0-20180314180248-f3a9b89b59de/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= +golang.org/x/sys v0.0.0-20180316202216-2f1e207ee39f h1:KjX81lL92yfj4utcAnxT/sgJt8XTuOkDN7Rr3HJmmZ8= +golang.org/x/sys v0.0.0-20180316202216-2f1e207ee39f/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/main.go b/main.go index df9506a..6db39a0 100644 --- a/main.go +++ b/main.go @@ -28,17 +28,18 @@ func getCommandOutput(commandString string) chan float64 { if nil != err { log.Fatalf("Error obtaining stdout: %s", err.Error()) } + reader := bufio.NewReader(stdout) coverageFloatChannel := make(chan float64) go func(reader io.Reader) { - re := regexp.MustCompile("total:\\s*\\(statements\\)?\\s*(\\d+\\.?\\d*)\\s*\\%") + re := regexp.MustCompile(`total:\s*\(statements\)?\s*(\d+\.?\d*)\s*\%`) scanner := bufio.NewScanner(reader) for scanner.Scan() { lineText := scanner.Text() match := re.FindStringSubmatch(lineText) if len(match) == 2 { color.Green(lineText) - //fmt.Printf("Found coverage = %s%\n", match[1]) + // fmt.Printf("Found coverage = %s\n", match[1]) coverageValue, err := strconv.ParseFloat(match[1], 32) errCheck("Parsing coverage to float", err) if err == nil { @@ -49,10 +50,16 @@ func getCommandOutput(commandString string) chan float64 { fmt.Println(lineText) } } - cmd.Wait() + if err := cmd.Wait(); err != nil { + log.Fatal(err) + } + if err := scanner.Err(); err != nil { + log.Fatal(err) + } }(reader) - if err := cmd.Run(); nil != err { - log.Fatalf("Error running program: %s, %s", cmd.Path, err) + + if err := cmd.Start(); err != nil { + log.Fatal(err) } return coverageFloatChannel } @@ -141,7 +148,13 @@ func badger(config gopherBadgerConfig) { } else { coverageFloat = config.manualCoverageFlag } - if config.badgeOutputFlag == true { + + // validate coverageFloat value + if coverageFloat < float64(0) || coverageFloat > float64(100) { + logging.Fatal("Invalid percentage value! Must be a value between 0-100", errors.New("Invalid coverage value")) + } + + if config.badgeOutputFlag { coverageBadge.DownloadBadge("coverage_badge.png", coverageFloat) } if config.updateMdFilesFlag != "" { diff --git a/main_test.go b/main_test.go index d594fd0..8eedc03 100644 --- a/main_test.go +++ b/main_test.go @@ -25,9 +25,9 @@ func TestBadger(t *testing.T) { } func TestDrawBadge(t *testing.T) { - drawBadge(22.7, "test_badge.png") - drawBadge(88, "test_badge.png") - drawBadge(66, "test_badge.png") + _ = drawBadge(22.7, "test_badge.png") + _ = drawBadge(88, "test_badge.png") + _ = drawBadge(66, "test_badge.png") if drawBadge(66, "bad_folder/test_badge.png") == nil { t.Error("Should respond with error when saving to invalid folder") }