From 347e79610e69fda2be0ed4b4c4f1ea87856f3ff2 Mon Sep 17 00:00:00 2001 From: lealife Date: Fri, 1 Dec 2017 10:52:41 +0800 Subject: [PATCH] add vendor agtorre/gocolorize --- .../github.com/agtorre/gocolorize/.gitignore | 2 + .../github.com/agtorre/gocolorize/LICENSE.txt | 22 ++ .../github.com/agtorre/gocolorize/README.md | 135 ++++++++++ .../gocolorize/examples/logging/logging.go | 50 ++++ .../agtorre/gocolorize/examples/song/song.go | 44 ++++ .../agtorre/gocolorize/gocolorize.go | 233 ++++++++++++++++++ .../agtorre/gocolorize/gocolorize_test.go | 141 +++++++++++ .../agtorre/gocolorize/screenshot/tests.png | Bin 0 -> 19677 bytes .../github.com/agtorre/gocolorize/wercker.yml | 46 ++++ 9 files changed, 673 insertions(+) create mode 100644 vendor/github.com/agtorre/gocolorize/.gitignore create mode 100644 vendor/github.com/agtorre/gocolorize/LICENSE.txt create mode 100644 vendor/github.com/agtorre/gocolorize/README.md create mode 100644 vendor/github.com/agtorre/gocolorize/examples/logging/logging.go create mode 100644 vendor/github.com/agtorre/gocolorize/examples/song/song.go create mode 100644 vendor/github.com/agtorre/gocolorize/gocolorize.go create mode 100644 vendor/github.com/agtorre/gocolorize/gocolorize_test.go create mode 100644 vendor/github.com/agtorre/gocolorize/screenshot/tests.png create mode 100644 vendor/github.com/agtorre/gocolorize/wercker.yml diff --git a/vendor/github.com/agtorre/gocolorize/.gitignore b/vendor/github.com/agtorre/gocolorize/.gitignore new file mode 100644 index 0000000..36980ba --- /dev/null +++ b/vendor/github.com/agtorre/gocolorize/.gitignore @@ -0,0 +1,2 @@ +*.swp +*.test diff --git a/vendor/github.com/agtorre/gocolorize/LICENSE.txt b/vendor/github.com/agtorre/gocolorize/LICENSE.txt new file mode 100644 index 0000000..fc1bc5a --- /dev/null +++ b/vendor/github.com/agtorre/gocolorize/LICENSE.txt @@ -0,0 +1,22 @@ +# This is the MIT license + +# Copyright (c) 2013 Aaron G. Torres All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/agtorre/gocolorize/README.md b/vendor/github.com/agtorre/gocolorize/README.md new file mode 100644 index 0000000..aaa3357 --- /dev/null +++ b/vendor/github.com/agtorre/gocolorize/README.md @@ -0,0 +1,135 @@ + + +#Gocolorize +Gocolorize is a package that allows Go programs to provide ANSI coloring in a stateful manner. Gocolorize is ideal for logging or cli applications. + +![colored tests passing](https://raw.github.com/agtorre/gocolorize/master/screenshot/tests.png) + +[![wercker status](https://app.wercker.com/status/ee73c1abee9900c475def6ff9a142237/s "wercker status")](https://app.wercker.com/project/bykey/ee73c1abee9900c475def6ff9a142237) + + +##Features +- Stateful ANSI coloring +- Supports Foreground and background colors +- Supports a nuber of text properties such as bold or underline +- Color multiple arguments +- Color multiple interfaces, including complex types +- Tests with 100% coverage +- Working examples +- Disable ability for portability + + +##Install Gocolorize +To install: + + $ go get github.com/agtorre/gocolorize + +##Usage +Ways to initialize a Colorize object: +```go + //It can be done like this + var c gocolorize.Colorize + c.SetFg(gocolorize.Red) + c.SetBg(gocolorize.Black) + + //Or this + c := gocolorize.Colorize{Fg: gocolorize.Red, Bg: gocolorize.Black} + + //Or this + c := gocolorize.NewColor("red:black") + +``` + +Once you have an object: +```go + //Call Paint to take inputs and return a colored string + c.Paint("This", "accepts", "multiple", "arguments", "and", "types:", 1, 1.25, "etc") + + //If you want a short-hand closure + p = c.Paint + p("Neat") + + //To print it: + Fmt.Println(p("test")) + + //It can also be appended to other strings, used in logging to stdout, etc. + a := "test " + p("case") + + //The closure allows you to reuse the original object, for example + p = c.Paint + c.SetFg(gocolorize.Green) + p2 = c.Paint + Fmt.Println(p("different" + " " + p2("colors"))) +``` + +Object Properties: +```go + //These will only apply if there is a Fg and Bg respectively + c.ToggleFgIntensity() + c.ToggleBgIntensity() + + //Set additional attributes + c.ToggleBold() + c.ToggleBlink() + c.ToggleUnderLine() + c.ToggleInverse() + + //To disable or renable everything color (for example on Windows) + //the other functions will still work, they'll just return plain + //text for portability + gocolorize.SetPlain(true) +``` + +##NewColor String Format +```go +"foregroundColor+attributes:backgroundColor+attributes" +``` + +Colors: +* black +* red +* green +* yellow +* blue +* magenta +* cyan +* white + +Attributes: +* b = bold foreground +* B = blink foreground +* u = underline foreground +* h = high intensity (bright) foreground, background +* i = inverse + + +##Examples +See examples directory for examples: + + $ cd examples/ + $ go run song.go + $ go run logging.go + + +##Tests +Tests are another good place to see examples. In order to run tests: + + $ go test -cover + +##Portability +ANSI coloring will not work in default Windows environments and may not work in other environments correctly. In order to allow compatibility with these environments, you can call: + +```go +gocolorize.SetPlain(true) +``` + +Once toggled, the library will still function, but it will not color the output. + +## References + +Wikipedia ANSI escape codes [Colors](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors) + +[A stylesheet author's guide to terminal colors](http://wynnnetherland.com/journal/a-stylesheet-author-s-guide-to-terminal-colors) + +## Special Thanks +https://github.com/mgutz/ansi was an inspiration for the latest version. I did a lot of rewriting, removed the 'paints' module, and did a lot of general cleanup. I learned a lot reading this and using this code. diff --git a/vendor/github.com/agtorre/gocolorize/examples/logging/logging.go b/vendor/github.com/agtorre/gocolorize/examples/logging/logging.go new file mode 100644 index 0000000..4bc50be --- /dev/null +++ b/vendor/github.com/agtorre/gocolorize/examples/logging/logging.go @@ -0,0 +1,50 @@ +// Copyright (c) 2013 Aaron Torres. All rights reserved. +package main + +import ( + "github.com/agtorre/gocolorize" + "log" + "os" +) + +var ( + INFO *log.Logger + WARNING *log.Logger + CRITICAL *log.Logger +) + +type MyError struct { + What string +} + +func main() { + //Revel Example + + //first set some color information + info := gocolorize.NewColor("green") + warning := gocolorize.NewColor("yellow") + + critical := gocolorize.NewColor("black+u:red") + //We could also do this + //critical.ToggleUnderline() + + //helper functions to shorten code + i := info.Paint + w := warning.Paint + c := critical.Paint + + //Define the look/feel of the INFO logger + INFO = log.New(os.Stdout, i("INFO "), log.Ldate|log.Lmicroseconds|log.Lshortfile) + WARNING = log.New(os.Stdout, w("WARNING "), log.Ldate|log.Lmicroseconds|log.Lshortfile) + CRITICAL = log.New(os.Stdout, c("CRITICAL")+" ", log.Ldate|log.Lmicroseconds|log.Lshortfile) + + //print out some messages, note the i wrappers for yellow text on the actual info string + INFO.Println(i("Loaded module x")) + INFO.Println(i("Loaded module y")) + WARNING.Println(w("Failed to load module z")) + + e := MyError{What: "Failed"} + + CRITICAL.Println(c("Failed with an error code:", e)) + +} diff --git a/vendor/github.com/agtorre/gocolorize/examples/song/song.go b/vendor/github.com/agtorre/gocolorize/examples/song/song.go new file mode 100644 index 0000000..630544c --- /dev/null +++ b/vendor/github.com/agtorre/gocolorize/examples/song/song.go @@ -0,0 +1,44 @@ +// Copyright (c) 2013 Aaron Torres. All rights reserved. +package main + +import ( + "fmt" + "github.com/agtorre/gocolorize" +) + +func main() { + // one way to define a stateful colorizer + var green gocolorize.Colorize + green.SetColor(gocolorize.Green) + g := green.Paint + + // Another way to do it + red := gocolorize.Colorize{Fg: gocolorize.Red} + r := red.Paint + + // now with string construction + green_black := gocolorize.Colorize{Fg: gocolorize.Blue} + + // toggle attributes + green_black.ToggleUnderline() + b := green_black.Paint + + //all in 1 line + c := gocolorize.NewColor("yellow:black").Paint + + fmt.Println(b("On the twelfth day of Christmas")) + fmt.Println(b("my true love sent to me:")) + fmt.Println(g("Twelve"), c("Drummers"), r("Drumming")) + fmt.Println(g("Eleven"), c("Pipers"), r("Piping")) + fmt.Println(g("Ten"), c("Lords"), r("a Leaping")) + fmt.Println(g("Nine"), c("Ladies"), r("Dancing")) + fmt.Println(g("Eight"), c("Maids"), r("a Milking")) + fmt.Println(g("Seven"), c("Swans"), r("a Swimming")) + fmt.Println(g("Six"), c("Geese"), r("a Laying")) + fmt.Println(g("Five"), c("Golden"), r("Rings")) + fmt.Println(g("Four"), c("Calling"), r("Birds")) + fmt.Println(g("Three"), c("French"), r("Hens")) + fmt.Println(g("Two"), c("Turtle"), r("Doves")) + fmt.Println(b("and a Partridge in a Pear Tree")) + +} diff --git a/vendor/github.com/agtorre/gocolorize/gocolorize.go b/vendor/github.com/agtorre/gocolorize/gocolorize.go new file mode 100644 index 0000000..0db8130 --- /dev/null +++ b/vendor/github.com/agtorre/gocolorize/gocolorize.go @@ -0,0 +1,233 @@ +package gocolorize + +import ( + "fmt" + "strings" +) + +//internal usage +var plain = false + +const ( + start = "\033[" + reset = "\033[0m" + bold = "1;" + blink = "5;" + underline = "4;" + inverse = "7;" + normalIntensityFg = 30 + highIntensityFg = 90 + normalIntensityBg = 40 + highIntensityBg = 100 +) + +//The rest is external facing + +//Color can be used for Fg and Bg +type Color int + +const ( + ColorNone = iota + //placeholder here so we don't confuse with ColorNone + Red + Green + Yellow + Blue + Magenta + Cyan + White + Black Color = -1 +) + +var colors = map[string]Color{ + "red": Red, + "green": Green, + "yellow": Yellow, + "blue": Blue, + "magenta": Magenta, + "cyan": Cyan, + "white": White, + "black": Black, +} + +//Can set 1 or more of these properties +//This struct holds the state +type Property struct { + Bold bool + Blink bool + Underline bool + Inverse bool + Fgi bool + Bgi bool +} + +//Where the magic happens +type Colorize struct { + Value []interface{} + Fg Color + Bg Color + Prop Property +} + +//returns a value you can stick into print, of type string +func (c Colorize) Paint(v ...interface{}) string { + c.Value = v + return fmt.Sprint(c) +} + +func propsString(p Property) string { + var result string + if p.Bold { + result += bold + } + if p.Blink { + result += blink + } + if p.Underline { + result += underline + } + if p.Inverse { + result += inverse + } + return result +} + +// Format allows ColorText to satisfy the fmt.Formatter interface. The format +// behaviour is the same as for fmt.Print. +func (ct Colorize) Format(fs fmt.State, c rune) { + var base int + //fmt.Println(ct.Fg, ct.Fgi, ct.Bg, ct.Bgi, ct.Prop) + //First Handle the Fg styles and options + if ct.Fg != ColorNone && !plain { + if ct.Prop.Fgi { + base = int(highIntensityFg) + } else { + base = int(normalIntensityFg) + } + if ct.Fg == Black { + base = base + } else { + base = base + int(ct.Fg) + } + fmt.Fprint(fs, start, "0;", propsString(ct.Prop), base, "m") + } + //Next Handle the Bg styles and options + if ct.Bg != ColorNone && !plain { + if ct.Prop.Bgi { + base = int(highIntensityBg) + } else { + base = int(normalIntensityBg) + } + if ct.Bg == Black { + base = base + } else { + base = base + int(ct.Bg) + } + //We still want to honor props if only the background is set + if ct.Fg == ColorNone { + fmt.Fprint(fs, start, propsString(ct.Prop), base, "m") + //fmt.Fprint(fs, start, base, "m") + } else { + fmt.Fprint(fs, start, base, "m") + } + } + + // I simplified this to be a bit less efficient, + // but more robust, it will work with anything that + // printf("%v") will support + for i, v := range ct.Value { + fmt.Fprintf(fs, fmt.Sprint(v)) + if i < len(ct.Value)-1 { + fmt.Fprintf(fs, " ") + } + } + + //after we finish go back to a clean state + if !plain { + fmt.Fprint(fs, reset) + } +} + +func NewColor(style string) Colorize { + //Thank you https://github.com/mgutz/ansi for + //this code example and for a bunch of other ideas + foreground_background := strings.Split(style, ":") + foreground := strings.Split(foreground_background[0], "+") + fg := colors[foreground[0]] + fgStyle := "" + if len(foreground) > 1 { + fgStyle = foreground[1] + } + + var bg Color + bgStyle := "" + if len(foreground_background) > 1 { + background := strings.Split(foreground_background[1], "+") + bg = colors[background[0]] + if len(background) > 1 { + bgStyle = background[1] + } + } + + c := Colorize{Fg: fg, Bg: bg} + if len(fgStyle) > 0 { + if strings.Contains(fgStyle, "b") { + c.ToggleBold() + } + if strings.Contains(fgStyle, "B") { + c.ToggleBlink() + } + if strings.Contains(fgStyle, "u") { + c.ToggleUnderline() + } + if strings.Contains(fgStyle, "i") { + c.ToggleInverse() + } + if strings.Contains(fgStyle, "h") { + c.ToggleFgIntensity() + } + } + + if len(bgStyle) > 0 { + if strings.Contains(bgStyle, "h") { + c.ToggleBgIntensity() + } + } + return c +} + +func (C *Colorize) SetColor(c Color) { + C.Fg = c +} + +func (C *Colorize) SetBgColor(b Color) { + C.Bg = b +} + +func (C *Colorize) ToggleFgIntensity() { + C.Prop.Fgi = !C.Prop.Fgi +} + +func (C *Colorize) ToggleBgIntensity() { + C.Prop.Bgi = !C.Prop.Bgi +} + +func (C *Colorize) ToggleBold() { + C.Prop.Bold = !C.Prop.Bold +} + +func (C *Colorize) ToggleBlink() { + C.Prop.Blink = !C.Prop.Blink +} + +func (C *Colorize) ToggleUnderline() { + C.Prop.Underline = !C.Prop.Underline +} + +func (C *Colorize) ToggleInverse() { + C.Prop.Inverse = !C.Prop.Inverse +} + +func SetPlain(p bool) { + plain = p +} diff --git a/vendor/github.com/agtorre/gocolorize/gocolorize_test.go b/vendor/github.com/agtorre/gocolorize/gocolorize_test.go new file mode 100644 index 0000000..d0ad639 --- /dev/null +++ b/vendor/github.com/agtorre/gocolorize/gocolorize_test.go @@ -0,0 +1,141 @@ +package gocolorize + +import ( + "fmt" + "log" + "testing" +) + +var ( + DEBUG *log.Logger + WARN *log.Logger +) + +func TestPaint(t *testing.T) { + var blue Colorize + + //set some state + blue.SetColor(Blue) + + outString := fmt.Sprintf("Testing %s", blue.Paint("paint")) + basisString := "Testing \033[0;34mpaint\033[0m" + if outString != basisString { + t.Errorf("Error: string '%s' does not match '%s'\n", outString, basisString) + } else { + fmt.Printf("Success: string: '%s' matches '%s'\n", outString, basisString) + } +} + +func TestPaintString(t *testing.T) { + var red Colorize + + //set some state + red.SetColor(Red) + + outString := red.Paint("Returning a string") + basisString := "\033[0;31mReturning a string\033[0m" + if outString != basisString { + t.Errorf("Error: string '%s' does not match '%s'\n", outString, basisString) + } else { + fmt.Printf("Success: string: '%s' matches '%s'\n", outString, basisString) + } +} + +func TestSetColorSetBgColor(t *testing.T) { + var whiteRedBg Colorize + + //set color and background + whiteRedBg.SetColor(White) + whiteRedBg.SetBgColor(Red) + + outString := whiteRedBg.Paint("Setting a foreground and background color!") + basisString := "\033[0;37m\033[41mSetting a foreground and background color!\033[0m" + if outString != basisString { + t.Errorf("Error: string '%s' does not match '%s'\n", outString, basisString) + } else { + fmt.Printf("Success: string: '%s' matches '%s'\n", outString, basisString) + } +} + +func TestPaintMultipleInterface(t *testing.T) { + blue := Colorize{Fg: Blue} + outString := blue.Paint("Multiple types of args:", 1, 1.24) + basisString := "\033[0;34mMultiple types of args: 1 1.24\033[0m" + if outString != basisString { + t.Errorf("Error: string '%s' does not match '%s'\n", outString, basisString) + } else { + fmt.Printf("Success: string: '%s' matches '%s'\n", outString, basisString) + } +} + +func TestPaintComplexType(t *testing.T) { + green := Colorize{Bg: Green} + outString := green.Paint("Complex types:", + struct { + int + string + }{}) + basisString := fmt.Sprintf("\033[42mComplex types: %v\033[0m", struct { + int + string + }{}) + if outString != basisString { + t.Errorf("Error: string '%s' does not match '%s'\n", outString, basisString) + } else { + fmt.Printf("Success: string: '%s' matches '%s'\n", outString, basisString) + } +} + +func TestInitialize(t *testing.T) { + blackOnWhite := Colorize{Fg: Black, Bg: White} + f := blackOnWhite.Paint + + outString := f("Now this is cool") + basisString := "\033[0;30m\033[47mNow this is cool\033[0m" + if outString != basisString { + t.Errorf("Error: string '%s' does not match '%s'\n", outString, basisString) + } else { + fmt.Printf("Success: string: '%s' matches '%s'\n", outString, basisString) + } +} + +func TestToggle(t *testing.T) { + craziness := Colorize{Fg: Yellow, Bg: Black} + craziness.ToggleFgIntensity() + craziness.ToggleBgIntensity() + craziness.ToggleBold() + craziness.ToggleBlink() + craziness.ToggleUnderline() + craziness.ToggleInverse() + + outString := craziness.Paint("craziness") + basisString := "\033[0;1;5;4;7;93m\033[100mcraziness\033[0m" + if outString != basisString { + t.Errorf("Error: string '%s' does not match '%s'\n", outString, basisString) + } else { + fmt.Printf("Success: string: '%s' matches '%s'\n", outString, basisString) + } +} +func TestNewAllToggle(t *testing.T) { + n := NewColor("yellow+bBuih:black+h") + outString := n.Paint("all toggles in 1 line!") + basisString := "\033[0;1;5;4;7;93m\033[100mall toggles in 1 line!\033[0m" + if outString != basisString { + t.Errorf("Error: string '%s' does not match '%s'\n", outString, basisString) + } else { + fmt.Printf("Success: string: '%s' matches '%s'\n", outString, basisString) + } +} + +func TestPlain(t *testing.T) { + plain := Colorize{Fg: Magenta} + SetPlain(true) + outString := plain.Paint("plain", "text") + basisString := "plain text" + if outString != basisString { + t.Errorf("Error: string '%s' does not match '%s'\n", outString, basisString) + } else { + fmt.Printf("Success: string: '%s' matches '%s'\n", outString, basisString) + } + SetPlain(false) +} diff --git a/vendor/github.com/agtorre/gocolorize/screenshot/tests.png b/vendor/github.com/agtorre/gocolorize/screenshot/tests.png new file mode 100644 index 0000000000000000000000000000000000000000..a9e2c53794fd2b4bc4c2409e73e29180fd3c5c5e GIT binary patch literal 19677 zcma&O1yEdF*Cl+hpa~8k!QGwUmOyZKhXi+b*B}Y5!QBZSv}ea~5YowfHSQdv>zCE6P_003UfNK2>!0K6ycxB&$o_V=ySlt9^gRI^`YZKzWy6+^L=_QOIKmF+Q*c;8{=dv(A?YJz;buE)G3O^vpc|9+*|O;S##KFWFibn1E8XsKw_$kcfJ%im|>xEb)Cj^XIc%*hY0 zJt(=!H~pcCe@4kGok*^Y!T!Lp+0xx%BG;E8|E-w_GsBNZr`V`7𝔎;l9E~;2qvw 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 literal 0 HcmV?d00001 diff --git a/vendor/github.com/agtorre/gocolorize/wercker.yml b/vendor/github.com/agtorre/gocolorize/wercker.yml new file mode 100644 index 0000000..f2839f3 --- /dev/null +++ b/vendor/github.com/agtorre/gocolorize/wercker.yml @@ -0,0 +1,46 @@ +# This references the default golang container from +# the Docker Hub: https://registry.hub.docker.com/u/library/golang/ +# If you want Google's container you would reference google/golang +# Read more about containers on our dev center +# http://devcenter.wercker.com/docs/containers/index.html +box: golang +# This is the build pipeline. Pipelines are the core of wercker +# Read more about pipelines on our dev center +# http://devcenter.wercker.com/docs/pipelines/index.html + +# You can also use services such as databases. Read more on our dev center: +# http://devcenter.wercker.com/docs/services/index.html +# services: + # - postgres + # http://devcenter.wercker.com/docs/services/postgresql.html + + # - mongo + # http://devcenter.wercker.com/docs/services/mongodb.html +build: + # The steps that will be executed on build + # Steps make up the actions in your pipeline + # Read more about steps on our dev center: + # http://devcenter.wercker.com/docs/steps/index.html + steps: + # Sets the go workspace and places you package + # at the right place in the workspace tree + - setup-go-workspace + + # Gets the dependencies + - script: + name: go get + code: | + go get + + # Build the project + - script: + name: go build + code: | + go build ./... + + # Test the project + - script: + name: go test + code: | + go test ./... +