diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json deleted file mode 100644 index f487156..0000000 --- a/Godeps/Godeps.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "ImportPath": "github.com/cloudescape/gowsdl", - "GoVersion": "go1.3.3", - "Deps": [ - { - "ImportPath": "github.com/jessevdk/go-flags", - "Comment": "v1-200-g7047cf7", - "Rev": "7047cf7a8dc6f41e53365420ab62d415055232c6" - }, - { - "ImportPath": "gopkg.in/inconshreveable/log15.v2", - "Comment": "v2.2", - "Rev": "6496dcc0b79933520138fe7ab8bb208877c1e2cd" - } - ] -} diff --git a/Godeps/Readme b/Godeps/Readme deleted file mode 100644 index 4cdaa53..0000000 --- a/Godeps/Readme +++ /dev/null @@ -1,5 +0,0 @@ -This directory tree is generated automatically by godep. - -Please do not edit. - -See https://github.com/tools/godep for more information. diff --git a/Godeps/_workspace/.gitignore b/Godeps/_workspace/.gitignore deleted file mode 100644 index f037d68..0000000 --- a/Godeps/_workspace/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/pkg -/bin diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/LICENSE b/Godeps/_workspace/src/github.com/jessevdk/go-flags/LICENSE deleted file mode 100644 index bcca0d5..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/LICENSE +++ /dev/null @@ -1,26 +0,0 @@ -Copyright (c) 2012 Jesse van den Kieboom. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - * Neither the name of Google Inc. nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/README.md b/Godeps/_workspace/src/github.com/jessevdk/go-flags/README.md deleted file mode 100644 index 7daf91c..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/README.md +++ /dev/null @@ -1,129 +0,0 @@ -go-flags: a go library for parsing command line arguments -========================================================= - -This library provides similar functionality to the builtin flag library of -go, but provides much more functionality and nicer formatting. From the -documentation: - -Package flags provides an extensive command line option parser. -The flags package is similar in functionality to the go builtin flag package -but provides more options and uses reflection to provide a convenient and -succinct way of specifying command line options. - -Supported features: -* Options with short names (-v) -* Options with long names (--verbose) -* Options with and without arguments (bool v.s. other type) -* Options with optional arguments and default values -* Multiple option groups each containing a set of options -* Generate and print well-formatted help message -* Passing remaining command line arguments after -- (optional) -* Ignoring unknown command line options (optional) -* Supports -I/usr/include -I=/usr/include -I /usr/include option argument specification -* Supports multiple short options -aux -* Supports all primitive go types (string, int{8..64}, uint{8..64}, float) -* Supports same option multiple times (can store in slice or last option counts) -* Supports maps -* Supports function callbacks -* Supports namespaces for (nested) option groups - -The flags package uses structs, reflection and struct field tags -to allow users to specify command line options. This results in very simple -and concise specification of your application options. For example: - - type Options struct { - Verbose []bool `short:"v" long:"verbose" description:"Show verbose debug information"` - } - -This specifies one option with a short name -v and a long name --verbose. -When either -v or --verbose is found on the command line, a 'true' value -will be appended to the Verbose field. e.g. when specifying -vvv, the -resulting value of Verbose will be {[true, true, true]}. - -Example: --------- - var opts struct { - // Slice of bool will append 'true' each time the option - // is encountered (can be set multiple times, like -vvv) - Verbose []bool `short:"v" long:"verbose" description:"Show verbose debug information"` - - // Example of automatic marshalling to desired type (uint) - Offset uint `long:"offset" description:"Offset"` - - // Example of a callback, called each time the option is found. - Call func(string) `short:"c" description:"Call phone number"` - - // Example of a required flag - Name string `short:"n" long:"name" description:"A name" required:"true"` - - // Example of a value name - File string `short:"f" long:"file" description:"A file" value-name:"FILE"` - - // Example of a pointer - Ptr *int `short:"p" description:"A pointer to an integer"` - - // Example of a slice of strings - StringSlice []string `short:"s" description:"A slice of strings"` - - // Example of a slice of pointers - PtrSlice []*string `long:"ptrslice" description:"A slice of pointers to string"` - - // Example of a map - IntMap map[string]int `long:"intmap" description:"A map from string to int"` - } - - // Callback which will invoke callto: to call a number. - // Note that this works just on OS X (and probably only with - // Skype) but it shows the idea. - opts.Call = func(num string) { - cmd := exec.Command("open", "callto:"+num) - cmd.Start() - cmd.Process.Release() - } - - // Make some fake arguments to parse. - args := []string{ - "-vv", - "--offset=5", - "-n", "Me", - "-p", "3", - "-s", "hello", - "-s", "world", - "--ptrslice", "hello", - "--ptrslice", "world", - "--intmap", "a:1", - "--intmap", "b:5", - "arg1", - "arg2", - "arg3", - } - - // Parse flags from `args'. Note that here we use flags.ParseArgs for - // the sake of making a working example. Normally, you would simply use - // flags.Parse(&opts) which uses os.Args - args, err := flags.ParseArgs(&opts, args) - - if err != nil { - panic(err) - os.Exit(1) - } - - fmt.Printf("Verbosity: %v\n", opts.Verbose) - fmt.Printf("Offset: %d\n", opts.Offset) - fmt.Printf("Name: %s\n", opts.Name) - fmt.Printf("Ptr: %d\n", *opts.Ptr) - fmt.Printf("StringSlice: %v\n", opts.StringSlice) - fmt.Printf("PtrSlice: [%v %v]\n", *opts.PtrSlice[0], *opts.PtrSlice[1]) - fmt.Printf("IntMap: [a:%v b:%v]\n", opts.IntMap["a"], opts.IntMap["b"]) - fmt.Printf("Remaining args: %s\n", strings.Join(args, " ")) - - // Output: Verbosity: [true true] - // Offset: 5 - // Name: Me - // Ptr: 3 - // StringSlice: [hello world] - // PtrSlice: [hello world] - // IntMap: [a:1 b:5] - // Remaining args: arg1 arg2 arg3 - -More information can be found in the godocs: diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/arg.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/arg.go deleted file mode 100644 index fd8db9c..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/arg.go +++ /dev/null @@ -1,21 +0,0 @@ -package flags - -import ( - "reflect" -) - -// Arg represents a positional argument on the command line. -type Arg struct { - // The name of the positional argument (used in the help) - Name string - - // A description of the positional argument (used in the help) - Description string - - value reflect.Value - tag multiTag -} - -func (a *Arg) isRemaining() bool { - return a.value.Type().Kind() == reflect.Slice -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/arg_test.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/arg_test.go deleted file mode 100644 index faea280..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/arg_test.go +++ /dev/null @@ -1,53 +0,0 @@ -package flags - -import ( - "testing" -) - -func TestPositional(t *testing.T) { - var opts = struct { - Value bool `short:"v"` - - Positional struct { - Command int - Filename string - Rest []string - } `positional-args:"yes" required:"yes"` - }{} - - p := NewParser(&opts, Default) - ret, err := p.ParseArgs([]string{"10", "arg_test.go", "a", "b"}) - - if err != nil { - t.Fatalf("Unexpected error: %v", err) - return - } - - if opts.Positional.Command != 10 { - t.Fatalf("Expected opts.Positional.Command to be 10, but got %v", opts.Positional.Command) - } - - if opts.Positional.Filename != "arg_test.go" { - t.Fatalf("Expected opts.Positional.Filename to be \"arg_test.go\", but got %v", opts.Positional.Filename) - } - - assertStringArray(t, opts.Positional.Rest, []string{"a", "b"}) - assertStringArray(t, ret, []string{}) -} - -func TestPositionalRequired(t *testing.T) { - var opts = struct { - Value bool `short:"v"` - - Positional struct { - Command int - Filename string - Rest []string - } `positional-args:"yes" required:"yes"` - }{} - - p := NewParser(&opts, None) - _, err := p.ParseArgs([]string{"10"}) - - assertError(t, err, ErrRequired, "the required argument `Filename` was not provided") -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/assert_test.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/assert_test.go deleted file mode 100644 index 2cb550d..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/assert_test.go +++ /dev/null @@ -1,125 +0,0 @@ -package flags - -import ( - "fmt" - "path" - "runtime" - "testing" -) - -func assertCallerInfo() (string, int) { - ptr := make([]uintptr, 15) - n := runtime.Callers(1, ptr) - - if n == 0 { - return "", 0 - } - - mef := runtime.FuncForPC(ptr[0]) - mefile, meline := mef.FileLine(ptr[0]) - - for i := 2; i < n; i++ { - f := runtime.FuncForPC(ptr[i]) - file, line := f.FileLine(ptr[i]) - - if file != mefile { - return file, line - } - } - - return mefile, meline -} - -func assertErrorf(t *testing.T, format string, args ...interface{}) { - msg := fmt.Sprintf(format, args...) - - file, line := assertCallerInfo() - - t.Errorf("%s:%d: %s", path.Base(file), line, msg) -} - -func assertFatalf(t *testing.T, format string, args ...interface{}) { - msg := fmt.Sprintf(format, args...) - - file, line := assertCallerInfo() - - t.Fatalf("%s:%d: %s", path.Base(file), line, msg) -} - -func assertString(t *testing.T, a string, b string) { - if a != b { - assertErrorf(t, "Expected %#v, but got %#v", b, a) - } -} - -func assertStringArray(t *testing.T, a []string, b []string) { - if len(a) != len(b) { - assertErrorf(t, "Expected %#v, but got %#v", b, a) - return - } - - for i, v := range a { - if b[i] != v { - assertErrorf(t, "Expected %#v, but got %#v", b, a) - return - } - } -} - -func assertBoolArray(t *testing.T, a []bool, b []bool) { - if len(a) != len(b) { - assertErrorf(t, "Expected %#v, but got %#v", b, a) - return - } - - for i, v := range a { - if b[i] != v { - assertErrorf(t, "Expected %#v, but got %#v", b, a) - return - } - } -} - -func assertParserSuccess(t *testing.T, data interface{}, args ...string) (*Parser, []string) { - parser := NewParser(data, Default&^PrintErrors) - ret, err := parser.ParseArgs(args) - - if err != nil { - t.Fatalf("Unexpected parse error: %s", err) - return nil, nil - } - - return parser, ret -} - -func assertParseSuccess(t *testing.T, data interface{}, args ...string) []string { - _, ret := assertParserSuccess(t, data, args...) - return ret -} - -func assertError(t *testing.T, err error, typ ErrorType, msg string) { - if err == nil { - assertFatalf(t, "Expected error: %s", msg) - return - } - - if e, ok := err.(*Error); !ok { - assertFatalf(t, "Expected Error type, but got %#v", err) - } else { - if e.Type != typ { - assertErrorf(t, "Expected error type {%s}, but got {%s}", typ, e.Type) - } - - if e.Message != msg { - assertErrorf(t, "Expected error message %#v, but got %#v", msg, e.Message) - } - } -} - -func assertParseFail(t *testing.T, typ ErrorType, msg string, data interface{}, args ...string) []string { - parser := NewParser(data, Default&^PrintErrors) - ret, err := parser.ParseArgs(args) - - assertError(t, err, typ, msg) - return ret -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/check_crosscompile.sh b/Godeps/_workspace/src/github.com/jessevdk/go-flags/check_crosscompile.sh deleted file mode 100644 index c494f61..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/check_crosscompile.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -set -e - -echo '# linux arm7' -GOARM=7 GOARCH=arm GOOS=linux go build -echo '# linux arm5' -GOARM=5 GOARCH=arm GOOS=linux go build -echo '# windows 386' -GOARCH=386 GOOS=windows go build -echo '# windows amd64' -GOARCH=amd64 GOOS=windows go build -echo '# darwin' -GOARCH=amd64 GOOS=darwin go build -echo '# freebsd' -GOARCH=amd64 GOOS=freebsd go build diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/closest.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/closest.go deleted file mode 100644 index 14f58d5..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/closest.go +++ /dev/null @@ -1,61 +0,0 @@ -package flags - -func levenshtein(s string, t string) int { - if len(s) == 0 { - return len(t) - } - - if len(t) == 0 { - return len(s) - } - - var l1, l2, l3 int - - if len(s) == 1 { - l1 = len(t) + 1 - } else { - l1 = levenshtein(s[1:len(s)-1], t) + 1 - } - - if len(t) == 1 { - l2 = len(s) + 1 - } else { - l2 = levenshtein(t[1:len(t)-1], s) + 1 - } - - l3 = levenshtein(s[1:len(s)], t[1:len(t)]) - - if s[0] != t[0] { - l3++ - } - - if l2 < l1 { - l1 = l2 - } - - if l1 < l3 { - return l1 - } - - return l3 -} - -func closestChoice(cmd string, choices []string) (string, int) { - if len(choices) == 0 { - return "", 0 - } - - mincmd := -1 - mindist := -1 - - for i, c := range choices { - l := levenshtein(cmd, c) - - if mincmd < 0 || l < mindist { - mindist = l - mincmd = i - } - } - - return choices[mincmd], mindist -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/command.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/command.go deleted file mode 100644 index 13332ae..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/command.go +++ /dev/null @@ -1,106 +0,0 @@ -package flags - -// Command represents an application command. Commands can be added to the -// parser (which itself is a command) and are selected/executed when its name -// is specified on the command line. The Command type embeds a Group and -// therefore also carries a set of command specific options. -type Command struct { - // Embedded, see Group for more information - *Group - - // The name by which the command can be invoked - Name string - - // The active sub command (set by parsing) or nil - Active *Command - - // Whether subcommands are optional - SubcommandsOptional bool - - // Aliases for the command - Aliases []string - - // Whether positional arguments are required - ArgsRequired bool - - commands []*Command - hasBuiltinHelpGroup bool - args []*Arg -} - -// Commander is an interface which can be implemented by any command added in -// the options. When implemented, the Execute method will be called for the last -// specified (sub)command providing the remaining command line arguments. -type Commander interface { - // Execute will be called for the last active (sub)command. The - // args argument contains the remaining command line arguments. The - // error that Execute returns will be eventually passed out of the - // Parse method of the Parser. - Execute(args []string) error -} - -// Usage is an interface which can be implemented to show a custom usage string -// in the help message shown for a command. -type Usage interface { - // Usage is called for commands to allow customized printing of command - // usage in the generated help message. - Usage() string -} - -// AddCommand adds a new command to the parser with the given name and data. The -// data needs to be a pointer to a struct from which the fields indicate which -// options are in the command. The provided data can implement the Command and -// Usage interfaces. -func (c *Command) AddCommand(command string, shortDescription string, longDescription string, data interface{}) (*Command, error) { - cmd := newCommand(command, shortDescription, longDescription, data) - - cmd.parent = c - - if err := cmd.scan(); err != nil { - return nil, err - } - - c.commands = append(c.commands, cmd) - return cmd, nil -} - -// AddGroup adds a new group to the command with the given name and data. The -// data needs to be a pointer to a struct from which the fields indicate which -// options are in the group. -func (c *Command) AddGroup(shortDescription string, longDescription string, data interface{}) (*Group, error) { - group := newGroup(shortDescription, longDescription, data) - - group.parent = c - - if err := group.scanType(c.scanSubcommandHandler(group)); err != nil { - return nil, err - } - - c.groups = append(c.groups, group) - return group, nil -} - -// Commands returns a list of subcommands of this command. -func (c *Command) Commands() []*Command { - return c.commands -} - -// Find locates the subcommand with the given name and returns it. If no such -// command can be found Find will return nil. -func (c *Command) Find(name string) *Command { - for _, cc := range c.commands { - if cc.match(name) { - return cc - } - } - - return nil -} - -// Args returns a list of positional arguments associated with this command. -func (c *Command) Args() []*Arg { - ret := make([]*Arg, len(c.args)) - copy(ret, c.args) - - return ret -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/command_private.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/command_private.go deleted file mode 100644 index 1727a30..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/command_private.go +++ /dev/null @@ -1,250 +0,0 @@ -package flags - -import ( - "reflect" - "sort" - "strings" - "unsafe" -) - -type lookup struct { - shortNames map[string]*Option - longNames map[string]*Option - - commands map[string]*Command -} - -func newCommand(name string, shortDescription string, longDescription string, data interface{}) *Command { - return &Command{ - Group: newGroup(shortDescription, longDescription, data), - Name: name, - } -} - -func (c *Command) scanSubcommandHandler(parentg *Group) scanHandler { - f := func(realval reflect.Value, sfield *reflect.StructField) (bool, error) { - mtag := newMultiTag(string(sfield.Tag)) - - if err := mtag.Parse(); err != nil { - return true, err - } - - positional := mtag.Get("positional-args") - - if len(positional) != 0 { - stype := realval.Type() - - for i := 0; i < stype.NumField(); i++ { - field := stype.Field(i) - - m := newMultiTag((string(field.Tag))) - - if err := m.Parse(); err != nil { - return true, err - } - - name := m.Get("name") - - if len(name) == 0 { - name = field.Name - } - - arg := &Arg{ - Name: name, - Description: m.Get("description"), - - value: realval.Field(i), - tag: m, - } - - c.args = append(c.args, arg) - - if len(mtag.Get("required")) != 0 { - c.ArgsRequired = true - } - } - - return true, nil - } - - subcommand := mtag.Get("command") - - if len(subcommand) != 0 { - ptrval := reflect.NewAt(realval.Type(), unsafe.Pointer(realval.UnsafeAddr())) - - shortDescription := mtag.Get("description") - longDescription := mtag.Get("long-description") - subcommandsOptional := mtag.Get("subcommands-optional") - aliases := mtag.GetMany("alias") - - subc, err := c.AddCommand(subcommand, shortDescription, longDescription, ptrval.Interface()) - - if err != nil { - return true, err - } - - if len(subcommandsOptional) > 0 { - subc.SubcommandsOptional = true - } - - if len(aliases) > 0 { - subc.Aliases = aliases - } - - return true, nil - } - - return parentg.scanSubGroupHandler(realval, sfield) - } - - return f -} - -func (c *Command) scan() error { - return c.scanType(c.scanSubcommandHandler(c.Group)) -} - -func (c *Command) eachCommand(f func(*Command), recurse bool) { - f(c) - - for _, cc := range c.commands { - if recurse { - cc.eachCommand(f, true) - } else { - f(cc) - } - } -} - -func (c *Command) eachActiveGroup(f func(cc *Command, g *Group)) { - c.eachGroup(func(g *Group) { - f(c, g) - }) - - if c.Active != nil { - c.Active.eachActiveGroup(f) - } -} - -func (c *Command) addHelpGroups(showHelp func() error) { - if !c.hasBuiltinHelpGroup { - c.addHelpGroup(showHelp) - c.hasBuiltinHelpGroup = true - } - - for _, cc := range c.commands { - cc.addHelpGroups(showHelp) - } -} - -func (c *Command) makeLookup() lookup { - ret := lookup{ - shortNames: make(map[string]*Option), - longNames: make(map[string]*Option), - commands: make(map[string]*Command), - } - - c.eachGroup(func(g *Group) { - for _, option := range g.options { - if option.ShortName != 0 { - ret.shortNames[string(option.ShortName)] = option - } - - if len(option.LongName) > 0 { - ret.longNames[option.LongNameWithNamespace()] = option - } - } - }) - - for _, subcommand := range c.commands { - ret.commands[subcommand.Name] = subcommand - - for _, a := range subcommand.Aliases { - ret.commands[a] = subcommand - } - } - - return ret -} - -func (c *Command) groupByName(name string) *Group { - if grp := c.Group.groupByName(name); grp != nil { - return grp - } - - for _, subc := range c.commands { - prefix := subc.Name + "." - - if strings.HasPrefix(name, prefix) { - if grp := subc.groupByName(name[len(prefix):]); grp != nil { - return grp - } - } else if name == subc.Name { - return subc.Group - } - } - - return nil -} - -type commandList []*Command - -func (c commandList) Less(i, j int) bool { - return c[i].Name < c[j].Name -} - -func (c commandList) Len() int { - return len(c) -} - -func (c commandList) Swap(i, j int) { - c[i], c[j] = c[j], c[i] -} - -func (c *Command) sortedCommands() []*Command { - ret := make(commandList, len(c.commands)) - copy(ret, c.commands) - - sort.Sort(ret) - return []*Command(ret) -} - -func (c *Command) match(name string) bool { - if c.Name == name { - return true - } - - for _, v := range c.Aliases { - if v == name { - return true - } - } - - return false -} - -func (c *Command) hasCliOptions() bool { - ret := false - - c.eachGroup(func(g *Group) { - if g.isBuiltinHelp { - return - } - - for _, opt := range g.options { - if opt.canCli() { - ret = true - } - } - }) - - return ret -} - -func (c *Command) fillParseState(s *parseState) { - s.positional = make([]*Arg, len(c.args)) - copy(s.positional, c.args) - - s.lookup = c.makeLookup() - s.command = c -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/command_test.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/command_test.go deleted file mode 100644 index 8507782..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/command_test.go +++ /dev/null @@ -1,337 +0,0 @@ -package flags - -import ( - "fmt" - "testing" -) - -func TestCommandInline(t *testing.T) { - var opts = struct { - Value bool `short:"v"` - - Command struct { - G bool `short:"g"` - } `command:"cmd"` - }{} - - p, ret := assertParserSuccess(t, &opts, "-v", "cmd", "-g") - - assertStringArray(t, ret, []string{}) - - if p.Active == nil { - t.Errorf("Expected active command") - } - - if !opts.Value { - t.Errorf("Expected Value to be true") - } - - if !opts.Command.G { - t.Errorf("Expected Command.G to be true") - } - - if p.Command.Find("cmd") != p.Active { - t.Errorf("Expected to find command `cmd' to be active") - } -} - -func TestCommandInlineMulti(t *testing.T) { - var opts = struct { - Value bool `short:"v"` - - C1 struct { - } `command:"c1"` - - C2 struct { - G bool `short:"g"` - } `command:"c2"` - }{} - - p, ret := assertParserSuccess(t, &opts, "-v", "c2", "-g") - - assertStringArray(t, ret, []string{}) - - if p.Active == nil { - t.Errorf("Expected active command") - } - - if !opts.Value { - t.Errorf("Expected Value to be true") - } - - if !opts.C2.G { - t.Errorf("Expected C2.G to be true") - } - - if p.Command.Find("c1") == nil { - t.Errorf("Expected to find command `c1'") - } - - if c2 := p.Command.Find("c2"); c2 == nil { - t.Errorf("Expected to find command `c2'") - } else if c2 != p.Active { - t.Errorf("Expected to find command `c2' to be active") - } -} - -func TestCommandFlagOrder1(t *testing.T) { - var opts = struct { - Value bool `short:"v"` - - Command struct { - G bool `short:"g"` - } `command:"cmd"` - }{} - - assertParseFail(t, ErrUnknownFlag, "unknown flag `g'", &opts, "-v", "-g", "cmd") -} - -func TestCommandFlagOrder2(t *testing.T) { - var opts = struct { - Value bool `short:"v"` - - Command struct { - G bool `short:"g"` - } `command:"cmd"` - }{} - - assertParseFail(t, ErrUnknownFlag, "unknown flag `v'", &opts, "cmd", "-v", "-g") -} - -func TestCommandEstimate(t *testing.T) { - var opts = struct { - Value bool `short:"v"` - - Cmd1 struct { - } `command:"remove"` - - Cmd2 struct { - } `command:"add"` - }{} - - p := NewParser(&opts, None) - _, err := p.ParseArgs([]string{}) - - assertError(t, err, ErrCommandRequired, "Please specify one command of: add or remove") -} - -type testCommand struct { - G bool `short:"g"` - Executed bool - EArgs []string -} - -func (c *testCommand) Execute(args []string) error { - c.Executed = true - c.EArgs = args - - return nil -} - -func TestCommandExecute(t *testing.T) { - var opts = struct { - Value bool `short:"v"` - - Command testCommand `command:"cmd"` - }{} - - assertParseSuccess(t, &opts, "-v", "cmd", "-g", "a", "b") - - if !opts.Value { - t.Errorf("Expected Value to be true") - } - - if !opts.Command.Executed { - t.Errorf("Did not execute command") - } - - if !opts.Command.G { - t.Errorf("Expected Command.C to be true") - } - - assertStringArray(t, opts.Command.EArgs, []string{"a", "b"}) -} - -func TestCommandClosest(t *testing.T) { - var opts = struct { - Value bool `short:"v"` - - Cmd1 struct { - } `command:"remove"` - - Cmd2 struct { - } `command:"add"` - }{} - - args := assertParseFail(t, ErrUnknownCommand, "Unknown command `addd', did you mean `add'?", &opts, "-v", "addd") - - assertStringArray(t, args, []string{"addd"}) -} - -func TestCommandAdd(t *testing.T) { - var opts = struct { - Value bool `short:"v"` - }{} - - var cmd = struct { - G bool `short:"g"` - }{} - - p := NewParser(&opts, Default) - c, err := p.AddCommand("cmd", "", "", &cmd) - - if err != nil { - t.Fatalf("Unexpected error: %v", err) - return - } - - ret, err := p.ParseArgs([]string{"-v", "cmd", "-g", "rest"}) - - if err != nil { - t.Fatalf("Unexpected error: %v", err) - return - } - - assertStringArray(t, ret, []string{"rest"}) - - if !opts.Value { - t.Errorf("Expected Value to be true") - } - - if !cmd.G { - t.Errorf("Expected Command.G to be true") - } - - if p.Command.Find("cmd") != c { - t.Errorf("Expected to find command `cmd'") - } - - if p.Commands()[0] != c { - t.Errorf("Expected command %#v, but got %#v", c, p.Commands()[0]) - } - - if c.Options()[0].ShortName != 'g' { - t.Errorf("Expected short name `g' but got %v", c.Options()[0].ShortName) - } -} - -func TestCommandNestedInline(t *testing.T) { - var opts = struct { - Value bool `short:"v"` - - Command struct { - G bool `short:"g"` - - Nested struct { - N string `long:"n"` - } `command:"nested"` - } `command:"cmd"` - }{} - - p, ret := assertParserSuccess(t, &opts, "-v", "cmd", "-g", "nested", "--n", "n", "rest") - - assertStringArray(t, ret, []string{"rest"}) - - if !opts.Value { - t.Errorf("Expected Value to be true") - } - - if !opts.Command.G { - t.Errorf("Expected Command.G to be true") - } - - assertString(t, opts.Command.Nested.N, "n") - - if c := p.Command.Find("cmd"); c == nil { - t.Errorf("Expected to find command `cmd'") - } else { - if c != p.Active { - t.Errorf("Expected `cmd' to be the active parser command") - } - - if nested := c.Find("nested"); nested == nil { - t.Errorf("Expected to find command `nested'") - } else if nested != c.Active { - t.Errorf("Expected to find command `nested' to be the active `cmd' command") - } - } -} - -func TestRequiredOnCommand(t *testing.T) { - var opts = struct { - Value bool `short:"v" required:"true"` - - Command struct { - G bool `short:"g"` - } `command:"cmd"` - }{} - - assertParseFail(t, ErrRequired, fmt.Sprintf("the required flag `%cv' was not specified", defaultShortOptDelimiter), &opts, "cmd") -} - -func TestRequiredAllOnCommand(t *testing.T) { - var opts = struct { - Value bool `short:"v" required:"true"` - Missing bool `long:"missing" required:"true"` - - Command struct { - G bool `short:"g"` - } `command:"cmd"` - }{} - - assertParseFail(t, ErrRequired, fmt.Sprintf("the required flags `%smissing' and `%cv' were not specified", defaultLongOptDelimiter, defaultShortOptDelimiter), &opts, "cmd") -} - -func TestDefaultOnCommand(t *testing.T) { - var opts = struct { - Command struct { - G bool `short:"g" default:"true"` - } `command:"cmd"` - }{} - - assertParseSuccess(t, &opts, "cmd") - - if !opts.Command.G { - t.Errorf("Expected G to be true") - } -} - -func TestSubcommandsOptional(t *testing.T) { - var opts = struct { - Value bool `short:"v"` - - Cmd1 struct { - } `command:"remove"` - - Cmd2 struct { - } `command:"add"` - }{} - - p := NewParser(&opts, None) - p.SubcommandsOptional = true - - _, err := p.ParseArgs([]string{"-v"}) - - if err != nil { - t.Fatalf("Unexpected error: %v", err) - return - } - - if !opts.Value { - t.Errorf("Expected Value to be true") - } -} - -func TestCommandAlias(t *testing.T) { - var opts = struct { - Command struct { - G bool `short:"g" default:"true"` - } `command:"cmd" alias:"cm"` - }{} - - assertParseSuccess(t, &opts, "cm") - - if !opts.Command.G { - t.Errorf("Expected G to be true") - } -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/completion.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/completion.go deleted file mode 100644 index 2f730d9..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/completion.go +++ /dev/null @@ -1,292 +0,0 @@ -package flags - -import ( - "fmt" - "path/filepath" - "reflect" - "sort" - "strings" - "unicode/utf8" -) - -// Completion is a type containing information of a completion. -type Completion struct { - // The completed item - Item string - - // A description of the completed item (optional) - Description string -} - -type completions []Completion - -func (c completions) Len() int { - return len(c) -} - -func (c completions) Less(i, j int) bool { - return c[i].Item < c[j].Item -} - -func (c completions) Swap(i, j int) { - c[i], c[j] = c[j], c[i] -} - -// Completer is an interface which can be implemented by types -// to provide custom command line argument completion. -type Completer interface { - // Complete receives a prefix representing a (partial) value - // for its type and should provide a list of possible valid - // completions. - Complete(match string) []Completion -} - -type completion struct { - parser *Parser - - ShowDescriptions bool `short:"d" long:"show-descriptions" description:"Show descriptions next to completion items"` -} - -// Filename is a string alias which provides filename completion. -type Filename string - -func completionsWithoutDescriptions(items []string) []Completion { - ret := make([]Completion, len(items)) - - for i, v := range items { - ret[i].Item = v - } - - return ret -} - -// Complete returns a list of existing files with the given -// prefix. -func (f *Filename) Complete(match string) []Completion { - ret, _ := filepath.Glob(match + "*") - return completionsWithoutDescriptions(ret) -} - -func (c *completion) skipPositional(s *parseState, n int) { - if n >= len(s.positional) { - s.positional = nil - } else { - s.positional = s.positional[n:] - } -} - -func (c *completion) completeOptionNames(names map[string]*Option, prefix string, match string) []Completion { - n := make([]Completion, 0, len(names)) - - for k, opt := range names { - if strings.HasPrefix(k, match) { - n = append(n, Completion{ - Item: prefix + k, - Description: opt.Description, - }) - } - } - - return n -} - -func (c *completion) completeLongNames(s *parseState, prefix string, match string) []Completion { - return c.completeOptionNames(s.lookup.longNames, prefix, match) -} - -func (c *completion) completeShortNames(s *parseState, prefix string, match string) []Completion { - if len(match) != 0 { - return []Completion{ - Completion{ - Item: prefix + match, - }, - } - } - - return c.completeOptionNames(s.lookup.shortNames, prefix, match) -} - -func (c *completion) completeCommands(s *parseState, match string) []Completion { - n := make([]Completion, 0, len(s.command.commands)) - - for _, cmd := range s.command.commands { - if cmd.data != c && strings.HasPrefix(cmd.Name, match) { - n = append(n, Completion{ - Item: cmd.Name, - Description: cmd.ShortDescription, - }) - } - } - - return n -} - -func (c *completion) completeValue(value reflect.Value, prefix string, match string) []Completion { - i := value.Interface() - - var ret []Completion - - if cmp, ok := i.(Completer); ok { - ret = cmp.Complete(match) - } else if value.CanAddr() { - if cmp, ok = value.Addr().Interface().(Completer); ok { - ret = cmp.Complete(match) - } - } - - for i, v := range ret { - ret[i].Item = prefix + v.Item - } - - return ret -} - -func (c *completion) complete(args []string) []Completion { - if len(args) == 0 { - args = []string{""} - } - - s := &parseState{ - args: args, - } - - c.parser.fillParseState(s) - - var opt *Option - - for len(s.args) > 1 { - arg := s.pop() - - if (c.parser.Options&PassDoubleDash) != None && arg == "--" { - opt = nil - c.skipPositional(s, len(s.args)-1) - - break - } - - if argumentIsOption(arg) { - prefix, optname, islong := stripOptionPrefix(arg) - optname, _, argument := splitOption(prefix, optname, islong) - - if argument == nil { - var o *Option - canarg := true - - if islong { - o = s.lookup.longNames[optname] - } else { - for i, r := range optname { - sname := string(r) - o = s.lookup.shortNames[sname] - - if o == nil { - break - } - - if i == 0 && o.canArgument() && len(optname) != len(sname) { - canarg = false - break - } - } - } - - if o == nil && (c.parser.Options&PassAfterNonOption) != None { - opt = nil - c.skipPositional(s, len(s.args)-1) - - break - } else if o != nil && o.canArgument() && !o.OptionalArgument && canarg { - if len(s.args) > 1 { - s.pop() - } else { - opt = o - } - } - } - } else { - if len(s.positional) > 0 { - s.positional = s.positional[1:] - } else if cmd, ok := s.lookup.commands[arg]; ok { - cmd.fillParseState(s) - } - - opt = nil - } - } - - lastarg := s.args[len(s.args)-1] - var ret []Completion - - if opt != nil { - // Completion for the argument of 'opt' - ret = c.completeValue(opt.value, "", lastarg) - } else if argumentIsOption(lastarg) { - // Complete the option - prefix, optname, islong := stripOptionPrefix(lastarg) - optname, split, argument := splitOption(prefix, optname, islong) - - if argument == nil && !islong { - rname, n := utf8.DecodeRuneInString(optname) - sname := string(rname) - - if opt := s.lookup.shortNames[sname]; opt != nil && opt.canArgument() { - ret = c.completeValue(opt.value, prefix+sname, optname[n:]) - } else { - ret = c.completeShortNames(s, prefix, optname) - } - } else if argument != nil { - if islong { - opt = s.lookup.longNames[optname] - } else { - opt = s.lookup.shortNames[optname] - } - - if opt != nil { - ret = c.completeValue(opt.value, prefix+optname+split, *argument) - } - } else if islong { - ret = c.completeLongNames(s, prefix, optname) - } else { - ret = c.completeShortNames(s, prefix, optname) - } - } else if len(s.positional) > 0 { - // Complete for positional argument - ret = c.completeValue(s.positional[0].value, "", lastarg) - } else if len(s.command.commands) > 0 { - // Complete for command - ret = c.completeCommands(s, lastarg) - } - - sort.Sort(completions(ret)) - return ret -} - -func (c *completion) Execute(args []string) error { - ret := c.complete(args) - - if c.ShowDescriptions && len(ret) > 1 { - maxl := 0 - - for _, v := range ret { - if len(v.Item) > maxl { - maxl = len(v.Item) - } - } - - for _, v := range ret { - fmt.Printf("%s", v.Item) - - if len(v.Description) > 0 { - fmt.Printf("%s # %s", strings.Repeat(" ", maxl-len(v.Item)), v.Description) - } - - fmt.Printf("\n") - } - } else { - for _, v := range ret { - fmt.Println(v.Item) - } - } - - return nil -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/completion_test.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/completion_test.go deleted file mode 100644 index f51949e..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/completion_test.go +++ /dev/null @@ -1,166 +0,0 @@ -package flags - -import ( - "path" - "path/filepath" - "reflect" - "runtime" - "strings" - "testing" -) - -type TestComplete struct { -} - -func (t *TestComplete) Complete(match string) []Completion { - options := []string{ - "hello world", - "hello universe", - "hello multiverse", - } - - ret := make([]Completion, 0, len(options)) - - for _, o := range options { - if strings.HasPrefix(o, match) { - ret = append(ret, Completion{ - Item: o, - }) - } - } - - return ret -} - -var completionTestOptions struct { - Verbose bool `short:"v" long:"verbose"` - Debug bool `short:"d" long:"debug"` - Version bool `long:"version"` - - AddCommand struct { - Positional struct { - Filename Filename - } `positional-args:"yes"` - } `command:"add"` - - RemoveCommand struct { - Other bool `short:"o"` - File Filename `short:"f" long:"filename"` - } `command:"rm"` - - RenameCommand struct { - Completed TestComplete `short:"c" long:"completed"` - } `command:"rename"` -} - -func TestCompletion(t *testing.T) { - _, sourcefile, _, _ := runtime.Caller(0) - sourcedir := filepath.Join(filepath.SplitList(path.Dir(sourcefile))...) - - excompl := []string{filepath.Join(sourcedir, "completion.go"), filepath.Join(sourcedir, "completion_test.go")} - - tests := []struct { - Args []string - Completed []string - }{ - { - // Short names - []string{"-"}, - []string{"-d", "-v"}, - }, - - { - // Short names concatenated - []string{"-dv"}, - []string{"-dv"}, - }, - - { - // Long names - []string{"--"}, - []string{"--debug", "--verbose", "--version"}, - }, - - { - // Long names partial - []string{"--ver"}, - []string{"--verbose", "--version"}, - }, - - { - // Commands - []string{""}, - []string{"add", "rename", "rm"}, - }, - - { - // Commands partial - []string{"r"}, - []string{"rename", "rm"}, - }, - - { - // Positional filename - []string{"add", filepath.Join(sourcedir, "completion")}, - excompl, - }, - - { - // Flag filename - []string{"rm", "-f", path.Join(sourcedir, "completion")}, - excompl, - }, - - { - // Flag short concat last filename - []string{"rm", "-of", path.Join(sourcedir, "completion")}, - excompl, - }, - - { - // Flag concat filename - []string{"rm", "-f" + path.Join(sourcedir, "completion")}, - []string{"-f" + excompl[0], "-f" + excompl[1]}, - }, - - { - // Flag equal concat filename - []string{"rm", "-f=" + path.Join(sourcedir, "completion")}, - []string{"-f=" + excompl[0], "-f=" + excompl[1]}, - }, - - { - // Flag concat long filename - []string{"rm", "--filename=" + path.Join(sourcedir, "completion")}, - []string{"--filename=" + excompl[0], "--filename=" + excompl[1]}, - }, - - { - // Flag long filename - []string{"rm", "--filename", path.Join(sourcedir, "completion")}, - excompl, - }, - - { - // Custom completed - []string{"rename", "-c", "hello un"}, - []string{"hello universe"}, - }, - } - - p := NewParser(&completionTestOptions, Default) - c := &completion{parser: p} - - for _, test := range tests { - ret := c.complete(test.Args) - items := make([]string, len(ret)) - - for i, v := range ret { - items[i] = v.Item - } - - if !reflect.DeepEqual(items, test.Completed) { - t.Errorf("Args: %#v\n Expected: %#v\n Got: %#v", test.Args, test.Completed, items) - } - } -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/convert.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/convert.go deleted file mode 100644 index be8de39..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/convert.go +++ /dev/null @@ -1,331 +0,0 @@ -// Copyright 2012 Jesse van den Kieboom. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package flags - -import ( - "fmt" - "reflect" - "strconv" - "strings" - "time" -) - -// Marshaler is the interface implemented by types that can marshal themselves -// to a string representation of the flag. -type Marshaler interface { - // MarshalFlag marshals a flag value to its string representation. - MarshalFlag() (string, error) -} - -// Unmarshaler is the interface implemented by types that can unmarshal a flag -// argument to themselves. The provided value is directly passed from the -// command line. -type Unmarshaler interface { - // UnmarshalFlag unmarshals a string value representation to the flag - // value (which therefore needs to be a pointer receiver). - UnmarshalFlag(value string) error -} - -func getBase(options multiTag, base int) (int, error) { - sbase := options.Get("base") - - var err error - var ivbase int64 - - if sbase != "" { - ivbase, err = strconv.ParseInt(sbase, 10, 32) - base = int(ivbase) - } - - return base, err -} - -func convertMarshal(val reflect.Value) (bool, string, error) { - // Check first for the Marshaler interface - if val.Type().NumMethod() > 0 && val.CanInterface() { - if marshaler, ok := val.Interface().(Marshaler); ok { - ret, err := marshaler.MarshalFlag() - return true, ret, err - } - } - - return false, "", nil -} - -func convertToString(val reflect.Value, options multiTag) (string, error) { - if ok, ret, err := convertMarshal(val); ok { - return ret, err - } - - tp := val.Type() - - // Support for time.Duration - if tp == reflect.TypeOf((*time.Duration)(nil)).Elem() { - stringer := val.Interface().(fmt.Stringer) - return stringer.String(), nil - } - - switch tp.Kind() { - case reflect.String: - return val.String(), nil - case reflect.Bool: - if val.Bool() { - return "true", nil - } - - return "false", nil - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - base, err := getBase(options, 10) - - if err != nil { - return "", err - } - - return strconv.FormatInt(val.Int(), base), nil - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - base, err := getBase(options, 10) - - if err != nil { - return "", err - } - - return strconv.FormatUint(val.Uint(), base), nil - case reflect.Float32, reflect.Float64: - return strconv.FormatFloat(val.Float(), 'g', -1, tp.Bits()), nil - case reflect.Slice: - if val.Len() == 0 { - return "", nil - } - - ret := "[" - - for i := 0; i < val.Len(); i++ { - if i != 0 { - ret += ", " - } - - item, err := convertToString(val.Index(i), options) - - if err != nil { - return "", err - } - - ret += item - } - - return ret + "]", nil - case reflect.Map: - ret := "{" - - for i, key := range val.MapKeys() { - if i != 0 { - ret += ", " - } - - keyitem, err := convertToString(key, options) - - if err != nil { - return "", err - } - - item, err := convertToString(val.MapIndex(key), options) - - if err != nil { - return "", err - } - - ret += keyitem + ":" + item - } - - return ret + "}", nil - case reflect.Ptr: - return convertToString(reflect.Indirect(val), options) - case reflect.Interface: - if !val.IsNil() { - return convertToString(val.Elem(), options) - } - } - - return "", nil -} - -func convertUnmarshal(val string, retval reflect.Value) (bool, error) { - if retval.Type().NumMethod() > 0 && retval.CanInterface() { - if unmarshaler, ok := retval.Interface().(Unmarshaler); ok { - return true, unmarshaler.UnmarshalFlag(val) - } - } - - if retval.Type().Kind() != reflect.Ptr && retval.CanAddr() { - return convertUnmarshal(val, retval.Addr()) - } - - if retval.Type().Kind() == reflect.Interface && !retval.IsNil() { - return convertUnmarshal(val, retval.Elem()) - } - - return false, nil -} - -func convert(val string, retval reflect.Value, options multiTag) error { - if ok, err := convertUnmarshal(val, retval); ok { - return err - } - - tp := retval.Type() - - // Support for time.Duration - if tp == reflect.TypeOf((*time.Duration)(nil)).Elem() { - parsed, err := time.ParseDuration(val) - - if err != nil { - return err - } - - retval.SetInt(int64(parsed)) - return nil - } - - switch tp.Kind() { - case reflect.String: - retval.SetString(val) - case reflect.Bool: - if val == "" { - retval.SetBool(true) - } else { - b, err := strconv.ParseBool(val) - - if err != nil { - return err - } - - retval.SetBool(b) - } - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - base, err := getBase(options, 10) - - if err != nil { - return err - } - - parsed, err := strconv.ParseInt(val, base, tp.Bits()) - - if err != nil { - return err - } - - retval.SetInt(parsed) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - base, err := getBase(options, 10) - - if err != nil { - return err - } - - parsed, err := strconv.ParseUint(val, base, tp.Bits()) - - if err != nil { - return err - } - - retval.SetUint(parsed) - case reflect.Float32, reflect.Float64: - parsed, err := strconv.ParseFloat(val, tp.Bits()) - - if err != nil { - return err - } - - retval.SetFloat(parsed) - case reflect.Slice: - elemtp := tp.Elem() - - elemvalptr := reflect.New(elemtp) - elemval := reflect.Indirect(elemvalptr) - - if err := convert(val, elemval, options); err != nil { - return err - } - - retval.Set(reflect.Append(retval, elemval)) - case reflect.Map: - parts := strings.SplitN(val, ":", 2) - - key := parts[0] - var value string - - if len(parts) == 2 { - value = parts[1] - } - - keytp := tp.Key() - keyval := reflect.New(keytp) - - if err := convert(key, keyval, options); err != nil { - return err - } - - valuetp := tp.Elem() - valueval := reflect.New(valuetp) - - if err := convert(value, valueval, options); err != nil { - return err - } - - if retval.IsNil() { - retval.Set(reflect.MakeMap(tp)) - } - - retval.SetMapIndex(reflect.Indirect(keyval), reflect.Indirect(valueval)) - case reflect.Ptr: - if retval.IsNil() { - retval.Set(reflect.New(retval.Type().Elem())) - } - - return convert(val, reflect.Indirect(retval), options) - case reflect.Interface: - if !retval.IsNil() { - return convert(val, retval.Elem(), options) - } - } - - return nil -} - -func wrapText(s string, l int, prefix string) string { - // Basic text wrapping of s at spaces to fit in l - var ret string - - s = strings.TrimSpace(s) - - for len(s) > l { - // Try to split on space - suffix := "" - - pos := strings.LastIndex(s[:l], " ") - - if pos < 0 { - pos = l - 1 - suffix = "-\n" - } - - if len(ret) != 0 { - ret += "\n" + prefix - } - - ret += strings.TrimSpace(s[:pos]) + suffix - s = strings.TrimSpace(s[pos:]) - } - - if len(s) > 0 { - if len(ret) != 0 { - ret += "\n" + prefix - } - - return ret + s - } - - return ret -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/convert_test.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/convert_test.go deleted file mode 100644 index 9ee8ebb..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/convert_test.go +++ /dev/null @@ -1,183 +0,0 @@ -package flags - -import ( - "testing" - "time" -) - -func expectConvert(t *testing.T, o *Option, expected string) { - s, err := convertToString(o.value, o.tag) - - if err != nil { - t.Errorf("Unexpected error: %v", err) - return - } - - assertString(t, s, expected) -} - -func TestConvertToString(t *testing.T) { - d, _ := time.ParseDuration("1h2m4s") - - var opts = struct { - String string `long:"string"` - - Int int `long:"int"` - Int8 int8 `long:"int8"` - Int16 int16 `long:"int16"` - Int32 int32 `long:"int32"` - Int64 int64 `long:"int64"` - - Uint uint `long:"uint"` - Uint8 uint8 `long:"uint8"` - Uint16 uint16 `long:"uint16"` - Uint32 uint32 `long:"uint32"` - Uint64 uint64 `long:"uint64"` - - Float32 float32 `long:"float32"` - Float64 float64 `long:"float64"` - - Duration time.Duration `long:"duration"` - - Bool bool `long:"bool"` - - IntSlice []int `long:"int-slice"` - IntFloatMap map[int]float64 `long:"int-float-map"` - - PtrBool *bool `long:"ptr-bool"` - Interface interface{} `long:"interface"` - - Int32Base int32 `long:"int32-base" base:"16"` - Uint32Base uint32 `long:"uint32-base" base:"16"` - }{ - "string", - - -2, - -1, - 0, - 1, - 2, - - 1, - 2, - 3, - 4, - 5, - - 1.2, - -3.4, - - d, - true, - - []int{-3, 4, -2}, - map[int]float64{-2: 4.5}, - - new(bool), - float32(5.2), - - -5823, - 4232, - } - - p := NewNamedParser("test", Default) - grp, _ := p.AddGroup("test group", "", &opts) - - expects := []string{ - "string", - "-2", - "-1", - "0", - "1", - "2", - - "1", - "2", - "3", - "4", - "5", - - "1.2", - "-3.4", - - "1h2m4s", - "true", - - "[-3, 4, -2]", - "{-2:4.5}", - - "false", - "5.2", - - "-16bf", - "1088", - } - - for i, v := range grp.Options() { - expectConvert(t, v, expects[i]) - } -} - -func TestConvertToStringInvalidIntBase(t *testing.T) { - var opts = struct { - Int int `long:"int" base:"no"` - }{ - 2, - } - - p := NewNamedParser("test", Default) - grp, _ := p.AddGroup("test group", "", &opts) - o := grp.Options()[0] - - _, err := convertToString(o.value, o.tag) - - if err != nil { - err = newErrorf(ErrMarshal, "%v", err) - } - - assertError(t, err, ErrMarshal, "strconv.ParseInt: parsing \"no\": invalid syntax") -} - -func TestConvertToStringInvalidUintBase(t *testing.T) { - var opts = struct { - Uint uint `long:"uint" base:"no"` - }{ - 2, - } - - p := NewNamedParser("test", Default) - grp, _ := p.AddGroup("test group", "", &opts) - o := grp.Options()[0] - - _, err := convertToString(o.value, o.tag) - - if err != nil { - err = newErrorf(ErrMarshal, "%v", err) - } - - assertError(t, err, ErrMarshal, "strconv.ParseInt: parsing \"no\": invalid syntax") -} - -func TestWrapText(t *testing.T) { - s := "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." - - got := wrapText(s, 60, " ") - expected := `Lorem ipsum dolor sit amet, consectetur adipisicing elit, - sed do eiusmod tempor incididunt ut labore et dolore magna - aliqua. Ut enim ad minim veniam, quis nostrud exercitation - ullamco laboris nisi ut aliquip ex ea commodo consequat. - Duis aute irure dolor in reprehenderit in voluptate velit - esse cillum dolore eu fugiat nulla pariatur. Excepteur sint - occaecat cupidatat non proident, sunt in culpa qui officia - deserunt mollit anim id est laborum.` - - if got != expected { - ret, err := helpDiff(got, expected) - - if err != nil { - t.Errorf("Unexpected wrapped text, expected:\n\n%s\n\nbut got\n\n%s", expected, got) - } else { - t.Errorf("Unexpected wrapped text:\n\n%s", ret) - } - } -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/error.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/error.go deleted file mode 100644 index 3a67693..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/error.go +++ /dev/null @@ -1,95 +0,0 @@ -package flags - -import ( - "fmt" - "reflect" -) - -// ErrorType represents the type of error. -type ErrorType uint - -const ( - // ErrUnknown indicates a generic error. - ErrUnknown ErrorType = iota - - // ErrExpectedArgument indicates that an argument was expected. - ErrExpectedArgument - - // ErrUnknownFlag indicates an unknown flag. - ErrUnknownFlag - - // ErrUnknownGroup indicates an unknown group. - ErrUnknownGroup - - // ErrMarshal indicates a marshalling error while converting values. - ErrMarshal - - // ErrHelp indicates that the built-in help was shown (the error - // contains the help message). - ErrHelp - - // ErrNoArgumentForBool indicates that an argument was given for a - // boolean flag (which don't not take any arguments). - ErrNoArgumentForBool - - // ErrRequired indicates that a required flag was not provided. - ErrRequired - - // ErrShortNameTooLong indicates that a short flag name was specified, - // longer than one character. - ErrShortNameTooLong - - // ErrDuplicatedFlag indicates that a short or long flag has been - // defined more than once - ErrDuplicatedFlag - - // ErrTag indicates an error while parsing flag tags. - ErrTag - - // ErrCommandRequired indicates that a command was required but not - // specified - ErrCommandRequired - - // ErrUnknownCommand indicates that an unknown command was specified. - ErrUnknownCommand -) - -func (e ErrorType) String() string { - return reflect.TypeOf(e).Name() -} - -// Error represents a parser error. The error returned from Parse is of this -// type. The error contains both a Type and Message. -type Error struct { - // The type of error - Type ErrorType - - // The error message - Message string -} - -// Error returns the error's message -func (e *Error) Error() string { - return e.Message -} - -func newError(tp ErrorType, message string) *Error { - return &Error{ - Type: tp, - Message: message, - } -} - -func newErrorf(tp ErrorType, format string, args ...interface{}) *Error { - return newError(tp, fmt.Sprintf(format, args...)) -} - -func wrapError(err error) *Error { - ret, ok := err.(*Error) - - if !ok { - return newError(ErrUnknown, err.Error()) - } - - return ret -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/example_test.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/example_test.go deleted file mode 100644 index f7be2bb..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/example_test.go +++ /dev/null @@ -1,110 +0,0 @@ -// Example of use of the flags package. -package flags - -import ( - "fmt" - "os/exec" -) - -func Example() { - var opts struct { - // Slice of bool will append 'true' each time the option - // is encountered (can be set multiple times, like -vvv) - Verbose []bool `short:"v" long:"verbose" description:"Show verbose debug information"` - - // Example of automatic marshalling to desired type (uint) - Offset uint `long:"offset" description:"Offset"` - - // Example of a callback, called each time the option is found. - Call func(string) `short:"c" description:"Call phone number"` - - // Example of a required flag - Name string `short:"n" long:"name" description:"A name" required:"true"` - - // Example of a value name - File string `short:"f" long:"file" description:"A file" value-name:"FILE"` - - // Example of a pointer - Ptr *int `short:"p" description:"A pointer to an integer"` - - // Example of a slice of strings - StringSlice []string `short:"s" description:"A slice of strings"` - - // Example of a slice of pointers - PtrSlice []*string `long:"ptrslice" description:"A slice of pointers to string"` - - // Example of a map - IntMap map[string]int `long:"intmap" description:"A map from string to int"` - - // Example of a filename (useful for completion) - Filename Filename `long:"filename" description:"A filename"` - - // Example of positional arguments - Args struct { - Id string - Num int - Rest []string - } `positional-args:"yes" required:"yes"` - } - - // Callback which will invoke callto: to call a number. - // Note that this works just on OS X (and probably only with - // Skype) but it shows the idea. - opts.Call = func(num string) { - cmd := exec.Command("open", "callto:"+num) - cmd.Start() - cmd.Process.Release() - } - - // Make some fake arguments to parse. - args := []string{ - "-vv", - "--offset=5", - "-n", "Me", - "-p", "3", - "-s", "hello", - "-s", "world", - "--ptrslice", "hello", - "--ptrslice", "world", - "--intmap", "a:1", - "--intmap", "b:5", - "--filename", "hello.go", - "id", - "10", - "remaining1", - "remaining2", - } - - // Parse flags from `args'. Note that here we use flags.ParseArgs for - // the sake of making a working example. Normally, you would simply use - // flags.Parse(&opts) which uses os.Args - _, err := ParseArgs(&opts, args) - - if err != nil { - panic(err) - } - - fmt.Printf("Verbosity: %v\n", opts.Verbose) - fmt.Printf("Offset: %d\n", opts.Offset) - fmt.Printf("Name: %s\n", opts.Name) - fmt.Printf("Ptr: %d\n", *opts.Ptr) - fmt.Printf("StringSlice: %v\n", opts.StringSlice) - fmt.Printf("PtrSlice: [%v %v]\n", *opts.PtrSlice[0], *opts.PtrSlice[1]) - fmt.Printf("IntMap: [a:%v b:%v]\n", opts.IntMap["a"], opts.IntMap["b"]) - fmt.Printf("Filename: %v\n", opts.Filename) - fmt.Printf("Args.Id: %s\n", opts.Args.Id) - fmt.Printf("Args.Num: %d\n", opts.Args.Num) - fmt.Printf("Args.Rest: %v\n", opts.Args.Rest) - - // Output: Verbosity: [true true] - // Offset: 5 - // Name: Me - // Ptr: 3 - // StringSlice: [hello world] - // PtrSlice: [hello world] - // IntMap: [a:1 b:5] - // Filename: hello.go - // Args.Id: id - // Args.Num: 10 - // Args.Rest: [remaining1 remaining2] -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/examples/add.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/examples/add.go deleted file mode 100644 index 57d8f23..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/examples/add.go +++ /dev/null @@ -1,23 +0,0 @@ -package main - -import ( - "fmt" -) - -type AddCommand struct { - All bool `short:"a" long:"all" description:"Add all files"` -} - -var addCommand AddCommand - -func (x *AddCommand) Execute(args []string) error { - fmt.Printf("Adding (all=%v): %#v\n", x.All, args) - return nil -} - -func init() { - parser.AddCommand("add", - "Add a file", - "The add command adds a file to the repository. Use -a to add all files.", - &addCommand) -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/examples/bash-completion b/Godeps/_workspace/src/github.com/jessevdk/go-flags/examples/bash-completion deleted file mode 100644 index 070ae40..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/examples/bash-completion +++ /dev/null @@ -1,9 +0,0 @@ -_examples() { - args=("${COMP_WORDS[@]:1:$COMP_CWORD}") - - local IFS=$'\n' - COMPREPLY=($(GO_FLAGS_COMPLETION=1 ${COMP_WORDS[0]} __complete -- "${args[@]}")) - return 1 -} - -complete -F _examples examples diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/examples/main.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/examples/main.go deleted file mode 100644 index 4a22be6..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/examples/main.go +++ /dev/null @@ -1,75 +0,0 @@ -package main - -import ( - "errors" - "fmt" - "github.com/jessevdk/go-flags" - "os" - "strconv" - "strings" -) - -type EditorOptions struct { - Input flags.Filename `short:"i" long:"input" description:"Input file" default:"-"` - Output flags.Filename `short:"o" long:"output" description:"Output file" default:"-"` -} - -type Point struct { - X, Y int -} - -func (p *Point) UnmarshalFlag(value string) error { - parts := strings.Split(value, ",") - - if len(parts) != 2 { - return errors.New("expected two numbers separated by a ,") - } - - x, err := strconv.ParseInt(parts[0], 10, 32) - - if err != nil { - return err - } - - y, err := strconv.ParseInt(parts[1], 10, 32) - - if err != nil { - return err - } - - p.X = int(x) - p.Y = int(y) - - return nil -} - -func (p Point) MarshalFlag() (string, error) { - return fmt.Sprintf("%d,%d", p.X, p.Y), nil -} - -type Options struct { - // Example of verbosity with level - Verbose []bool `short:"v" long:"verbose" description:"Verbose output"` - - // Example of optional value - User string `short:"u" long:"user" description:"User name" optional:"yes" optional-value:"pancake"` - - // Example of map with multiple default values - Users map[string]string `long:"users" description:"User e-mail map" default:"system:system@example.org" default:"admin:admin@example.org"` - - // Example of option group - Editor EditorOptions `group:"Editor Options"` - - // Example of custom type Marshal/Unmarshal - Point Point `long:"point" description:"A x,y point" default:"1,2"` -} - -var options Options - -var parser = flags.NewParser(&options, flags.Default) - -func main() { - if _, err := parser.Parse(); err != nil { - os.Exit(1) - } -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/examples/rm.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/examples/rm.go deleted file mode 100644 index c9c1dd0..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/examples/rm.go +++ /dev/null @@ -1,23 +0,0 @@ -package main - -import ( - "fmt" -) - -type RmCommand struct { - Force bool `short:"f" long:"force" description:"Force removal of files"` -} - -var rmCommand RmCommand - -func (x *RmCommand) Execute(args []string) error { - fmt.Printf("Removing (force=%v): %#v\n", x.Force, args) - return nil -} - -func init() { - parser.AddCommand("rm", - "Remove a file", - "The rm command removes a file to the repository. Use -f to force removal of files.", - &rmCommand) -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/flags.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/flags.go deleted file mode 100644 index 68173e7..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/flags.go +++ /dev/null @@ -1,227 +0,0 @@ -// Copyright 2012 Jesse van den Kieboom. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* -Package flags provides an extensive command line option parser. -The flags package is similar in functionality to the go built-in flag package -but provides more options and uses reflection to provide a convenient and -succinct way of specifying command line options. - - -Supported features - -The following features are supported in go-flags: - - Options with short names (-v) - Options with long names (--verbose) - Options with and without arguments (bool v.s. other type) - Options with optional arguments and default values - Multiple option groups each containing a set of options - Generate and print well-formatted help message - Passing remaining command line arguments after -- (optional) - Ignoring unknown command line options (optional) - Supports -I/usr/include -I=/usr/include -I /usr/include option argument specification - Supports multiple short options -aux - Supports all primitive go types (string, int{8..64}, uint{8..64}, float) - Supports same option multiple times (can store in slice or last option counts) - Supports maps - Supports function callbacks - Supports namespaces for (nested) option groups - -Additional features specific to Windows: - Options with short names (/v) - Options with long names (/verbose) - Windows-style options with arguments use a colon as the delimiter - Modify generated help message with Windows-style / options - - -Basic usage - -The flags package uses structs, reflection and struct field tags -to allow users to specify command line options. This results in very simple -and concise specification of your application options. For example: - - type Options struct { - Verbose []bool `short:"v" long:"verbose" description:"Show verbose debug information"` - } - -This specifies one option with a short name -v and a long name --verbose. -When either -v or --verbose is found on the command line, a 'true' value -will be appended to the Verbose field. e.g. when specifying -vvv, the -resulting value of Verbose will be {[true, true, true]}. - -Slice options work exactly the same as primitive type options, except that -whenever the option is encountered, a value is appended to the slice. - -Map options from string to primitive type are also supported. On the command -line, you specify the value for such an option as key:value. For example - - type Options struct { - AuthorInfo string[string] `short:"a"` - } - -Then, the AuthorInfo map can be filled with something like --a name:Jesse -a "surname:van den Kieboom". - -Finally, for full control over the conversion between command line argument -values and options, user defined types can choose to implement the Marshaler -and Unmarshaler interfaces. - - -Available field tags - -The following is a list of tags for struct fields supported by go-flags: - - short: the short name of the option (single character) - long: the long name of the option - required: whether an option is required to appear on the command - line. If a required option is not present, the parser will - return ErrRequired (optional) - description: the description of the option (optional) - long-description: the long description of the option. Currently only - displayed in generated man pages (optional) - no-flag: if non-empty this field is ignored as an option (optional) - - optional: whether an argument of the option is optional (optional) - optional-value: the value of an optional option when the option occurs - without an argument. This tag can be specified multiple - times in the case of maps or slices (optional) - default: the default value of an option. This tag can be specified - multiple times in the case of slices or maps (optional) - default-mask: when specified, this value will be displayed in the help - instead of the actual default value. This is useful - mostly for hiding otherwise sensitive information from - showing up in the help. If default-mask takes the special - value "-", then no default value will be shown at all - (optional) - value-name: the name of the argument value (to be shown in the help, - (optional) - - base: a base (radix) used to convert strings to integer values, the - default base is 10 (i.e. decimal) (optional) - - ini-name: the explicit ini option name (optional) - no-ini: if non-empty this field is ignored as an ini option - (optional) - - group: when specified on a struct field, makes the struct - field a separate group with the given name (optional) - namespace: when specified on a group struct field, the namespace - gets prepended to every option's long name and - subgroup's namespace of this group, separated by - the parser's namespace delimiter (optional) - command: when specified on a struct field, makes the struct - field a (sub)command with the given name (optional) - subcommands-optional: when specified on a command struct field, makes - any subcommands of that command optional (optional) - alias: when specified on a command struct field, adds the - specified name as an alias for the command. Can be - be specified multiple times to add more than one - alias (optional) - positional-args: when specified on a field with a struct type, - uses the fields of that struct to parse remaining - positional command line arguments into (in order - of the fields). If a field has a slice type, - then all remaining arguments will be added to it. - Positional arguments are optional by default, - unless the "required" tag is specified together - with the "positional-args" tag (optional) - -Either the `short:` tag or the `long:` must be specified to make the field eligible as an -option. - - -Option groups - -Option groups are a simple way to semantically separate your options. All -options in a particular group are shown together in the help under the name -of the group. Namespaces can be used to specify option long names more -precisely and emphasize the options affiliation to their group. - -There are currently three ways to specify option groups. - - 1. Use NewNamedParser specifying the various option groups. - 2. Use AddGroup to add a group to an existing parser. - 3. Add a struct field to the top-level options annotated with the - group:"group-name" tag. - - - -Commands - -The flags package also has basic support for commands. Commands are often -used in monolithic applications that support various commands or actions. -Take git for example, all of the add, commit, checkout, etc. are called -commands. Using commands you can easily separate multiple functions of your -application. - -There are currently two ways to specify a command. - - 1. Use AddCommand on an existing parser. - 2. Add a struct field to your options struct annotated with the - command:"command-name" tag. - -The most common, idiomatic way to implement commands is to define a global -parser instance and implement each command in a separate file. These -command files should define a go init function which calls AddCommand on -the global parser. - -When parsing ends and there is an active command and that command implements -the Commander interface, then its Execute method will be run with the -remaining command line arguments. - -Command structs can have options which become valid to parse after the -command has been specified on the command line. It is currently not valid -to specify options from the parent level of the command after the command -name has occurred. Thus, given a top-level option "-v" and a command "add": - - Valid: ./app -v add - Invalid: ./app add -v - - -Completion - -go-flags has builtin support to provide bash completion of flags, commands -and argument values. To use completion, the binary which uses go-flags -can be invoked in a special environment to list completion of the current -command line argument. It should be noted that this `executes` your application, -and it is up to the user to make sure there are no negative side effects (for -example from init functions). - -Completion works by setting the environment variable -`GO_FLAGS_COMPLETION=1`, which enables a builtin flags command (named -`__complete`) which can be used to output a list of completions for the -passed arguments. The basic invocation to complete a set of arguments is -therefore: - - GO_FLAGS_COMPLETION=1 ./completion-example __complete -- arg1 arg2 arg3 - -where `completion-example` is the binary, `arg1` and `arg2` are -the current arguments, and `arg3` (the last argument) is the argument -to be completed. - -To use this with bash completion, a simple file can be written which -calls the binary which supports go-flags completion: - - _completion_example() { - # All arguments except the first one - args=("${COMP_WORDS[@]:1:$COMP_CWORD}") - - # Only split on newlines - local IFS=$'\n' - - # Call completion (note that the first element of COMP_WORDS is - # the executable itself) - COMPREPLY=($(GO_FLAGS_COMPLETION=1 ${COMP_WORDS[0]} __complete -- "${args[@]}")) - return 0 - } - - complete -F _completion_example completion-example - -Customized completion for argument values is supported by implementing -the flags.Completer interface for the argument value type. An example -of a type which does so is the flags.Filename type, an alias of string -allowing simple filename completion. -*/ -package flags diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/group.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/group.go deleted file mode 100644 index 8b609a3..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/group.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2012 Jesse van den Kieboom. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package flags - -import ( - "errors" - "strings" -) - -// ErrNotPointerToStruct indicates that a provided data container is not -// a pointer to a struct. Only pointers to structs are valid data containers -// for options. -var ErrNotPointerToStruct = errors.New("provided data is not a pointer to struct") - -// Group represents an option group. Option groups can be used to logically -// group options together under a description. Groups are only used to provide -// more structure to options both for the user (as displayed in the help message) -// and for you, since groups can be nested. -type Group struct { - // A short description of the group. The - // short description is primarily used in the built-in generated help - // message - ShortDescription string - - // A long description of the group. The long - // description is primarily used to present information on commands - // (Command embeds Group) in the built-in generated help and man pages. - LongDescription string - - // The namespace of the group - Namespace string - - // The parent of the group or nil if it has no parent - parent interface{} - - // All the options in the group - options []*Option - - // All the subgroups - groups []*Group - - // Whether the group represents the built-in help group - isBuiltinHelp bool - - data interface{} -} - -// AddGroup adds a new group to the command with the given name and data. The -// data needs to be a pointer to a struct from which the fields indicate which -// options are in the group. -func (g *Group) AddGroup(shortDescription string, longDescription string, data interface{}) (*Group, error) { - group := newGroup(shortDescription, longDescription, data) - - group.parent = g - - if err := group.scan(); err != nil { - return nil, err - } - - g.groups = append(g.groups, group) - return group, nil -} - -// Groups returns the list of groups embedded in this group. -func (g *Group) Groups() []*Group { - return g.groups -} - -// Options returns the list of options in this group. -func (g *Group) Options() []*Option { - return g.options -} - -// Find locates the subgroup with the given short description and returns it. -// If no such group can be found Find will return nil. Note that the description -// is matched case insensitively. -func (g *Group) Find(shortDescription string) *Group { - lshortDescription := strings.ToLower(shortDescription) - - var ret *Group - - g.eachGroup(func(gg *Group) { - if gg != g && strings.ToLower(gg.ShortDescription) == lshortDescription { - ret = gg - } - }) - - return ret -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/group_private.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/group_private.go deleted file mode 100644 index 26ee92a..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/group_private.go +++ /dev/null @@ -1,251 +0,0 @@ -package flags - -import ( - "reflect" - "unicode/utf8" - "unsafe" -) - -type scanHandler func(reflect.Value, *reflect.StructField) (bool, error) - -func newGroup(shortDescription string, longDescription string, data interface{}) *Group { - return &Group{ - ShortDescription: shortDescription, - LongDescription: longDescription, - - data: data, - } -} - -func (g *Group) optionByName(name string, namematch func(*Option, string) bool) *Option { - prio := 0 - var retopt *Option - - for _, opt := range g.options { - if namematch != nil && namematch(opt, name) && prio < 4 { - retopt = opt - prio = 4 - } - - if name == opt.field.Name && prio < 3 { - retopt = opt - prio = 3 - } - - if name == opt.LongNameWithNamespace() && prio < 2 { - retopt = opt - prio = 2 - } - - if opt.ShortName != 0 && name == string(opt.ShortName) && prio < 1 { - retopt = opt - prio = 1 - } - } - - return retopt -} - -func (g *Group) eachGroup(f func(*Group)) { - f(g) - - for _, gg := range g.groups { - gg.eachGroup(f) - } -} - -func (g *Group) scanStruct(realval reflect.Value, sfield *reflect.StructField, handler scanHandler) error { - stype := realval.Type() - - if sfield != nil { - if ok, err := handler(realval, sfield); err != nil { - return err - } else if ok { - return nil - } - } - - for i := 0; i < stype.NumField(); i++ { - field := stype.Field(i) - - // PkgName is set only for non-exported fields, which we ignore - if field.PkgPath != "" { - continue - } - - mtag := newMultiTag(string(field.Tag)) - - if err := mtag.Parse(); err != nil { - return err - } - - // Skip fields with the no-flag tag - if mtag.Get("no-flag") != "" { - continue - } - - // Dive deep into structs or pointers to structs - kind := field.Type.Kind() - fld := realval.Field(i) - - if kind == reflect.Struct { - if err := g.scanStruct(fld, &field, handler); err != nil { - return err - } - } else if kind == reflect.Ptr && field.Type.Elem().Kind() == reflect.Struct { - if fld.IsNil() { - fld.Set(reflect.New(fld.Type().Elem())) - } - - if err := g.scanStruct(reflect.Indirect(fld), &field, handler); err != nil { - return err - } - } - - longname := mtag.Get("long") - shortname := mtag.Get("short") - - // Need at least either a short or long name - if longname == "" && shortname == "" && mtag.Get("ini-name") == "" { - continue - } - - short := rune(0) - rc := utf8.RuneCountInString(shortname) - - if rc > 1 { - return newErrorf(ErrShortNameTooLong, - "short names can only be 1 character long, not `%s'", - shortname) - - } else if rc == 1 { - short, _ = utf8.DecodeRuneInString(shortname) - } - - description := mtag.Get("description") - def := mtag.GetMany("default") - optionalValue := mtag.GetMany("optional-value") - valueName := mtag.Get("value-name") - defaultMask := mtag.Get("default-mask") - - optional := (mtag.Get("optional") != "") - required := (mtag.Get("required") != "") - - option := &Option{ - Description: description, - ShortName: short, - LongName: longname, - Default: def, - OptionalArgument: optional, - OptionalValue: optionalValue, - Required: required, - ValueName: valueName, - DefaultMask: defaultMask, - - group: g, - - field: field, - value: realval.Field(i), - tag: mtag, - } - - g.options = append(g.options, option) - } - - return nil -} - -func (g *Group) checkForDuplicateFlags() *Error { - shortNames := make(map[rune]*Option) - longNames := make(map[string]*Option) - - var duplicateError *Error - - g.eachGroup(func(g *Group) { - for _, option := range g.options { - if option.LongName != "" { - longName := option.LongNameWithNamespace() - - if otherOption, ok := longNames[longName]; ok { - duplicateError = newErrorf(ErrDuplicatedFlag, "option `%s' uses the same long name as option `%s'", option, otherOption) - return - } - longNames[longName] = option - } - if option.ShortName != 0 { - if otherOption, ok := shortNames[option.ShortName]; ok { - duplicateError = newErrorf(ErrDuplicatedFlag, "option `%s' uses the same short name as option `%s'", option, otherOption) - return - } - shortNames[option.ShortName] = option - } - } - }) - - return duplicateError -} - -func (g *Group) scanSubGroupHandler(realval reflect.Value, sfield *reflect.StructField) (bool, error) { - mtag := newMultiTag(string(sfield.Tag)) - - if err := mtag.Parse(); err != nil { - return true, err - } - - subgroup := mtag.Get("group") - - if len(subgroup) != 0 { - ptrval := reflect.NewAt(realval.Type(), unsafe.Pointer(realval.UnsafeAddr())) - description := mtag.Get("description") - - group, err := g.AddGroup(subgroup, description, ptrval.Interface()) - if err != nil { - return true, err - } - - group.Namespace = mtag.Get("namespace") - - return true, nil - } - - return false, nil -} - -func (g *Group) scanType(handler scanHandler) error { - // Get all the public fields in the data struct - ptrval := reflect.ValueOf(g.data) - - if ptrval.Type().Kind() != reflect.Ptr { - panic(ErrNotPointerToStruct) - } - - stype := ptrval.Type().Elem() - - if stype.Kind() != reflect.Struct { - panic(ErrNotPointerToStruct) - } - - realval := reflect.Indirect(ptrval) - - if err := g.scanStruct(realval, nil, handler); err != nil { - return err - } - - if err := g.checkForDuplicateFlags(); err != nil { - return err - } - - return nil -} - -func (g *Group) scan() error { - return g.scanType(g.scanSubGroupHandler) -} - -func (g *Group) groupByName(name string) *Group { - if len(name) == 0 { - return g - } - - return g.Find(name) -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/group_test.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/group_test.go deleted file mode 100644 index b5ed9d4..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/group_test.go +++ /dev/null @@ -1,187 +0,0 @@ -package flags - -import ( - "testing" -) - -func TestGroupInline(t *testing.T) { - var opts = struct { - Value bool `short:"v"` - - Group struct { - G bool `short:"g"` - } `group:"Grouped Options"` - }{} - - p, ret := assertParserSuccess(t, &opts, "-v", "-g") - - assertStringArray(t, ret, []string{}) - - if !opts.Value { - t.Errorf("Expected Value to be true") - } - - if !opts.Group.G { - t.Errorf("Expected Group.G to be true") - } - - if p.Command.Group.Find("Grouped Options") == nil { - t.Errorf("Expected to find group `Grouped Options'") - } -} - -func TestGroupAdd(t *testing.T) { - var opts = struct { - Value bool `short:"v"` - }{} - - var grp = struct { - G bool `short:"g"` - }{} - - p := NewParser(&opts, Default) - g, err := p.AddGroup("Grouped Options", "", &grp) - - if err != nil { - t.Fatalf("Unexpected error: %v", err) - return - } - - ret, err := p.ParseArgs([]string{"-v", "-g", "rest"}) - - if err != nil { - t.Fatalf("Unexpected error: %v", err) - return - } - - assertStringArray(t, ret, []string{"rest"}) - - if !opts.Value { - t.Errorf("Expected Value to be true") - } - - if !grp.G { - t.Errorf("Expected Group.G to be true") - } - - if p.Command.Group.Find("Grouped Options") != g { - t.Errorf("Expected to find group `Grouped Options'") - } - - if p.Groups()[1] != g { - t.Errorf("Expected group %#v, but got %#v", g, p.Groups()[0]) - } - - if g.Options()[0].ShortName != 'g' { - t.Errorf("Expected short name `g' but got %v", g.Options()[0].ShortName) - } -} - -func TestGroupNestedInline(t *testing.T) { - var opts = struct { - Value bool `short:"v"` - - Group struct { - G bool `short:"g"` - - Nested struct { - N string `long:"n"` - } `group:"Nested Options"` - } `group:"Grouped Options"` - }{} - - p, ret := assertParserSuccess(t, &opts, "-v", "-g", "--n", "n", "rest") - - assertStringArray(t, ret, []string{"rest"}) - - if !opts.Value { - t.Errorf("Expected Value to be true") - } - - if !opts.Group.G { - t.Errorf("Expected Group.G to be true") - } - - assertString(t, opts.Group.Nested.N, "n") - - if p.Command.Group.Find("Grouped Options") == nil { - t.Errorf("Expected to find group `Grouped Options'") - } - - if p.Command.Group.Find("Nested Options") == nil { - t.Errorf("Expected to find group `Nested Options'") - } -} - -func TestGroupNestedInlineNamespace(t *testing.T) { - var opts = struct { - Opt string `long:"opt"` - - Group struct { - Opt string `long:"opt"` - Group struct { - Opt string `long:"opt"` - } `group:"Subsubgroup" namespace:"sap"` - } `group:"Subgroup" namespace:"sip"` - }{} - - p, ret := assertParserSuccess(t, &opts, "--opt", "a", "--sip.opt", "b", "--sip.sap.opt", "c", "rest") - - assertStringArray(t, ret, []string{"rest"}) - - assertString(t, opts.Opt, "a") - assertString(t, opts.Group.Opt, "b") - assertString(t, opts.Group.Group.Opt, "c") - - for _, name := range []string{"Subgroup", "Subsubgroup"} { - if p.Command.Group.Find(name) == nil { - t.Errorf("Expected to find group '%s'", name) - } - } -} - -func TestDuplicateShortFlags(t *testing.T) { - var opts struct { - Verbose []bool `short:"v" long:"verbose" description:"Show verbose debug information"` - Variables []string `short:"v" long:"variable" description:"Set a variable value."` - } - - args := []string{ - "--verbose", - "-v", "123", - "-v", "456", - } - - _, err := ParseArgs(&opts, args) - - if err == nil { - t.Errorf("Expected an error with type ErrDuplicatedFlag") - } else { - err2 := err.(*Error) - if err2.Type != ErrDuplicatedFlag { - t.Errorf("Expected an error with type ErrDuplicatedFlag") - } - } -} - -func TestDuplicateLongFlags(t *testing.T) { - var opts struct { - Test1 []bool `short:"a" long:"testing" description:"Test 1"` - Test2 []string `short:"b" long:"testing" description:"Test 2."` - } - - args := []string{ - "--testing", - } - - _, err := ParseArgs(&opts, args) - - if err == nil { - t.Errorf("Expected an error with type ErrDuplicatedFlag") - } else { - err2 := err.(*Error) - if err2.Type != ErrDuplicatedFlag { - t.Errorf("Expected an error with type ErrDuplicatedFlag") - } - } -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/help.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/help.go deleted file mode 100644 index 0139215..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/help.go +++ /dev/null @@ -1,408 +0,0 @@ -// Copyright 2012 Jesse van den Kieboom. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package flags - -import ( - "bufio" - "bytes" - "fmt" - "io" - "reflect" - "strings" - "unicode/utf8" -) - -type alignmentInfo struct { - maxLongLen int - hasShort bool - hasValueName bool - terminalColumns int - indent bool -} - -const ( - paddingBeforeOption = 2 - distanceBetweenOptionAndDescription = 2 -) - -func (a *alignmentInfo) descriptionStart() int { - ret := a.maxLongLen + distanceBetweenOptionAndDescription - - if a.hasShort { - ret += 2 - } - - if a.maxLongLen > 0 { - ret += 4 - } - - if a.hasValueName { - ret += 3 - } - - return ret -} - -func (a *alignmentInfo) updateLen(name string, indent bool) { - l := utf8.RuneCountInString(name) - - if indent { - l = l + 4 - } - - if l > a.maxLongLen { - a.maxLongLen = l - } -} - -func (p *Parser) getAlignmentInfo() alignmentInfo { - ret := alignmentInfo{ - maxLongLen: 0, - hasShort: false, - hasValueName: false, - terminalColumns: getTerminalColumns(), - } - - if ret.terminalColumns <= 0 { - ret.terminalColumns = 80 - } - - var prevcmd *Command - - p.eachActiveGroup(func(c *Command, grp *Group) { - if c != prevcmd { - for _, arg := range c.args { - ret.updateLen(arg.Name, c != p.Command) - } - } - - for _, info := range grp.options { - if !info.canCli() { - continue - } - - if info.ShortName != 0 { - ret.hasShort = true - } - - if len(info.ValueName) > 0 { - ret.hasValueName = true - } - - ret.updateLen(info.LongNameWithNamespace()+info.ValueName, c != p.Command) - } - }) - - return ret -} - -func (p *Parser) writeHelpOption(writer *bufio.Writer, option *Option, info alignmentInfo) { - line := &bytes.Buffer{} - - prefix := paddingBeforeOption - - if info.indent { - prefix += 4 - } - - line.WriteString(strings.Repeat(" ", prefix)) - - if option.ShortName != 0 { - line.WriteRune(defaultShortOptDelimiter) - line.WriteRune(option.ShortName) - } else if info.hasShort { - line.WriteString(" ") - } - - descstart := info.descriptionStart() + paddingBeforeOption - - if len(option.LongName) > 0 { - if option.ShortName != 0 { - line.WriteString(", ") - } else if info.hasShort { - line.WriteString(" ") - } - - line.WriteString(defaultLongOptDelimiter) - line.WriteString(option.LongNameWithNamespace()) - } - - if option.canArgument() { - line.WriteRune(defaultNameArgDelimiter) - - if len(option.ValueName) > 0 { - line.WriteString(option.ValueName) - } - } - - written := line.Len() - line.WriteTo(writer) - - if option.Description != "" { - dw := descstart - written - writer.WriteString(strings.Repeat(" ", dw)) - - def := "" - defs := option.Default - - if len(option.DefaultMask) != 0 { - if option.DefaultMask != "-" { - def = option.DefaultMask - } - } else if len(defs) == 0 && option.canArgument() { - var showdef bool - - switch option.field.Type.Kind() { - case reflect.Func, reflect.Ptr: - showdef = !option.value.IsNil() - case reflect.Slice, reflect.String, reflect.Array: - showdef = option.value.Len() > 0 - case reflect.Map: - showdef = !option.value.IsNil() && option.value.Len() > 0 - default: - zeroval := reflect.Zero(option.field.Type) - showdef = !reflect.DeepEqual(zeroval.Interface(), option.value.Interface()) - } - - if showdef { - def, _ = convertToString(option.value, option.tag) - } - } else if len(defs) != 0 { - def = strings.Join(defs, ", ") - } - - var desc string - - if def != "" { - desc = fmt.Sprintf("%s (%v)", option.Description, def) - } else { - desc = option.Description - } - - writer.WriteString(wrapText(desc, - info.terminalColumns-descstart, - strings.Repeat(" ", descstart))) - } - - writer.WriteString("\n") -} - -func maxCommandLength(s []*Command) int { - if len(s) == 0 { - return 0 - } - - ret := len(s[0].Name) - - for _, v := range s[1:] { - l := len(v.Name) - - if l > ret { - ret = l - } - } - - return ret -} - -// WriteHelp writes a help message containing all the possible options and -// their descriptions to the provided writer. Note that the HelpFlag parser -// option provides a convenient way to add a -h/--help option group to the -// command line parser which will automatically show the help messages using -// this method. -func (p *Parser) WriteHelp(writer io.Writer) { - if writer == nil { - return - } - - wr := bufio.NewWriter(writer) - aligninfo := p.getAlignmentInfo() - - cmd := p.Command - - for cmd.Active != nil { - cmd = cmd.Active - } - - if p.Name != "" { - wr.WriteString("Usage:\n") - wr.WriteString(" ") - - allcmd := p.Command - - for allcmd != nil { - var usage string - - if allcmd == p.Command { - if len(p.Usage) != 0 { - usage = p.Usage - } else if p.Options&HelpFlag != 0 { - usage = "[OPTIONS]" - } - } else if us, ok := allcmd.data.(Usage); ok { - usage = us.Usage() - } else if allcmd.hasCliOptions() { - usage = fmt.Sprintf("[%s-OPTIONS]", allcmd.Name) - } - - if len(usage) != 0 { - fmt.Fprintf(wr, " %s %s", allcmd.Name, usage) - } else { - fmt.Fprintf(wr, " %s", allcmd.Name) - } - - if len(allcmd.args) > 0 { - fmt.Fprintf(wr, " ") - } - - for i, arg := range allcmd.args { - if i != 0 { - fmt.Fprintf(wr, " ") - } - - name := arg.Name - - if arg.isRemaining() { - name = name + "..." - } - - if !allcmd.ArgsRequired { - fmt.Fprintf(wr, "[%s]", name) - } else { - fmt.Fprintf(wr, "%s", name) - } - } - - if allcmd.Active == nil && len(allcmd.commands) > 0 { - var co, cc string - - if allcmd.SubcommandsOptional { - co, cc = "[", "]" - } else { - co, cc = "<", ">" - } - - if len(allcmd.commands) > 3 { - fmt.Fprintf(wr, " %scommand%s", co, cc) - } else { - subcommands := allcmd.sortedCommands() - names := make([]string, len(subcommands)) - - for i, subc := range subcommands { - names[i] = subc.Name - } - - fmt.Fprintf(wr, " %s%s%s", co, strings.Join(names, " | "), cc) - } - } - - allcmd = allcmd.Active - } - - fmt.Fprintln(wr) - - if len(cmd.LongDescription) != 0 { - fmt.Fprintln(wr) - - t := wrapText(cmd.LongDescription, - aligninfo.terminalColumns, - "") - - fmt.Fprintln(wr, t) - } - } - - c := p.Command - - for c != nil { - printcmd := c != p.Command - - c.eachGroup(func(grp *Group) { - first := true - - // Skip built-in help group for all commands except the top-level - // parser - if grp.isBuiltinHelp && c != p.Command { - return - } - - for _, info := range grp.options { - if !info.canCli() { - continue - } - - if printcmd { - fmt.Fprintf(wr, "\n[%s command options]\n", c.Name) - aligninfo.indent = true - printcmd = false - } - - if first && cmd.Group != grp { - fmt.Fprintln(wr) - - if aligninfo.indent { - wr.WriteString(" ") - } - - fmt.Fprintf(wr, "%s:\n", grp.ShortDescription) - first = false - } - - p.writeHelpOption(wr, info, aligninfo) - } - }) - - if len(c.args) > 0 { - if c == p.Command { - fmt.Fprintf(wr, "\nArguments:\n") - } else { - fmt.Fprintf(wr, "\n[%s command arguments]\n", c.Name) - } - - maxlen := aligninfo.descriptionStart() - - for _, arg := range c.args { - prefix := strings.Repeat(" ", paddingBeforeOption) - fmt.Fprintf(wr, "%s%s", prefix, arg.Name) - - if len(arg.Description) > 0 { - align := strings.Repeat(" ", maxlen-len(arg.Name)-1) - fmt.Fprintf(wr, ":%s%s", align, arg.Description) - } - - fmt.Fprintln(wr) - } - } - - c = c.Active - } - - scommands := cmd.sortedCommands() - - if len(scommands) > 0 { - maxnamelen := maxCommandLength(scommands) - - fmt.Fprintln(wr) - fmt.Fprintln(wr, "Available commands:") - - for _, c := range scommands { - fmt.Fprintf(wr, " %s", c.Name) - - if len(c.ShortDescription) > 0 { - pad := strings.Repeat(" ", maxnamelen-len(c.Name)) - fmt.Fprintf(wr, "%s %s", pad, c.ShortDescription) - - if len(c.Aliases) > 0 { - fmt.Fprintf(wr, " (aliases: %s)", strings.Join(c.Aliases, ", ")) - } - - } - - fmt.Fprintln(wr) - } - } - - wr.Flush() -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/help_test.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/help_test.go deleted file mode 100644 index 27de672..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/help_test.go +++ /dev/null @@ -1,321 +0,0 @@ -package flags - -import ( - "bytes" - "fmt" - "io" - "io/ioutil" - "os" - "os/exec" - "runtime" - "testing" - "time" -) - -func helpDiff(a, b string) (string, error) { - atmp, err := ioutil.TempFile("", "help-diff") - - if err != nil { - return "", err - } - - btmp, err := ioutil.TempFile("", "help-diff") - - if err != nil { - return "", err - } - - if _, err := io.WriteString(atmp, a); err != nil { - return "", err - } - - if _, err := io.WriteString(btmp, b); err != nil { - return "", err - } - - ret, err := exec.Command("diff", "-u", "-d", "--label", "got", atmp.Name(), "--label", "expected", btmp.Name()).Output() - - os.Remove(atmp.Name()) - os.Remove(btmp.Name()) - - if err.Error() == "exit status 1" { - return string(ret), nil - } - - return string(ret), err -} - -type helpOptions struct { - Verbose []bool `short:"v" long:"verbose" description:"Show verbose debug information" ini-name:"verbose"` - Call func(string) `short:"c" description:"Call phone number" ini-name:"call"` - PtrSlice []*string `long:"ptrslice" description:"A slice of pointers to string"` - EmptyDescription bool `long:"empty-description"` - - Default string `long:"default" default:"Some value" description:"Test default value"` - DefaultArray []string `long:"default-array" default:"Some value" default:"Another value" description:"Test default array value"` - DefaultMap map[string]string `long:"default-map" default:"some:value" default:"another:value" description:"Testdefault map value"` - - OnlyIni string `ini-name:"only-ini" description:"Option only available in ini"` - - Other struct { - StringSlice []string `short:"s" default:"some" default:"value" description:"A slice of strings"` - IntMap map[string]int `long:"intmap" default:"a:1" description:"A map from string to int" ini-name:"int-map"` - } `group:"Other Options"` - - Group struct { - Opt string `long:"opt" description:"This is a subgroup option"` - - Group struct { - Opt string `long:"opt" description:"This is a subsubgroup option"` - } `group:"Subsubgroup" namespace:"sap"` - } `group:"Subgroup" namespace:"sip"` - - Command struct { - ExtraVerbose []bool `long:"extra-verbose" description:"Use for extra verbosity"` - } `command:"command" alias:"cm" alias:"cmd" description:"A command"` - - Args struct { - Filename string `name:"filename" description:"A filename"` - Num int `name:"num" description:"A number"` - } `positional-args:"yes"` -} - -func TestHelp(t *testing.T) { - var opts helpOptions - - p := NewNamedParser("TestHelp", HelpFlag) - p.AddGroup("Application Options", "The application options", &opts) - - _, err := p.ParseArgs([]string{"--help"}) - - if err == nil { - t.Fatalf("Expected help error") - } - - if e, ok := err.(*Error); !ok { - t.Fatalf("Expected flags.Error, but got %T", err) - } else { - if e.Type != ErrHelp { - t.Errorf("Expected flags.ErrHelp type, but got %s", e.Type) - } - - var expected string - - if runtime.GOOS == "windows" { - expected = `Usage: - TestHelp [OPTIONS] [filename] [num] - -Application Options: - /v, /verbose Show verbose debug information - /c: Call phone number - /ptrslice: A slice of pointers to string - /empty-description - /default: Test default value (Some value) - /default-array: Test default array value (Some value, Another value) - /default-map: Testdefault map value (some:value, another:value) - -Other Options: - /s: A slice of strings (some, value) - /intmap: A map from string to int (a:1) - -Subgroup: - /sip.opt: This is a subgroup option - -Subsubgroup: - /sip.sap.opt: This is a subsubgroup option - -Help Options: - /? Show this help message - /h, /help Show this help message - -Arguments: - filename: A filename - num: A number - -Available commands: - command A command (aliases: cm, cmd) -` - } else { - expected = `Usage: - TestHelp [OPTIONS] [filename] [num] - -Application Options: - -v, --verbose Show verbose debug information - -c= Call phone number - --ptrslice= A slice of pointers to string - --empty-description - --default= Test default value (Some value) - --default-array= Test default array value (Some value, Another value) - --default-map= Testdefault map value (some:value, another:value) - -Other Options: - -s= A slice of strings (some, value) - --intmap= A map from string to int (a:1) - -Subgroup: - --sip.opt= This is a subgroup option - -Subsubgroup: - --sip.sap.opt= This is a subsubgroup option - -Help Options: - -h, --help Show this help message - -Arguments: - filename: A filename - num: A number - -Available commands: - command A command (aliases: cm, cmd) -` - } - - if e.Message != expected { - ret, err := helpDiff(e.Message, expected) - - if err != nil { - t.Errorf("Unexpected diff error: %s", err) - t.Errorf("Unexpected help message, expected:\n\n%s\n\nbut got\n\n%s", expected, e.Message) - } else { - t.Errorf("Unexpected help message:\n\n%s", ret) - } - } - } -} - -func TestMan(t *testing.T) { - var opts helpOptions - - p := NewNamedParser("TestMan", HelpFlag) - p.ShortDescription = "Test manpage generation" - p.LongDescription = "This is a somewhat `longer' description of what this does" - p.AddGroup("Application Options", "The application options", &opts) - - p.Commands()[0].LongDescription = "Longer `command' description" - - var buf bytes.Buffer - p.WriteManPage(&buf) - - got := buf.String() - - tt := time.Now() - - expected := fmt.Sprintf(`.TH TestMan 1 "%s" -.SH NAME -TestMan \- Test manpage generation -.SH SYNOPSIS -\fBTestMan\fP [OPTIONS] -.SH DESCRIPTION -This is a somewhat \fBlonger\fP description of what this does -.SH OPTIONS -.TP -\fB-v, --verbose\fP -Show verbose debug information -.TP -\fB-c\fP -Call phone number -.TP -\fB--ptrslice\fP -A slice of pointers to string -.TP -\fB--empty-description\fP -.TP -\fB--default\fP -Test default value -.TP -\fB--default-array\fP -Test default array value -.TP -\fB--default-map\fP -Testdefault map value -.TP -\fB-s\fP -A slice of strings -.TP -\fB--intmap\fP -A map from string to int -.TP -\fB--sip.opt\fP -This is a subgroup option -.TP -\fB--sip.sap.opt\fP -This is a subsubgroup option -.SH COMMANDS -.SS command -A command - -Longer \fBcommand\fP description - -\fBAliases\fP: cm, cmd - -.TP -\fB--extra-verbose\fP -Use for extra verbosity -`, tt.Format("2 January 2006")) - - if got != expected { - ret, err := helpDiff(got, expected) - - if err != nil { - t.Errorf("Unexpected man page, expected:\n\n%s\n\nbut got\n\n%s", expected, got) - } else { - t.Errorf("Unexpected man page:\n\n%s", ret) - } - } -} - -type helpCommandNoOptions struct { - Command struct { - } `command:"command" description:"A command"` -} - -func TestHelpCommand(t *testing.T) { - var opts helpCommandNoOptions - - p := NewNamedParser("TestHelpCommand", HelpFlag) - p.AddGroup("Application Options", "The application options", &opts) - - _, err := p.ParseArgs([]string{"command", "--help"}) - - if err == nil { - t.Fatalf("Expected help error") - } - - if e, ok := err.(*Error); !ok { - t.Fatalf("Expected flags.Error, but got %T", err) - } else { - if e.Type != ErrHelp { - t.Errorf("Expected flags.ErrHelp type, but got %s", e.Type) - } - - var expected string - - if runtime.GOOS == "windows" { - expected = `Usage: - TestHelpCommand [OPTIONS] command - -Help Options: - /? Show this help message - /h, /help Show this help message -` - } else { - expected = `Usage: - TestHelpCommand [OPTIONS] command - -Help Options: - -h, --help Show this help message -` - } - - if e.Message != expected { - ret, err := helpDiff(e.Message, expected) - - if err != nil { - t.Errorf("Unexpected diff error: %s", err) - t.Errorf("Unexpected help message, expected:\n\n%s\n\nbut got\n\n%s", expected, e.Message) - } else { - t.Errorf("Unexpected help message:\n\n%s", ret) - } - } - } -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/ini.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/ini.go deleted file mode 100644 index 7225052..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/ini.go +++ /dev/null @@ -1,140 +0,0 @@ -package flags - -import ( - "fmt" - "io" -) - -// IniError contains location information on where an error occured. -type IniError struct { - // The error message. - Message string - - // The filename of the file in which the error occurred. - File string - - // The line number at which the error occurred. - LineNumber uint -} - -// Error provides a "file:line: message" formatted message of the ini error. -func (x *IniError) Error() string { - return fmt.Sprintf( - "%s:%d: %s", - x.File, - x.LineNumber, - x.Message, - ) -} - -// IniOptions for writing -type IniOptions uint - -const ( - // IniNone indicates no options. - IniNone IniOptions = 0 - - // IniIncludeDefaults indicates that default values should be written. - IniIncludeDefaults = 1 << iota - - // IniCommentDefaults indicates that if IniIncludeDefaults is used - // options with default values are written but commented out. - IniCommentDefaults - - // IniIncludeComments indicates that comments containing the description - // of an option should be written. - IniIncludeComments - - // IniDefault provides a default set of options. - IniDefault = IniIncludeComments -) - -// IniParser is a utility to read and write flags options from and to ini -// formatted strings. -type IniParser struct { - parser *Parser -} - -// NewIniParser creates a new ini parser for a given Parser. -func NewIniParser(p *Parser) *IniParser { - return &IniParser{ - parser: p, - } -} - -// IniParse is a convenience function to parse command line options with default -// settings from an ini formatted file. The provided data is a pointer to a struct -// representing the default option group (named "Application Options"). For -// more control, use flags.NewParser. -func IniParse(filename string, data interface{}) error { - p := NewParser(data, Default) - - return NewIniParser(p).ParseFile(filename) -} - -// ParseFile parses flags from an ini formatted file. See Parse for more -// information on the ini file format. The returned errors can be of the type -// flags.Error or flags.IniError. -func (i *IniParser) ParseFile(filename string) error { - i.parser.clearIsSet() - - ini, err := readIniFromFile(filename) - - if err != nil { - return err - } - - return i.parse(ini) -} - -// Parse parses flags from an ini format. You can use ParseFile as a -// convenience function to parse from a filename instead of a general -// io.Reader. -// -// The format of the ini file is as follows: -// -// [Option group name] -// option = value -// -// Each section in the ini file represents an option group or command in the -// flags parser. The default flags parser option group (i.e. when using -// flags.Parse) is named 'Application Options'. The ini option name is matched -// in the following order: -// -// 1. Compared to the ini-name tag on the option struct field (if present) -// 2. Compared to the struct field name -// 3. Compared to the option long name (if present) -// 4. Compared to the option short name (if present) -// -// Sections for nested groups and commands can be addressed using a dot `.' -// namespacing notation (i.e [subcommand.Options]). Group section names are -// matched case insensitive. -// -// The returned errors can be of the type flags.Error or flags.IniError. -func (i *IniParser) Parse(reader io.Reader) error { - i.parser.clearIsSet() - - ini, err := readIni(reader, "") - - if err != nil { - return err - } - - return i.parse(ini) -} - -// WriteFile writes the flags as ini format into a file. See WriteIni -// for more information. The returned error occurs when the specified file -// could not be opened for writing. -func (i *IniParser) WriteFile(filename string, options IniOptions) error { - return writeIniToFile(i, filename, options) -} - -// Write writes the current values of all the flags to an ini format. -// See Parse for more information on the ini file format. You typically -// call this only after settings have been parsed since the default values of each -// option are stored just before parsing the flags (this is only relevant when -// IniIncludeDefaults is _not_ set in options). -func (i *IniParser) Write(writer io.Writer, options IniOptions) { - writeIni(i, writer, options) -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/ini_private.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/ini_private.go deleted file mode 100644 index 1a671f5..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/ini_private.go +++ /dev/null @@ -1,364 +0,0 @@ -package flags - -import ( - "bufio" - "fmt" - "io" - "os" - "reflect" - "sort" - "strings" -) - -type iniValue struct { - Name string - Value string -} - -type iniSection []iniValue -type ini map[string]iniSection - -func readFullLine(reader *bufio.Reader) (string, error) { - var line []byte - - for { - l, more, err := reader.ReadLine() - - if err != nil { - return "", err - } - - if line == nil && !more { - return string(l), nil - } - - line = append(line, l...) - - if !more { - break - } - } - - return string(line), nil -} - -func optionIniName(option *Option) string { - name := option.tag.Get("_read-ini-name") - - if len(name) != 0 { - return name - } - - name = option.tag.Get("ini-name") - - if len(name) != 0 { - return name - } - - return option.field.Name -} - -func writeGroupIni(group *Group, namespace string, writer io.Writer, options IniOptions) { - var sname string - - if len(namespace) != 0 { - sname = namespace + "." + group.ShortDescription - } else { - sname = group.ShortDescription - } - - sectionwritten := false - comments := (options & IniIncludeComments) != IniNone - - for _, option := range group.options { - if option.isFunc() { - continue - } - - if len(option.tag.Get("no-ini")) != 0 { - continue - } - - val := option.value - - if (options&IniIncludeDefaults) == IniNone && option.valueIsDefault() { - continue - } - - if !sectionwritten { - fmt.Fprintf(writer, "[%s]\n", sname) - sectionwritten = true - } - - if comments && len(option.Description) != 0 { - fmt.Fprintf(writer, "; %s\n", option.Description) - } - - oname := optionIniName(option) - - commentOption := "" - if (options&(IniIncludeDefaults|IniCommentDefaults)) == IniIncludeDefaults|IniCommentDefaults && option.valueIsDefault() { - commentOption = "; " - } - - switch val.Type().Kind() { - case reflect.Slice: - for idx := 0; idx < val.Len(); idx++ { - v, _ := convertToString(val.Index(idx), option.tag) - fmt.Fprintf(writer, "%s%s = %s\n", commentOption, oname, v) - } - - if val.Len() == 0 { - fmt.Fprintf(writer, "; %s =\n", oname) - } - case reflect.Map: - mkeys := val.MapKeys() - keys := make([]string, len(val.MapKeys())) - kkmap := make(map[string]reflect.Value) - - for i, k := range mkeys { - keys[i], _ = convertToString(k, option.tag) - kkmap[keys[i]] = k - } - - sort.Strings(keys) - - for _, k := range keys { - v, _ := convertToString(val.MapIndex(kkmap[k]), option.tag) - - fmt.Fprintf(writer, "%s%s = %s:%s\n", commentOption, oname, k, v) - } - - if val.Len() == 0 { - fmt.Fprintf(writer, "; %s =\n", oname) - } - default: - v, _ := convertToString(val, option.tag) - - if len(v) != 0 { - fmt.Fprintf(writer, "%s%s = %s\n", commentOption, oname, v) - } else { - fmt.Fprintf(writer, "%s%s =\n", commentOption, oname) - } - } - - if comments { - fmt.Fprintln(writer) - } - } - - if sectionwritten && !comments { - fmt.Fprintln(writer) - } -} - -func writeCommandIni(command *Command, namespace string, writer io.Writer, options IniOptions) { - command.eachGroup(func(group *Group) { - writeGroupIni(group, namespace, writer, options) - }) - - for _, c := range command.commands { - var nns string - - if len(namespace) != 0 { - nns = c.Name + "." + nns - } else { - nns = c.Name - } - - writeCommandIni(c, nns, writer, options) - } -} - -func writeIni(parser *IniParser, writer io.Writer, options IniOptions) { - writeCommandIni(parser.parser.Command, "", writer, options) -} - -func writeIniToFile(parser *IniParser, filename string, options IniOptions) error { - file, err := os.Create(filename) - - if err != nil { - return err - } - - defer file.Close() - - writeIni(parser, file, options) - - return nil -} - -func readIniFromFile(filename string) (ini, error) { - file, err := os.Open(filename) - - if err != nil { - return nil, err - } - - defer file.Close() - - return readIni(file, filename) -} - -func readIni(contents io.Reader, filename string) (ini, error) { - ret := make(ini) - - reader := bufio.NewReader(contents) - - // Empty global section - section := make(iniSection, 0, 10) - sectionname := "" - - ret[sectionname] = section - - var lineno uint - - for { - line, err := readFullLine(reader) - - if err == io.EOF { - break - } else if err != nil { - return nil, err - } - - lineno++ - line = strings.TrimSpace(line) - - // Skip empty lines and lines starting with ; (comments) - if len(line) == 0 || line[0] == ';' || line[0] == '#' { - continue - } - - if line[0] == '[' { - if line[0] != '[' || line[len(line)-1] != ']' { - return nil, &IniError{ - Message: "malformed section header", - File: filename, - LineNumber: lineno, - } - } - - name := strings.TrimSpace(line[1 : len(line)-1]) - - if len(name) == 0 { - return nil, &IniError{ - Message: "empty section name", - File: filename, - LineNumber: lineno, - } - } - - sectionname = name - section = ret[name] - - if section == nil { - section = make(iniSection, 0, 10) - ret[name] = section - } - - continue - } - - // Parse option here - keyval := strings.SplitN(line, "=", 2) - - if len(keyval) != 2 { - return nil, &IniError{ - Message: fmt.Sprintf("malformed key=value (%s)", line), - File: filename, - LineNumber: lineno, - } - } - - name := strings.TrimSpace(keyval[0]) - value := strings.TrimSpace(keyval[1]) - - section = append(section, iniValue{ - Name: name, - Value: value, - }) - - ret[sectionname] = section - } - - return ret, nil -} - -func (i *IniParser) matchingGroups(name string) []*Group { - if len(name) == 0 { - var ret []*Group - - i.parser.eachGroup(func(g *Group) { - ret = append(ret, g) - }) - - return ret - } - - g := i.parser.groupByName(name) - - if g != nil { - return []*Group{g} - } - - return nil -} - -func (i *IniParser) parse(ini ini) error { - p := i.parser - - for name, section := range ini { - groups := i.matchingGroups(name) - - if len(groups) == 0 { - return newError( - ErrUnknownGroup, - fmt.Sprintf("could not find option group `%s'", name), - ) - } - - for _, inival := range section { - var opt *Option - - for _, group := range groups { - opt = group.optionByName(inival.Name, func(o *Option, n string) bool { - return strings.ToLower(o.tag.Get("ini-name")) == strings.ToLower(n) - }) - - if opt != nil && len(opt.tag.Get("no-ini")) != 0 { - opt = nil - } - - if opt != nil { - break - } - } - - if opt == nil { - if (p.Options & IgnoreUnknown) == None { - return newError( - ErrUnknownFlag, - fmt.Sprintf("unknown option: %s", inival.Name), - ) - } - - continue - } - - pval := &inival.Value - - if !opt.canArgument() && len(inival.Value) == 0 { - pval = nil - } - - if err := opt.set(pval); err != nil { - return wrapError(err) - } - - opt.tag.Set("_read-ini-name", inival.Name) - } - } - - return nil -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/ini_test.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/ini_test.go deleted file mode 100644 index eb752e9..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/ini_test.go +++ /dev/null @@ -1,461 +0,0 @@ -package flags - -import ( - "bytes" - "io/ioutil" - "os" - "strings" - "testing" -) - -func TestWriteIni(t *testing.T) { - var tests = []struct { - args []string - options IniOptions - expected string - }{ - { - []string{"-vv", "--intmap=a:2", "--intmap", "b:3", "filename", "0", "command"}, - IniDefault, - `[Application Options] -; Show verbose debug information -verbose = true -verbose = true - -[Other Options] -; A map from string to int -int-map = a:2 -int-map = b:3 - -`, - }, - { - []string{"-vv", "--intmap=a:2", "--intmap", "b:3", "filename", "0", "command"}, - IniDefault | IniIncludeDefaults, - `[Application Options] -; Show verbose debug information -verbose = true -verbose = true - -; A slice of pointers to string -; PtrSlice = - -EmptyDescription = false - -; Test default value -Default = Some value - -; Test default array value -DefaultArray = Some value -DefaultArray = Another value - -; Testdefault map value -DefaultMap = another:value -DefaultMap = some:value - -; Option only available in ini -only-ini = - -[Other Options] -; A slice of strings -StringSlice = some -StringSlice = value - -; A map from string to int -int-map = a:2 -int-map = b:3 - -[Subgroup] -; This is a subgroup option -Opt = - -[Subsubgroup] -; This is a subsubgroup option -Opt = - -[command.A command] -; Use for extra verbosity -; ExtraVerbose = - -`, - }, - { - []string{"filename", "0", "command"}, - IniDefault | IniIncludeDefaults | IniCommentDefaults, - `[Application Options] -; Show verbose debug information -; verbose = - -; A slice of pointers to string -; PtrSlice = - -; EmptyDescription = false - -; Test default value -; Default = Some value - -; Test default array value -; DefaultArray = Some value -; DefaultArray = Another value - -; Testdefault map value -; DefaultMap = another:value -; DefaultMap = some:value - -; Option only available in ini -; only-ini = - -[Other Options] -; A slice of strings -; StringSlice = some -; StringSlice = value - -; A map from string to int -; int-map = a:1 - -[Subgroup] -; This is a subgroup option -; Opt = - -[Subsubgroup] -; This is a subsubgroup option -; Opt = - -[command.A command] -; Use for extra verbosity -; ExtraVerbose = - -`, - }, - { - []string{"--default=New value", "--default-array=New value", "--default-map=new:value", "filename", "0", "command"}, - IniDefault | IniIncludeDefaults | IniCommentDefaults, - `[Application Options] -; Show verbose debug information -; verbose = - -; A slice of pointers to string -; PtrSlice = - -; EmptyDescription = false - -; Test default value -Default = New value - -; Test default array value -DefaultArray = New value - -; Testdefault map value -DefaultMap = new:value - -; Option only available in ini -; only-ini = - -[Other Options] -; A slice of strings -; StringSlice = some -; StringSlice = value - -; A map from string to int -; int-map = a:1 - -[Subgroup] -; This is a subgroup option -; Opt = - -[Subsubgroup] -; This is a subsubgroup option -; Opt = - -[command.A command] -; Use for extra verbosity -; ExtraVerbose = - -`, - }, - } - - for _, test := range tests { - var opts helpOptions - - p := NewNamedParser("TestIni", Default) - p.AddGroup("Application Options", "The application options", &opts) - - _, err := p.ParseArgs(test.args) - - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - - inip := NewIniParser(p) - - var b bytes.Buffer - inip.Write(&b, test.options) - - got := b.String() - expected := test.expected - - if got != expected { - ret, err := helpDiff(got, expected) - - if err != nil { - t.Errorf("Unexpected ini with arguments %+v and ini options %b, expected:\n\n%s\n\nbut got\n\n%s", test.args, test.options, expected, got) - } else { - t.Errorf("Unexpected ini with arguments %+v and ini options %b:\n\n%s", test.args, test.options, ret) - } - } - } -} - -func TestReadIni(t *testing.T) { - var opts helpOptions - - p := NewNamedParser("TestIni", Default) - p.AddGroup("Application Options", "The application options", &opts) - - inip := NewIniParser(p) - - inic := ` -; Show verbose debug information -verbose = true -verbose = true - -[Application Options] -; A slice of pointers to string -; PtrSlice = - -; Test default value -Default = Some value - -[Other Options] -# A slice of strings -# StringSlice = - -; A map from string to int -int-map = a:2 -int-map = b:3 - -` - - b := strings.NewReader(inic) - err := inip.Parse(b) - - if err != nil { - t.Fatalf("Unexpected error: %s", err) - } - - assertBoolArray(t, opts.Verbose, []bool{true, true}) - - if v, ok := opts.Other.IntMap["a"]; !ok { - t.Errorf("Expected \"a\" in Other.IntMap") - } else if v != 2 { - t.Errorf("Expected Other.IntMap[\"a\"] = 2, but got %v", v) - } - - if v, ok := opts.Other.IntMap["b"]; !ok { - t.Errorf("Expected \"b\" in Other.IntMap") - } else if v != 3 { - t.Errorf("Expected Other.IntMap[\"b\"] = 3, but got %v", v) - } -} - -func TestIniCommands(t *testing.T) { - var opts struct { - Value string `short:"v" long:"value"` - - Add struct { - Name int `short:"n" long:"name" ini-name:"AliasName"` - - Other struct { - O string `short:"o" long:"other"` - } `group:"Other Options"` - } `command:"add"` - } - - p := NewNamedParser("TestIni", Default) - p.AddGroup("Application Options", "The application options", &opts) - - inip := NewIniParser(p) - - inic := `[Application Options] -value = some value - -[add] -AliasName = 5 - -[add.Other Options] -other = subgroup -` - - b := strings.NewReader(inic) - err := inip.Parse(b) - - if err != nil { - t.Fatalf("Unexpected error: %s", err) - } - - assertString(t, opts.Value, "some value") - - if opts.Add.Name != 5 { - t.Errorf("Expected opts.Add.Name to be 5, but got %v", opts.Add.Name) - } - - assertString(t, opts.Add.Other.O, "subgroup") -} - -func TestIniNoIni(t *testing.T) { - var opts struct { - Value string `short:"v" long:"value" no-ini:"yes"` - } - - p := NewNamedParser("TestIni", Default) - p.AddGroup("Application Options", "The application options", &opts) - - inip := NewIniParser(p) - - inic := `[Application Options] -value = some value -` - - b := strings.NewReader(inic) - err := inip.Parse(b) - - if err == nil { - t.Fatalf("Expected error") - } - - assertError(t, err, ErrUnknownFlag, "unknown option: value") -} - -func TestIniParse(t *testing.T) { - file, err := ioutil.TempFile("", "") - if err != nil { - t.Fatalf("Cannot create temporary file: %s", err) - } - defer os.Remove(file.Name()) - - _, err = file.WriteString("value = 123") - if err != nil { - t.Fatalf("Cannot write to temporary file: %s", err) - } - - file.Close() - - var opts struct { - Value int `long:"value"` - } - - err = IniParse(file.Name(), &opts) - if err != nil { - t.Fatalf("Could not parse ini: %s", err) - } - - if opts.Value != 123 { - t.Fatalf("Expected Value to be \"123\" but was \"%d\"", opts.Value) - } -} - -func TestWriteFile(t *testing.T) { - file, err := ioutil.TempFile("", "") - if err != nil { - t.Fatalf("Cannot create temporary file: %s", err) - } - defer os.Remove(file.Name()) - - var opts struct { - Value int `long:"value"` - } - - opts.Value = 123 - - p := NewParser(&opts, Default) - ini := NewIniParser(p) - - err = ini.WriteFile(file.Name(), IniIncludeDefaults) - if err != nil { - t.Fatalf("Could not write ini file: %s", err) - } - - found, err := ioutil.ReadFile(file.Name()) - if err != nil { - t.Fatalf("Could not read written ini file: %s", err) - } - - expected := "[Application Options]\nValue = 123\n\n" - - if string(found) != expected { - t.Fatalf("Expected file content to be \"%s\" but was \"%s\"", expected, found) - } -} - -func TestOverwriteRequiredOptions(t *testing.T) { - var tests = []struct { - args []string - expected []string - }{ - { - args: []string{"--value", "from CLI"}, - expected: []string{ - "from CLI", - "from default", - }, - }, - { - args: []string{"--value", "from CLI", "--default", "from CLI"}, - expected: []string{ - "from CLI", - "from CLI", - }, - }, - { - args: []string{"--config", "no file name"}, - expected: []string{ - "from INI", - "from INI", - }, - }, - { - args: []string{"--value", "from CLI before", "--default", "from CLI before", "--config", "no file name"}, - expected: []string{ - "from INI", - "from INI", - }, - }, - { - args: []string{"--value", "from CLI before", "--default", "from CLI before", "--config", "no file name", "--value", "from CLI after", "--default", "from CLI after"}, - expected: []string{ - "from CLI after", - "from CLI after", - }, - }, - } - - for _, test := range tests { - var opts struct { - Config func(s string) error `long:"config" no-ini:"true"` - Value string `long:"value" required:"true"` - Default string `long:"default" required:"true" default:"from default"` - } - - p := NewParser(&opts, Default) - - opts.Config = func(s string) error { - ini := NewIniParser(p) - - return ini.Parse(bytes.NewBufferString("value = from INI\ndefault = from INI")) - } - - _, err := p.ParseArgs(test.args) - if err != nil { - t.Fatalf("Unexpected error %s with args %+v", err, test.args) - } - - if opts.Value != test.expected[0] { - t.Fatalf("Expected Value to be \"%s\" but was \"%s\" with args %+v", test.expected[0], opts.Value, test.args) - } - - if opts.Default != test.expected[1] { - t.Fatalf("Expected Default to be \"%s\" but was \"%s\" with args %+v", test.expected[1], opts.Default, test.args) - } - } -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/long_test.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/long_test.go deleted file mode 100644 index 02fc8c7..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/long_test.go +++ /dev/null @@ -1,85 +0,0 @@ -package flags - -import ( - "testing" -) - -func TestLong(t *testing.T) { - var opts = struct { - Value bool `long:"value"` - }{} - - ret := assertParseSuccess(t, &opts, "--value") - - assertStringArray(t, ret, []string{}) - - if !opts.Value { - t.Errorf("Expected Value to be true") - } -} - -func TestLongArg(t *testing.T) { - var opts = struct { - Value string `long:"value"` - }{} - - ret := assertParseSuccess(t, &opts, "--value", "value") - - assertStringArray(t, ret, []string{}) - assertString(t, opts.Value, "value") -} - -func TestLongArgEqual(t *testing.T) { - var opts = struct { - Value string `long:"value"` - }{} - - ret := assertParseSuccess(t, &opts, "--value=value") - - assertStringArray(t, ret, []string{}) - assertString(t, opts.Value, "value") -} - -func TestLongDefault(t *testing.T) { - var opts = struct { - Value string `long:"value" default:"value"` - }{} - - ret := assertParseSuccess(t, &opts) - - assertStringArray(t, ret, []string{}) - assertString(t, opts.Value, "value") -} - -func TestLongOptional(t *testing.T) { - var opts = struct { - Value string `long:"value" optional:"yes" optional-value:"value"` - }{} - - ret := assertParseSuccess(t, &opts, "--value") - - assertStringArray(t, ret, []string{}) - assertString(t, opts.Value, "value") -} - -func TestLongOptionalArg(t *testing.T) { - var opts = struct { - Value string `long:"value" optional:"yes" optional-value:"value"` - }{} - - ret := assertParseSuccess(t, &opts, "--value", "no") - - assertStringArray(t, ret, []string{"no"}) - assertString(t, opts.Value, "value") -} - -func TestLongOptionalArgEqual(t *testing.T) { - var opts = struct { - Value string `long:"value" optional:"yes" optional-value:"value"` - }{} - - ret := assertParseSuccess(t, &opts, "--value=value", "no") - - assertStringArray(t, ret, []string{"no"}) - assertString(t, opts.Value, "value") -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/man.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/man.go deleted file mode 100644 index 3097156..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/man.go +++ /dev/null @@ -1,140 +0,0 @@ -package flags - -import ( - "fmt" - "io" - "strings" - "time" -) - -func formatForMan(wr io.Writer, s string) { - for { - idx := strings.IndexRune(s, '`') - - if idx < 0 { - fmt.Fprintf(wr, "%s", s) - break - } - - fmt.Fprintf(wr, "%s", s[:idx]) - - s = s[idx+1:] - idx = strings.IndexRune(s, '\'') - - if idx < 0 { - fmt.Fprintf(wr, "%s", s) - break - } - - fmt.Fprintf(wr, "\\fB%s\\fP", s[:idx]) - s = s[idx+1:] - } -} - -func writeManPageOptions(wr io.Writer, grp *Group) { - grp.eachGroup(func(group *Group) { - for _, opt := range group.options { - if !opt.canCli() { - continue - } - - fmt.Fprintln(wr, ".TP") - fmt.Fprintf(wr, "\\fB") - - if opt.ShortName != 0 { - fmt.Fprintf(wr, "-%c", opt.ShortName) - } - - if len(opt.LongName) != 0 { - if opt.ShortName != 0 { - fmt.Fprintf(wr, ", ") - } - - fmt.Fprintf(wr, "--%s", opt.LongNameWithNamespace()) - } - - fmt.Fprintln(wr, "\\fP") - if len(opt.Description) != 0 { - formatForMan(wr, opt.Description) - fmt.Fprintln(wr, "") - } - } - }) -} - -func writeManPageSubcommands(wr io.Writer, name string, root *Command) { - commands := root.sortedCommands() - - for _, c := range commands { - var nn string - - if len(name) != 0 { - nn = name + " " + c.Name - } else { - nn = c.Name - } - - writeManPageCommand(wr, nn, c) - } -} - -func writeManPageCommand(wr io.Writer, name string, command *Command) { - fmt.Fprintf(wr, ".SS %s\n", name) - fmt.Fprintln(wr, command.ShortDescription) - - if len(command.LongDescription) > 0 { - fmt.Fprintln(wr, "") - - cmdstart := fmt.Sprintf("The %s command", command.Name) - - if strings.HasPrefix(command.LongDescription, cmdstart) { - fmt.Fprintf(wr, "The \\fI%s\\fP command", command.Name) - - formatForMan(wr, command.LongDescription[len(cmdstart):]) - fmt.Fprintln(wr, "") - } else { - formatForMan(wr, command.LongDescription) - fmt.Fprintln(wr, "") - } - } - - if len(command.Aliases) > 0 { - fmt.Fprintf(wr, "\n\\fBAliases\\fP: %s\n\n", strings.Join(command.Aliases, ", ")) - } - - writeManPageOptions(wr, command.Group) - writeManPageSubcommands(wr, name, command) -} - -// WriteManPage writes a basic man page in groff format to the specified -// writer. -func (p *Parser) WriteManPage(wr io.Writer) { - t := time.Now() - - fmt.Fprintf(wr, ".TH %s 1 \"%s\"\n", p.Name, t.Format("2 January 2006")) - fmt.Fprintln(wr, ".SH NAME") - fmt.Fprintf(wr, "%s \\- %s\n", p.Name, p.ShortDescription) - fmt.Fprintln(wr, ".SH SYNOPSIS") - - usage := p.Usage - - if len(usage) == 0 { - usage = "[OPTIONS]" - } - - fmt.Fprintf(wr, "\\fB%s\\fP %s\n", p.Name, usage) - fmt.Fprintln(wr, ".SH DESCRIPTION") - - formatForMan(wr, p.LongDescription) - fmt.Fprintln(wr, "") - - fmt.Fprintln(wr, ".SH OPTIONS") - - writeManPageOptions(wr, p.Command.Group) - - if len(p.commands) > 0 { - fmt.Fprintln(wr, ".SH COMMANDS") - - writeManPageSubcommands(wr, "", p.Command) - } -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/marshal_test.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/marshal_test.go deleted file mode 100644 index 59c9cce..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/marshal_test.go +++ /dev/null @@ -1,97 +0,0 @@ -package flags - -import ( - "fmt" - "testing" -) - -type marshalled bool - -func (m *marshalled) UnmarshalFlag(value string) error { - if value == "yes" { - *m = true - } else if value == "no" { - *m = false - } else { - return fmt.Errorf("`%s' is not a valid value, please specify `yes' or `no'", value) - } - - return nil -} - -func (m marshalled) MarshalFlag() (string, error) { - if m { - return "yes", nil - } - - return "no", nil -} - -type marshalledError bool - -func (m marshalledError) MarshalFlag() (string, error) { - return "", newErrorf(ErrMarshal, "Failed to marshal") -} - -func TestUnmarshal(t *testing.T) { - var opts = struct { - Value marshalled `short:"v"` - }{} - - ret := assertParseSuccess(t, &opts, "-v=yes") - - assertStringArray(t, ret, []string{}) - - if !opts.Value { - t.Errorf("Expected Value to be true") - } -} - -func TestUnmarshalDefault(t *testing.T) { - var opts = struct { - Value marshalled `short:"v" default:"yes"` - }{} - - ret := assertParseSuccess(t, &opts) - - assertStringArray(t, ret, []string{}) - - if !opts.Value { - t.Errorf("Expected Value to be true") - } -} - -func TestUnmarshalOptional(t *testing.T) { - var opts = struct { - Value marshalled `short:"v" optional:"yes" optional-value:"yes"` - }{} - - ret := assertParseSuccess(t, &opts, "-v") - - assertStringArray(t, ret, []string{}) - - if !opts.Value { - t.Errorf("Expected Value to be true") - } -} - -func TestUnmarshalError(t *testing.T) { - var opts = struct { - Value marshalled `short:"v"` - }{} - - assertParseFail(t, ErrMarshal, fmt.Sprintf("invalid argument for flag `%cv' (expected flags.marshalled): `invalid' is not a valid value, please specify `yes' or `no'", defaultShortOptDelimiter), &opts, "-vinvalid") -} - -func TestMarshalError(t *testing.T) { - var opts = struct { - Value marshalledError `short:"v"` - }{} - - p := NewParser(&opts, Default) - o := p.Command.Groups()[0].Options()[0] - - _, err := convertToString(o.value, o.tag) - - assertError(t, err, ErrMarshal, "Failed to marshal") -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/multitag.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/multitag.go deleted file mode 100644 index 96bb1a3..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/multitag.go +++ /dev/null @@ -1,140 +0,0 @@ -package flags - -import ( - "strconv" -) - -type multiTag struct { - value string - cache map[string][]string -} - -func newMultiTag(v string) multiTag { - return multiTag{ - value: v, - } -} - -func (x *multiTag) scan() (map[string][]string, error) { - v := x.value - - ret := make(map[string][]string) - - // This is mostly copied from reflect.StructTag.Get - for v != "" { - i := 0 - - // Skip whitespace - for i < len(v) && v[i] == ' ' { - i++ - } - - v = v[i:] - - if v == "" { - break - } - - // Scan to colon to find key - i = 0 - - for i < len(v) && v[i] != ' ' && v[i] != ':' && v[i] != '"' { - i++ - } - - if i >= len(v) { - return nil, newErrorf(ErrTag, "expected `:' after key name, but got end of tag (in `%v`)", x.value) - } - - if v[i] != ':' { - return nil, newErrorf(ErrTag, "expected `:' after key name, but got `%v' (in `%v`)", v[i], x.value) - } - - if i+1 >= len(v) { - return nil, newErrorf(ErrTag, "expected `\"' to start tag value at end of tag (in `%v`)", x.value) - } - - if v[i+1] != '"' { - return nil, newErrorf(ErrTag, "expected `\"' to start tag value, but got `%v' (in `%v`)", v[i+1], x.value) - } - - name := v[:i] - v = v[i+1:] - - // Scan quoted string to find value - i = 1 - - for i < len(v) && v[i] != '"' { - if v[i] == '\n' { - return nil, newErrorf(ErrTag, "unexpected newline in tag value `%v' (in `%v`)", name, x.value) - } - - if v[i] == '\\' { - i++ - } - i++ - } - - if i >= len(v) { - return nil, newErrorf(ErrTag, "expected end of tag value `\"' at end of tag (in `%v`)", x.value) - } - - val, err := strconv.Unquote(v[:i+1]) - - if err != nil { - return nil, newErrorf(ErrTag, "Malformed value of tag `%v:%v` => %v (in `%v`)", name, v[:i+1], err, x.value) - } - - v = v[i+1:] - - ret[name] = append(ret[name], val) - } - - return ret, nil -} - -func (x *multiTag) Parse() error { - vals, err := x.scan() - x.cache = vals - - return err -} - -func (x *multiTag) cached() map[string][]string { - if x.cache == nil { - cache, _ := x.scan() - - if cache == nil { - cache = make(map[string][]string) - } - - x.cache = cache - } - - return x.cache -} - -func (x *multiTag) Get(key string) string { - c := x.cached() - - if v, ok := c[key]; ok { - return v[len(v)-1] - } - - return "" -} - -func (x *multiTag) GetMany(key string) []string { - c := x.cached() - return c[key] -} - -func (x *multiTag) Set(key string, value string) { - c := x.cached() - c[key] = []string{value} -} - -func (x *multiTag) SetMany(key string, value []string) { - c := x.cached() - c[key] = value -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/option.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/option.go deleted file mode 100644 index 325d9c8..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/option.go +++ /dev/null @@ -1,149 +0,0 @@ -package flags - -import ( - "fmt" - "reflect" - "unicode/utf8" -) - -// Option flag information. Contains a description of the option, short and -// long name as well as a default value and whether an argument for this -// flag is optional. -type Option struct { - // The description of the option flag. This description is shown - // automatically in the built-in help. - Description string - - // The short name of the option (a single character). If not 0, the - // option flag can be 'activated' using -. Either ShortName - // or LongName needs to be non-empty. - ShortName rune - - // The long name of the option. If not "", the option flag can be - // activated using --. Either ShortName or LongName needs - // to be non-empty. - LongName string - - // The default value of the option. - Default []string - - // If true, specifies that the argument to an option flag is optional. - // When no argument to the flag is specified on the command line, the - // value of Default will be set in the field this option represents. - // This is only valid for non-boolean options. - OptionalArgument bool - - // The optional value of the option. The optional value is used when - // the option flag is marked as having an OptionalArgument. This means - // that when the flag is specified, but no option argument is given, - // the value of the field this option represents will be set to - // OptionalValue. This is only valid for non-boolean options. - OptionalValue []string - - // If true, the option _must_ be specified on the command line. If the - // option is not specified, the parser will generate an ErrRequired type - // error. - Required bool - - // A name for the value of an option shown in the Help as --flag [ValueName] - ValueName string - - // A mask value to show in the help instead of the default value. This - // is useful for hiding sensitive information in the help, such as - // passwords. - DefaultMask string - - // The group which the option belongs to - group *Group - - // The struct field which the option represents. - field reflect.StructField - - // The struct field value which the option represents. - value reflect.Value - - iniUsedName string - tag multiTag - isSet bool -} - -// LongNameWithNamespace returns the option's long name with the group namespaces -// prepended by walking up the option's group tree. Namespaces and the long name -// itself are separated by the parser's namespace delimiter. If the long name is -// empty an empty string is returned. -func (option *Option) LongNameWithNamespace() string { - if len(option.LongName) == 0 { - return "" - } - - // fetch the namespace delimiter from the parser which is always at the - // end of the group hierarchy - namespaceDelimiter := "" - g := option.group - - for { - if p, ok := g.parent.(*Parser); ok { - namespaceDelimiter = p.NamespaceDelimiter - - break - } - - switch i := g.parent.(type) { - case *Command: - g = i.Group - case *Group: - g = i - } - } - - // concatenate long name with namespace - longName := option.LongName - g = option.group - - for g != nil { - if g.Namespace != "" { - longName = g.Namespace + namespaceDelimiter + longName - } - - switch i := g.parent.(type) { - case *Command: - g = i.Group - case *Group: - g = i - case *Parser: - g = nil - } - } - - return longName -} - -// String converts an option to a human friendly readable string describing the -// option. -func (option *Option) String() string { - var s string - var short string - - if option.ShortName != 0 { - data := make([]byte, utf8.RuneLen(option.ShortName)) - utf8.EncodeRune(data, option.ShortName) - short = string(data) - - if len(option.LongName) != 0 { - s = fmt.Sprintf("%s%s, %s%s", - string(defaultShortOptDelimiter), short, - defaultLongOptDelimiter, option.LongNameWithNamespace()) - } else { - s = fmt.Sprintf("%s%s", string(defaultShortOptDelimiter), short) - } - } else if len(option.LongName) != 0 { - s = fmt.Sprintf("%s%s", defaultLongOptDelimiter, option.LongNameWithNamespace()) - } - - return s -} - -// Value returns the option value as an interface{}. -func (option *Option) Value() interface{} { - return option.value.Interface() -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/option_private.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/option_private.go deleted file mode 100644 index 6801885..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/option_private.go +++ /dev/null @@ -1,164 +0,0 @@ -package flags - -import ( - "reflect" -) - -// Set the value of an option to the specified value. An error will be returned -// if the specified value could not be converted to the corresponding option -// value type. -func (option *Option) set(value *string) error { - option.isSet = true - - if option.isFunc() { - return option.call(value) - } else if value != nil { - return convert(*value, option.value, option.tag) - } - - return convert("", option.value, option.tag) -} - -func (option *Option) canCli() bool { - return option.ShortName != 0 || len(option.LongName) != 0 -} - -func (option *Option) canArgument() bool { - if u := option.isUnmarshaler(); u != nil { - return true - } - - return !option.isBool() -} - -func (option *Option) emptyValue() reflect.Value { - tp := option.value.Type() - - if tp.Kind() == reflect.Map { - return reflect.MakeMap(tp) - } - - return reflect.Zero(tp) -} - -func (option *Option) empty() { - option.value.Set(option.emptyValue()) -} - -func (option *Option) clearDefault() { - if len(option.Default) > 0 { - option.empty() - - for _, d := range option.Default { - option.set(&d) - } - } else { - tp := option.value.Type() - - switch tp.Kind() { - case reflect.Map: - if option.value.IsNil() { - option.empty() - } - case reflect.Slice: - if option.value.IsNil() { - option.empty() - } - } - } -} - -func (option *Option) valueIsDefault() bool { - // Check if the value of the option corresponds to its - // default value - emptyval := option.emptyValue() - - checkvalptr := reflect.New(emptyval.Type()) - checkval := reflect.Indirect(checkvalptr) - - checkval.Set(emptyval) - - if len(option.Default) != 0 { - for _, v := range option.Default { - convert(v, checkval, option.tag) - } - } - - return reflect.DeepEqual(option.value.Interface(), checkval.Interface()) -} - -func (option *Option) isUnmarshaler() Unmarshaler { - v := option.value - - for { - if !v.CanInterface() { - break - } - - i := v.Interface() - - if u, ok := i.(Unmarshaler); ok { - return u - } - - if !v.CanAddr() { - break - } - - v = v.Addr() - } - - return nil -} - -func (option *Option) isBool() bool { - tp := option.value.Type() - - for { - switch tp.Kind() { - case reflect.Bool: - return true - case reflect.Slice: - return (tp.Elem().Kind() == reflect.Bool) - case reflect.Func: - return tp.NumIn() == 0 - case reflect.Ptr: - tp = tp.Elem() - default: - return false - } - } -} - -func (option *Option) isFunc() bool { - return option.value.Type().Kind() == reflect.Func -} - -func (option *Option) call(value *string) error { - var retval []reflect.Value - - if value == nil { - retval = option.value.Call(nil) - } else { - tp := option.value.Type().In(0) - - val := reflect.New(tp) - val = reflect.Indirect(val) - - if err := convert(*value, val, option.tag); err != nil { - return err - } - - retval = option.value.Call([]reflect.Value{val}) - } - - if len(retval) == 1 && retval[0].Type() == reflect.TypeOf((*error)(nil)).Elem() { - if retval[0].Interface() == nil { - return nil - } - - return retval[0].Interface().(error) - } - - return nil -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/options_test.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/options_test.go deleted file mode 100644 index b0fe9f4..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/options_test.go +++ /dev/null @@ -1,45 +0,0 @@ -package flags - -import ( - "testing" -) - -func TestPassDoubleDash(t *testing.T) { - var opts = struct { - Value bool `short:"v"` - }{} - - p := NewParser(&opts, PassDoubleDash) - ret, err := p.ParseArgs([]string{"-v", "--", "-v", "-g"}) - - if err != nil { - t.Fatalf("Unexpected error: %v", err) - return - } - - if !opts.Value { - t.Errorf("Expected Value to be true") - } - - assertStringArray(t, ret, []string{"-v", "-g"}) -} - -func TestPassAfterNonOption(t *testing.T) { - var opts = struct { - Value bool `short:"v"` - }{} - - p := NewParser(&opts, PassAfterNonOption) - ret, err := p.ParseArgs([]string{"-v", "arg", "-v", "-g"}) - - if err != nil { - t.Fatalf("Unexpected error: %v", err) - return - } - - if !opts.Value { - t.Errorf("Expected Value to be true") - } - - assertStringArray(t, ret, []string{"arg", "-v", "-g"}) -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/optstyle_other.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/optstyle_other.go deleted file mode 100644 index 794de23..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/optstyle_other.go +++ /dev/null @@ -1,55 +0,0 @@ -// +build !windows - -package flags - -import ( - "strings" -) - -const ( - defaultShortOptDelimiter = '-' - defaultLongOptDelimiter = "--" - defaultNameArgDelimiter = '=' -) - -func argumentIsOption(arg string) bool { - return len(arg) > 0 && arg[0] == '-' -} - -// stripOptionPrefix returns the option without the prefix and whether or -// not the option is a long option or not. -func stripOptionPrefix(optname string) (prefix string, name string, islong bool) { - if strings.HasPrefix(optname, "--") { - return "--", optname[2:], true - } else if strings.HasPrefix(optname, "-") { - return "-", optname[1:], false - } - - return "", optname, false -} - -// splitOption attempts to split the passed option into a name and an argument. -// When there is no argument specified, nil will be returned for it. -func splitOption(prefix string, option string, islong bool) (string, string, *string) { - pos := strings.Index(option, "=") - - if (islong && pos >= 0) || (!islong && pos == 1) { - rest := option[pos+1:] - return option[:pos], "=", &rest - } - - return option, "", nil -} - -// addHelpGroup adds a new group that contains default help parameters. -func (c *Command) addHelpGroup(showHelp func() error) *Group { - var help struct { - ShowHelp func() error `short:"h" long:"help" description:"Show this help message"` - } - - help.ShowHelp = showHelp - ret, _ := c.AddGroup("Help Options", "", &help) - ret.isBuiltinHelp = true - - return ret -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/optstyle_windows.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/optstyle_windows.go deleted file mode 100644 index 096bbff..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/optstyle_windows.go +++ /dev/null @@ -1,90 +0,0 @@ -package flags - -import ( - "strings" -) - -// Windows uses a front slash for both short and long options. Also it uses -// a colon for name/argument delimter. -const ( - defaultShortOptDelimiter = '/' - defaultLongOptDelimiter = "/" - defaultNameArgDelimiter = ':' -) - -func argumentIsOption(arg string) bool { - // Windows-style options allow front slash for the option - // delimiter. - return len(arg) > 0 && (arg[0] == '-' || arg[0] == '/') -} - -// stripOptionPrefix returns the option without the prefix and whether or -// not the option is a long option or not. -func stripOptionPrefix(optname string) (prefix string, name string, islong bool) { - // Determine if the argument is a long option or not. Windows - // typically supports both long and short options with a single - // front slash as the option delimiter, so handle this situation - // nicely. - possplit := 0 - - if strings.HasPrefix(optname, "--") { - possplit = 2 - islong = true - } else if strings.HasPrefix(optname, "-") { - possplit = 1 - islong = false - } else if strings.HasPrefix(optname, "/") { - possplit = 1 - islong = len(optname) > 2 - } - - return optname[:possplit], optname[possplit:], islong -} - -// splitOption attempts to split the passed option into a name and an argument. -// When there is no argument specified, nil will be returned for it. -func splitOption(prefix string, option string, islong bool) (string, string, *string) { - if len(option) == 0 { - return option, "", nil - } - - // Windows typically uses a colon for the option name and argument - // delimiter while POSIX typically uses an equals. Support both styles, - // but don't allow the two to be mixed. That is to say /foo:bar and - // --foo=bar are acceptable, but /foo=bar and --foo:bar are not. - var pos int - var sp string - - if prefix == "/" { - sp = ":" - pos = strings.Index(option, sp) - } else if len(prefix) > 0 { - sp = "=" - pos = strings.Index(option, sp) - } - - if (islong && pos >= 0) || (!islong && pos == 1) { - rest := option[pos+1:] - return option[:pos], sp, &rest - } - - return option, "", nil -} - -// addHelpGroup adds a new group that contains default help parameters. -func (c *Command) addHelpGroup(showHelp func() error) *Group { - // Windows CLI applications typically use /? for help, so make both - // that available as well as the POSIX style h and help. - var help struct { - ShowHelpWindows func() error `short:"?" description:"Show this help message"` - ShowHelpPosix func() error `short:"h" long:"help" description:"Show this help message"` - } - - help.ShowHelpWindows = showHelp - help.ShowHelpPosix = showHelp - - ret, _ := c.AddGroup("Help Options", "", &help) - ret.isBuiltinHelp = true - - return ret -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/parser.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/parser.go deleted file mode 100644 index 2664f24..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/parser.go +++ /dev/null @@ -1,239 +0,0 @@ -// Copyright 2012 Jesse van den Kieboom. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package flags - -import ( - "os" - "path" -) - -// A Parser provides command line option parsing. It can contain several -// option groups each with their own set of options. -type Parser struct { - // Embedded, see Command for more information - *Command - - // A usage string to be displayed in the help message. - Usage string - - // Option flags changing the behavior of the parser. - Options Options - - // NamespaceDelimiter separates group namespaces and option long names - NamespaceDelimiter string - - internalError error -} - -// Options provides parser options that change the behavior of the option -// parser. -type Options uint - -const ( - // None indicates no options. - None Options = 0 - - // HelpFlag adds a default Help Options group to the parser containing - // -h and --help options. When either -h or --help is specified on the - // command line, the parser will return the special error of type - // ErrHelp. When PrintErrors is also specified, then the help message - // will also be automatically printed to os.Stderr. - HelpFlag = 1 << iota - - // PassDoubleDash passes all arguments after a double dash, --, as - // remaining command line arguments (i.e. they will not be parsed for - // flags). - PassDoubleDash - - // IgnoreUnknown ignores any unknown options and passes them as - // remaining command line arguments instead of generating an error. - IgnoreUnknown - - // PrintErrors prints any errors which occurred during parsing to - // os.Stderr. - PrintErrors - - // PassAfterNonOption passes all arguments after the first non option - // as remaining command line arguments. This is equivalent to strict - // POSIX processing. - PassAfterNonOption - - // Default is a convenient default set of options which should cover - // most of the uses of the flags package. - Default = HelpFlag | PrintErrors | PassDoubleDash -) - -// Parse is a convenience function to parse command line options with default -// settings. The provided data is a pointer to a struct representing the -// default option group (named "Application Options"). For more control, use -// flags.NewParser. -func Parse(data interface{}) ([]string, error) { - return NewParser(data, Default).Parse() -} - -// ParseArgs is a convenience function to parse command line options with default -// settings. The provided data is a pointer to a struct representing the -// default option group (named "Application Options"). The args argument is -// the list of command line arguments to parse. If you just want to parse the -// default program command line arguments (i.e. os.Args), then use flags.Parse -// instead. For more control, use flags.NewParser. -func ParseArgs(data interface{}, args []string) ([]string, error) { - return NewParser(data, Default).ParseArgs(args) -} - -// NewParser creates a new parser. It uses os.Args[0] as the application -// name and then calls Parser.NewNamedParser (see Parser.NewNamedParser for -// more details). The provided data is a pointer to a struct representing the -// default option group (named "Application Options"), or nil if the default -// group should not be added. The options parameter specifies a set of options -// for the parser. -func NewParser(data interface{}, options Options) *Parser { - p := NewNamedParser(path.Base(os.Args[0]), options) - - if data != nil { - g, err := p.AddGroup("Application Options", "", data) - - if err == nil { - g.parent = p - } - - p.internalError = err - } - - return p -} - -// NewNamedParser creates a new parser. The appname is used to display the -// executable name in the built-in help message. Option groups and commands can -// be added to this parser by using AddGroup and AddCommand. -func NewNamedParser(appname string, options Options) *Parser { - p := &Parser{ - Command: newCommand(appname, "", "", nil), - Options: options, - NamespaceDelimiter: ".", - } - - p.Command.parent = p - - if len(os.Getenv("GO_FLAGS_COMPLETION")) != 0 { - p.AddCommand("__complete", "completion", "automatic flags completion", &completion{parser: p}) - } - - return p -} - -// Parse parses the command line arguments from os.Args using Parser.ParseArgs. -// For more detailed information see ParseArgs. -func (p *Parser) Parse() ([]string, error) { - return p.ParseArgs(os.Args[1:]) -} - -// ParseArgs parses the command line arguments according to the option groups that -// were added to the parser. On successful parsing of the arguments, the -// remaining, non-option, arguments (if any) are returned. The returned error -// indicates a parsing error and can be used with PrintError to display -// contextual information on where the error occurred exactly. -// -// When the common help group has been added (AddHelp) and either -h or --help -// was specified in the command line arguments, a help message will be -// automatically printed. Furthermore, the special error type ErrHelp is returned. -// It is up to the caller to exit the program if so desired. -func (p *Parser) ParseArgs(args []string) ([]string, error) { - if p.internalError != nil { - return nil, p.internalError - } - - p.clearIsSet() - - // Add built-in help group to all commands if necessary - if (p.Options & HelpFlag) != None { - p.addHelpGroups(p.showBuiltinHelp) - } - - s := &parseState{ - args: args, - retargs: make([]string, 0, len(args)), - } - - p.fillParseState(s) - - for !s.eof() { - arg := s.pop() - - // When PassDoubleDash is set and we encounter a --, then - // simply append all the rest as arguments and break out - if (p.Options&PassDoubleDash) != None && arg == "--" { - s.addArgs(s.args...) - break - } - - if !argumentIsOption(arg) { - // Note: this also sets s.err, so we can just check for - // nil here and use s.err later - if p.parseNonOption(s) != nil { - break - } - - continue - } - - var err error - - prefix, optname, islong := stripOptionPrefix(arg) - optname, _, argument := splitOption(prefix, optname, islong) - - if islong { - err = p.parseLong(s, optname, argument) - } else { - err = p.parseShort(s, optname, argument) - } - - if err != nil { - ignoreUnknown := (p.Options & IgnoreUnknown) != None - parseErr := wrapError(err) - - if !(parseErr.Type == ErrUnknownFlag && ignoreUnknown) { - s.err = parseErr - break - } - - if ignoreUnknown { - s.addArgs(arg) - } - } - } - - if s.err == nil { - p.eachCommand(func(c *Command) { - c.eachGroup(func(g *Group) { - for _, option := range g.options { - if option.isSet { - continue - } - - option.clearDefault() - } - }) - }, true) - - s.checkRequired(p) - } - - var reterr error - - if s.err != nil { - reterr = p.printError(s.err) - } else if len(s.command.commands) != 0 && !s.command.SubcommandsOptional { - reterr = p.printError(s.estimateCommand()) - } else if cmd, ok := s.command.data.(Commander); ok { - reterr = p.printError(cmd.Execute(s.retargs)) - } - - if reterr != nil { - return append([]string{s.arg}, s.args...), reterr - } - - return s.retargs, nil -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/parser_private.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/parser_private.go deleted file mode 100644 index 4ebce4f..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/parser_private.go +++ /dev/null @@ -1,327 +0,0 @@ -package flags - -import ( - "bytes" - "fmt" - "os" - "sort" - "strings" - "unicode/utf8" -) - -type parseState struct { - arg string - args []string - retargs []string - positional []*Arg - err error - - command *Command - lookup lookup -} - -func (p *parseState) eof() bool { - return len(p.args) == 0 -} - -func (p *parseState) pop() string { - if p.eof() { - return "" - } - - p.arg = p.args[0] - p.args = p.args[1:] - - return p.arg -} - -func (p *parseState) peek() string { - if p.eof() { - return "" - } - - return p.args[0] -} - -func (p *parseState) checkRequired(parser *Parser) error { - c := parser.Command - - required := make([]*Option, 0) - - for c != nil { - c.eachGroup(func(g *Group) { - for _, option := range g.options { - if !option.isSet && option.Required { - required = append(required, option) - } - } - }) - - c = c.Active - } - - if len(required) == 0 { - if len(p.positional) > 0 && p.command.ArgsRequired { - reqnames := make([]string, 0) - - for _, arg := range p.positional { - if arg.isRemaining() { - break - } - - reqnames = append(reqnames, "`"+arg.Name+"`") - } - - if len(reqnames) == 0 { - return nil - } - - var msg string - - if len(reqnames) == 1 { - msg = fmt.Sprintf("the required argument %s was not provided", reqnames[0]) - } else { - msg = fmt.Sprintf("the required arguments %s and %s were not provided", - strings.Join(reqnames[:len(reqnames)-1], ", "), reqnames[len(reqnames)-1]) - } - - p.err = newError(ErrRequired, msg) - return p.err - } - - return nil - } - - names := make([]string, 0, len(required)) - - for _, k := range required { - names = append(names, "`"+k.String()+"'") - } - - sort.Strings(names) - - var msg string - - if len(names) == 1 { - msg = fmt.Sprintf("the required flag %s was not specified", names[0]) - } else { - msg = fmt.Sprintf("the required flags %s and %s were not specified", - strings.Join(names[:len(names)-1], ", "), names[len(names)-1]) - } - - p.err = newError(ErrRequired, msg) - return p.err -} - -func (p *parseState) estimateCommand() error { - commands := p.command.sortedCommands() - cmdnames := make([]string, len(commands)) - - for i, v := range commands { - cmdnames[i] = v.Name - } - - var msg string - var errtype ErrorType - - if len(p.retargs) != 0 { - c, l := closestChoice(p.retargs[0], cmdnames) - msg = fmt.Sprintf("Unknown command `%s'", p.retargs[0]) - errtype = ErrUnknownCommand - - if float32(l)/float32(len(c)) < 0.5 { - msg = fmt.Sprintf("%s, did you mean `%s'?", msg, c) - } else if len(cmdnames) == 1 { - msg = fmt.Sprintf("%s. You should use the %s command", - msg, - cmdnames[0]) - } else { - msg = fmt.Sprintf("%s. Please specify one command of: %s or %s", - msg, - strings.Join(cmdnames[:len(cmdnames)-1], ", "), - cmdnames[len(cmdnames)-1]) - } - } else { - errtype = ErrCommandRequired - - if len(cmdnames) == 1 { - msg = fmt.Sprintf("Please specify the %s command", cmdnames[0]) - } else { - msg = fmt.Sprintf("Please specify one command of: %s or %s", - strings.Join(cmdnames[:len(cmdnames)-1], ", "), - cmdnames[len(cmdnames)-1]) - } - } - - return newError(errtype, msg) -} - -func (p *Parser) parseOption(s *parseState, name string, option *Option, canarg bool, argument *string) (err error) { - if !option.canArgument() { - if argument != nil { - msg := fmt.Sprintf("bool flag `%s' cannot have an argument", option) - return newError(ErrNoArgumentForBool, msg) - } - - err = option.set(nil) - } else if argument != nil { - err = option.set(argument) - } else if canarg && !s.eof() { - arg := s.pop() - err = option.set(&arg) - } else if option.OptionalArgument { - option.empty() - - for _, v := range option.OptionalValue { - err = option.set(&v) - - if err != nil { - break - } - } - } else { - msg := fmt.Sprintf("expected argument for flag `%s'", option) - err = newError(ErrExpectedArgument, msg) - } - - if err != nil { - if _, ok := err.(*Error); !ok { - msg := fmt.Sprintf("invalid argument for flag `%s' (expected %s): %s", - option, - option.value.Type(), - err.Error()) - - err = newError(ErrMarshal, msg) - } - } - - return err -} - -func (p *Parser) parseLong(s *parseState, name string, argument *string) error { - if option := s.lookup.longNames[name]; option != nil { - // Only long options that are required can consume an argument - // from the argument list - canarg := !option.OptionalArgument - - return p.parseOption(s, name, option, canarg, argument) - } - - return newError(ErrUnknownFlag, fmt.Sprintf("unknown flag `%s'", name)) -} - -func (p *Parser) splitShortConcatArg(s *parseState, optname string) (string, *string) { - c, n := utf8.DecodeRuneInString(optname) - - if n == len(optname) { - return optname, nil - } - - first := string(c) - - if option := s.lookup.shortNames[first]; option != nil && option.canArgument() { - arg := optname[n:] - return first, &arg - } - - return optname, nil -} - -func (p *Parser) parseShort(s *parseState, optname string, argument *string) error { - if argument == nil { - optname, argument = p.splitShortConcatArg(s, optname) - } - - for i, c := range optname { - shortname := string(c) - - if option := s.lookup.shortNames[shortname]; option != nil { - // Only the last short argument can consume an argument from - // the arguments list, and only if it's non optional - canarg := (i+utf8.RuneLen(c) == len(optname)) && !option.OptionalArgument - - if err := p.parseOption(s, shortname, option, canarg, argument); err != nil { - return err - } - } else { - return newError(ErrUnknownFlag, fmt.Sprintf("unknown flag `%s'", shortname)) - } - - // Only the first option can have a concatted argument, so just - // clear argument here - argument = nil - } - - return nil -} - -func (s *parseState) addArgs(args ...string) error { - for len(s.positional) > 0 && len(args) > 0 { - arg := s.positional[0] - - if err := convert(args[0], arg.value, arg.tag); err != nil { - return err - } - - if !arg.isRemaining() { - s.positional = s.positional[1:] - } - - args = args[1:] - } - - s.retargs = append(s.retargs, args...) - return nil -} - -func (p *Parser) parseNonOption(s *parseState) error { - if len(s.positional) > 0 { - return s.addArgs(s.arg) - } - - if cmd := s.lookup.commands[s.arg]; cmd != nil { - s.command.Active = cmd - cmd.fillParseState(s) - } else if (p.Options & PassAfterNonOption) != None { - // If PassAfterNonOption is set then all remaining arguments - // are considered positional - if err := s.addArgs(s.arg); err != nil { - return err - } - - if err := s.addArgs(s.args...); err != nil { - return err - } - - s.args = []string{} - } else { - return s.addArgs(s.arg) - } - - return nil -} - -func (p *Parser) showBuiltinHelp() error { - var b bytes.Buffer - - p.WriteHelp(&b) - return newError(ErrHelp, b.String()) -} - -func (p *Parser) printError(err error) error { - if err != nil && (p.Options&PrintErrors) != None { - fmt.Fprintln(os.Stderr, err) - } - - return err -} - -func (p *Parser) clearIsSet() { - p.eachCommand(func(c *Command) { - c.eachGroup(func(g *Group) { - for _, option := range g.options { - option.isSet = false - } - }) - }, true) -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/parser_test.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/parser_test.go deleted file mode 100644 index b227244..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/parser_test.go +++ /dev/null @@ -1,98 +0,0 @@ -package flags - -import ( - "reflect" - "testing" - "time" -) - -type defaultOptions struct { - Int int `long:"i"` - IntDefault int `long:"id" default:"1"` - - Time time.Duration `long:"t"` - TimeDefault time.Duration `long:"td" default:"1m"` - - Map map[string]int `long:"m"` - MapDefault map[string]int `long:"md" default:"a:1"` - - Slice []int `long:"s"` - SliceDefault []int `long:"sd" default:"1" default:"2"` -} - -func TestDefaults(t *testing.T) { - var tests = []struct { - msg string - args []string - expected defaultOptions - }{ - { - msg: "no arguments, expecting default values", - args: []string{}, - expected: defaultOptions{ - Int: 0, - IntDefault: 1, - - Time: 0, - TimeDefault: time.Minute, - - Map: map[string]int{}, - MapDefault: map[string]int{"a": 1}, - - Slice: []int{}, - SliceDefault: []int{1, 2}, - }, - }, - { - msg: "non-zero value arguments, expecting overwritten arguments", - args: []string{"--i=3", "--id=3", "--t=3ms", "--td=3ms", "--m=c:3", "--md=c:3", "--s=3", "--sd=3"}, - expected: defaultOptions{ - Int: 3, - IntDefault: 3, - - Time: 3 * time.Millisecond, - TimeDefault: 3 * time.Millisecond, - - Map: map[string]int{"c": 3}, - MapDefault: map[string]int{"c": 3}, - - Slice: []int{3}, - SliceDefault: []int{3}, - }, - }, - { - msg: "zero value arguments, expecting overwritten arguments", - args: []string{"--i=0", "--id=0", "--t=0ms", "--td=0s", "--m=:0", "--md=:0", "--s=0", "--sd=0"}, - expected: defaultOptions{ - Int: 0, - IntDefault: 0, - - Time: 0, - TimeDefault: 0, - - Map: map[string]int{"": 0}, - MapDefault: map[string]int{"": 0}, - - Slice: []int{0}, - SliceDefault: []int{0}, - }, - }, - } - - for _, test := range tests { - var opts defaultOptions - - _, err := ParseArgs(&opts, test.args) - if err != nil { - t.Fatalf("%s:\nUnexpected error: %v", test.msg, err) - } - - if opts.Slice == nil { - opts.Slice = []int{} - } - - if !reflect.DeepEqual(opts, test.expected) { - t.Errorf("%s:\nUnexpected options with arguments %+v\nexpected\n%+v\nbut got\n%+v\n", test.msg, test.args, test.expected, opts) - } - } -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/pointer_test.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/pointer_test.go deleted file mode 100644 index e17445f..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/pointer_test.go +++ /dev/null @@ -1,81 +0,0 @@ -package flags - -import ( - "testing" -) - -func TestPointerBool(t *testing.T) { - var opts = struct { - Value *bool `short:"v"` - }{} - - ret := assertParseSuccess(t, &opts, "-v") - - assertStringArray(t, ret, []string{}) - - if !*opts.Value { - t.Errorf("Expected Value to be true") - } -} - -func TestPointerString(t *testing.T) { - var opts = struct { - Value *string `short:"v"` - }{} - - ret := assertParseSuccess(t, &opts, "-v", "value") - - assertStringArray(t, ret, []string{}) - assertString(t, *opts.Value, "value") -} - -func TestPointerSlice(t *testing.T) { - var opts = struct { - Value *[]string `short:"v"` - }{} - - ret := assertParseSuccess(t, &opts, "-v", "value1", "-v", "value2") - - assertStringArray(t, ret, []string{}) - assertStringArray(t, *opts.Value, []string{"value1", "value2"}) -} - -func TestPointerMap(t *testing.T) { - var opts = struct { - Value *map[string]int `short:"v"` - }{} - - ret := assertParseSuccess(t, &opts, "-v", "k1:2", "-v", "k2:-5") - - assertStringArray(t, ret, []string{}) - - if v, ok := (*opts.Value)["k1"]; !ok { - t.Errorf("Expected key \"k1\" to exist") - } else if v != 2 { - t.Errorf("Expected \"k1\" to be 2, but got %#v", v) - } - - if v, ok := (*opts.Value)["k2"]; !ok { - t.Errorf("Expected key \"k2\" to exist") - } else if v != -5 { - t.Errorf("Expected \"k2\" to be -5, but got %#v", v) - } -} - -type PointerGroup struct { - Value bool `short:"v"` -} - -func TestPointerGroup(t *testing.T) { - var opts = struct { - Group *PointerGroup `group:"Group Options"` - }{} - - ret := assertParseSuccess(t, &opts, "-v") - - assertStringArray(t, ret, []string{}) - - if !opts.Group.Value { - t.Errorf("Expected Group.Value to be true") - } -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/short_test.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/short_test.go deleted file mode 100644 index 95712c1..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/short_test.go +++ /dev/null @@ -1,194 +0,0 @@ -package flags - -import ( - "fmt" - "testing" -) - -func TestShort(t *testing.T) { - var opts = struct { - Value bool `short:"v"` - }{} - - ret := assertParseSuccess(t, &opts, "-v") - - assertStringArray(t, ret, []string{}) - - if !opts.Value { - t.Errorf("Expected Value to be true") - } -} - -func TestShortTooLong(t *testing.T) { - var opts = struct { - Value bool `short:"vv"` - }{} - - assertParseFail(t, ErrShortNameTooLong, "short names can only be 1 character long, not `vv'", &opts) -} - -func TestShortRequired(t *testing.T) { - var opts = struct { - Value bool `short:"v" required:"true"` - }{} - - assertParseFail(t, ErrRequired, fmt.Sprintf("the required flag `%cv' was not specified", defaultShortOptDelimiter), &opts) -} - -func TestShortMultiConcat(t *testing.T) { - var opts = struct { - V bool `short:"v"` - O bool `short:"o"` - F bool `short:"f"` - }{} - - ret := assertParseSuccess(t, &opts, "-vo", "-f") - - assertStringArray(t, ret, []string{}) - - if !opts.V { - t.Errorf("Expected V to be true") - } - - if !opts.O { - t.Errorf("Expected O to be true") - } - - if !opts.F { - t.Errorf("Expected F to be true") - } -} - -func TestShortMultiRequiredConcat(t *testing.T) { - var opts = struct { - V bool `short:"v" required:"true"` - O bool `short:"o" required:"true"` - F bool `short:"f" required:"true"` - }{} - - ret := assertParseSuccess(t, &opts, "-vo", "-f") - - assertStringArray(t, ret, []string{}) - - if !opts.V { - t.Errorf("Expected V to be true") - } - - if !opts.O { - t.Errorf("Expected O to be true") - } - - if !opts.F { - t.Errorf("Expected F to be true") - } -} - -func TestShortMultiSlice(t *testing.T) { - var opts = struct { - Values []bool `short:"v"` - }{} - - ret := assertParseSuccess(t, &opts, "-v", "-v") - - assertStringArray(t, ret, []string{}) - assertBoolArray(t, opts.Values, []bool{true, true}) -} - -func TestShortMultiSliceConcat(t *testing.T) { - var opts = struct { - Values []bool `short:"v"` - }{} - - ret := assertParseSuccess(t, &opts, "-vvv") - - assertStringArray(t, ret, []string{}) - assertBoolArray(t, opts.Values, []bool{true, true, true}) -} - -func TestShortWithEqualArg(t *testing.T) { - var opts = struct { - Value string `short:"v"` - }{} - - ret := assertParseSuccess(t, &opts, "-v=value") - - assertStringArray(t, ret, []string{}) - assertString(t, opts.Value, "value") -} - -func TestShortWithArg(t *testing.T) { - var opts = struct { - Value string `short:"v"` - }{} - - ret := assertParseSuccess(t, &opts, "-vvalue") - - assertStringArray(t, ret, []string{}) - assertString(t, opts.Value, "value") -} - -func TestShortArg(t *testing.T) { - var opts = struct { - Value string `short:"v"` - }{} - - ret := assertParseSuccess(t, &opts, "-v", "value") - - assertStringArray(t, ret, []string{}) - assertString(t, opts.Value, "value") -} - -func TestShortMultiWithEqualArg(t *testing.T) { - var opts = struct { - F []bool `short:"f"` - Value string `short:"v"` - }{} - - assertParseFail(t, ErrExpectedArgument, fmt.Sprintf("expected argument for flag `%cv'", defaultShortOptDelimiter), &opts, "-ffv=value") -} - -func TestShortMultiArg(t *testing.T) { - var opts = struct { - F []bool `short:"f"` - Value string `short:"v"` - }{} - - ret := assertParseSuccess(t, &opts, "-ffv", "value") - - assertStringArray(t, ret, []string{}) - assertBoolArray(t, opts.F, []bool{true, true}) - assertString(t, opts.Value, "value") -} - -func TestShortMultiArgConcatFail(t *testing.T) { - var opts = struct { - F []bool `short:"f"` - Value string `short:"v"` - }{} - - assertParseFail(t, ErrExpectedArgument, fmt.Sprintf("expected argument for flag `%cv'", defaultShortOptDelimiter), &opts, "-ffvvalue") -} - -func TestShortMultiArgConcat(t *testing.T) { - var opts = struct { - F []bool `short:"f"` - Value string `short:"v"` - }{} - - ret := assertParseSuccess(t, &opts, "-vff") - - assertStringArray(t, ret, []string{}) - assertString(t, opts.Value, "ff") -} - -func TestShortOptional(t *testing.T) { - var opts = struct { - F []bool `short:"f"` - Value string `short:"v" optional:"yes" optional-value:"value"` - }{} - - ret := assertParseSuccess(t, &opts, "-fv", "f") - - assertStringArray(t, ret, []string{"f"}) - assertString(t, opts.Value, "value") -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/tag_test.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/tag_test.go deleted file mode 100644 index 9daa740..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/tag_test.go +++ /dev/null @@ -1,38 +0,0 @@ -package flags - -import ( - "testing" -) - -func TestTagMissingColon(t *testing.T) { - var opts = struct { - Value bool `short` - }{} - - assertParseFail(t, ErrTag, "expected `:' after key name, but got end of tag (in `short`)", &opts, "") -} - -func TestTagMissingValue(t *testing.T) { - var opts = struct { - Value bool `short:` - }{} - - assertParseFail(t, ErrTag, "expected `\"' to start tag value at end of tag (in `short:`)", &opts, "") -} - -func TestTagMissingQuote(t *testing.T) { - var opts = struct { - Value bool `short:"v` - }{} - - assertParseFail(t, ErrTag, "expected end of tag value `\"' at end of tag (in `short:\"v`)", &opts, "") -} - -func TestTagNewline(t *testing.T) { - var opts = struct { - Value bool `long:"verbose" description:"verbose -something"` - }{} - - assertParseFail(t, ErrTag, "unexpected newline in tag value `description' (in `long:\"verbose\" description:\"verbose\nsomething\"`)", &opts, "") -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/termsize.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/termsize.go deleted file mode 100644 index df97e7e..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/termsize.go +++ /dev/null @@ -1,28 +0,0 @@ -// +build !windows,!plan9,!solaris - -package flags - -import ( - "syscall" - "unsafe" -) - -type winsize struct { - row, col uint16 - xpixel, ypixel uint16 -} - -func getTerminalColumns() int { - ws := winsize{} - - if tIOCGWINSZ != 0 { - syscall.Syscall(syscall.SYS_IOCTL, - uintptr(0), - uintptr(tIOCGWINSZ), - uintptr(unsafe.Pointer(&ws))) - - return int(ws.col) - } - - return 80 -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/termsize_linux.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/termsize_linux.go deleted file mode 100644 index e3975e2..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/termsize_linux.go +++ /dev/null @@ -1,7 +0,0 @@ -// +build linux - -package flags - -const ( - tIOCGWINSZ = 0x5413 -) diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/termsize_nosysioctl.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/termsize_nosysioctl.go deleted file mode 100644 index 2a9bbe0..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/termsize_nosysioctl.go +++ /dev/null @@ -1,7 +0,0 @@ -// +build windows plan9 solaris - -package flags - -func getTerminalColumns() int { - return 80 -} diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/termsize_other.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/termsize_other.go deleted file mode 100644 index 3082151..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/termsize_other.go +++ /dev/null @@ -1,7 +0,0 @@ -// +build !darwin,!freebsd,!netbsd,!openbsd,!linux - -package flags - -const ( - tIOCGWINSZ = 0 -) diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/termsize_unix.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/termsize_unix.go deleted file mode 100644 index fcc1186..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/termsize_unix.go +++ /dev/null @@ -1,7 +0,0 @@ -// +build darwin freebsd netbsd openbsd - -package flags - -const ( - tIOCGWINSZ = 0x40087468 -) diff --git a/Godeps/_workspace/src/github.com/jessevdk/go-flags/unknown_test.go b/Godeps/_workspace/src/github.com/jessevdk/go-flags/unknown_test.go deleted file mode 100644 index 858be45..0000000 --- a/Godeps/_workspace/src/github.com/jessevdk/go-flags/unknown_test.go +++ /dev/null @@ -1,66 +0,0 @@ -package flags - -import ( - "testing" -) - -func TestUnknownFlags(t *testing.T) { - var opts = struct { - Verbose []bool `short:"v" long:"verbose" description:"Verbose output"` - }{} - - args := []string{ - "-f", - } - - p := NewParser(&opts, 0) - args, err := p.ParseArgs(args) - - if err == nil { - t.Fatal("Expected error for unknown argument") - } -} - -func TestIgnoreUnknownFlags(t *testing.T) { - var opts = struct { - Verbose []bool `short:"v" long:"verbose" description:"Verbose output"` - }{} - - args := []string{ - "hello", - "world", - "-v", - "--foo=bar", - "--verbose", - "-f", - } - - p := NewParser(&opts, IgnoreUnknown) - args, err := p.ParseArgs(args) - - if err != nil { - t.Fatal(err) - } - - exargs := []string{ - "hello", - "world", - "--foo=bar", - "-f", - } - - issame := (len(args) == len(exargs)) - - if issame { - for i := 0; i < len(args); i++ { - if args[i] != exargs[i] { - issame = false - break - } - } - } - - if !issame { - t.Fatalf("Expected %v but got %v", exargs, args) - } -} diff --git a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/LICENSE b/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/LICENSE deleted file mode 100644 index 5f0d1fb..0000000 --- a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2014 Alan Shreve - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/README.md b/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/README.md deleted file mode 100644 index cd4ef16..0000000 --- a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/README.md +++ /dev/null @@ -1,62 +0,0 @@ -![obligatory xkcd](http://imgs.xkcd.com/comics/standards.png) - -# log15 - -Package log15 provides an opinionated, simple toolkit for best-practice logging that is both human and machine readable. It is modeled after the standard library's io and net/http packages. - -## Features -- A simple, easy-to-understand API -- Promotes structured logging by encouraging use of key/value pairs -- Child loggers which inherit and add their own private context -- Lazy evaluation of expensive operations -- Simple Handler interface allowing for construction of flexible, custom logging configurations with a tiny API. -- Color terminal support -- Built-in support for logging to files, streams, syslog, and the network -- Support for forking records to multiple handlers, buffering records for output, failing over from failed handler writes, + more - -## Documentation - -The package documentation is extensive and complete. Browse on godoc: - -#### [log15 API Documentation](https://godoc.org/github.com/inconshreveable/log15) - -## Versioning -The API of the master branch of log15 should always be considered unstable. Using a stable version -of the log15 package is supported by gopkg.in. Include your dependency like so: - - import log "gopkg.in/inconshreveable/log15.v2" - -You can also vendor log15 with a tool like Godep. - -## Examples - - // all loggers can have key/value context - srvlog := log.New("module", "app/server") - - // all log messages can have key/value context - srvlog.Warn("abnormal conn rate", "rate", curRate, "low", lowRate, "high", highRate) - - // child loggers with inherited context - connlog := srvlog.New("raddr", c.RemoteAddr()) - connlog.Info("connection open") - - // lazy evaluation - connlog.Debug("ping remote", "latency", log.Lazy(pingRemote)) - - // flexible configuration - srvlog.SetHandler(log.MultiHandler( - log.StreamHandler(os.Stderr, log.LogfmtFormat()), - log.LvlFilterHandler( - log.LvlError, - log.Must.FileHandler("errors.json", log.JsonHandler()))) - -## FAQ - -### The varargs style is brittle and error prone! Can I have type saftey please? -Yes. Use log.Ctx: - - srvlog := log.New(log.Ctx{"module": "app/server"}) - srvlog.Warn("abnormal conn rate", log.Ctx{"rate": curRate, "low": lowRate, "high": highRate}) - -## License -Apache diff --git a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/bench_test.go b/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/bench_test.go deleted file mode 100644 index bc52b87..0000000 --- a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/bench_test.go +++ /dev/null @@ -1,69 +0,0 @@ -package log15 - -import ( - "bytes" - "testing" - "time" -) - -func BenchmarkStreamNoCtx(b *testing.B) { - lg := New() - - buf := bytes.Buffer{} - lg.SetHandler(StreamHandler(&buf, LogfmtFormat())) - - for i := 0; i < b.N; i++ { - lg.Info("test message") - buf.Reset() - } -} - -func BenchmarkDiscard(b *testing.B) { - lg := New() - lg.SetHandler(DiscardHandler()) - - for i := 0; i < b.N; i++ { - lg.Info("test message") - } -} - -func BenchmarkLogfmtNoCtx(b *testing.B) { - r := Record{ - Time: time.Now(), - Lvl: LvlInfo, - Msg: "test message", - Ctx: []interface{}{}, - } - - logfmt := LogfmtFormat() - for i := 0; i < b.N; i++ { - logfmt.Format(&r) - } -} - -func BenchmarkJsonNoCtx(b *testing.B) { - r := Record{ - Time: time.Now(), - Lvl: LvlInfo, - Msg: "test message", - Ctx: []interface{}{}, - } - - jsonfmt := JsonFormat() - for i := 0; i < b.N; i++ { - jsonfmt.Format(&r) - } -} - -func BenchmarkMultiLevelFilter(b *testing.B) { - handler := MultiHandler( - LvlFilterHandler(LvlDebug, DiscardHandler()), - LvlFilterHandler(LvlError, DiscardHandler()), - ) - - lg := New() - lg.SetHandler(handler) - for i := 0; i < b.N; i++ { - lg.Info("test message") - } -} diff --git a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/doc.go b/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/doc.go deleted file mode 100644 index e60af69..0000000 --- a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/doc.go +++ /dev/null @@ -1,302 +0,0 @@ -/* -Package log15 provides an opinionated, simple toolkit for best-practice logging that is -both human and machine readable. It is modeled after the standard library's io and net/http -packages. - -This package enforces you to only log key/value pairs. Keys must be strings. Values may be -any type that you like. The default output format is logfmt, but you may also choose to use -JSON instead if that suits you. Here's how you log: - - log.Info("page accessed", "path", r.URL.Path, "user_id", user.id) - -This will output a line that looks like: - - lvl=info t=2014-05-02T16:07:23-0700 msg="page access" path=/org/71/profile user_id=9 - -Getting Started - -To get started, you'll want to import the library: - - import log "gopkg.in/inconshreveable/log15.v2" - - -Now you're ready to start logging: - - func main() { - log.Info("Program starting", "args", os.Args()) - } - - -Convention - -Because recording a human-meaningful message is common and good practice, the first argument to every -logging method is the value to the *implicit* key 'msg'. - -Additionally, the level you choose for a message will be automatically added with the key 'lvl', and so -will the current timestamp with key 't'. - -You may supply any additional context as a set of key/value pairs to the logging function. log15 allows -you to favor terseness, ordering, and speed over safety. This is a reasonable tradeoff for -logging functions. You don't need to explicitly state keys/values, log15 understands that they alternate -in the variadic argument list: - - log.Warn("size out of bounds", "low", lowBound, "high", highBound, "val", val) - -If you really do favor your type-safety, you may choose to pass a log.Ctx instead: - - log.Warn("size out of bounds", log.Ctx{"low": lowBound, "high": highBound, "val": val}) - - -Context loggers - -Frequently, you want to add context to a logger so that you can track actions associated with it. An http -request is a good example. You can easily create new loggers that have context that is automatically included -with each log line: - - requestlogger := log.New("path", r.URL.Path) - - // later - requestlogger.Debug("db txn commit", "duration", txnTimer.Finish()) - -This will output a log line that includes the path context that is attached to the logger: - - lvl=dbug t=2014-05-02T16:07:23-0700 path=/repo/12/add_hook msg="db txn commit" duration=0.12 - - -Handlers - -The Handler interface defines where log lines are printed to and how they are formated. Handler is a -single interface that is inspired by net/http's handler interface: - - type Handler interface { - Log(r *Record) - } - - -Handlers can filter records, format them, or dispatch to multiple other Handlers. -This package implements a number of Handlers for common logging patterns that are -can be easily composed to create flexible, custom logging structures. - -Here's an example handler that prints logfmt output to Stdout: - - handler := log.StreamHandler(os.Stdout, log.LogfmtFormat()) - -Here's an example handler that defers to two other handlers. One handler only prints records -from the rpc package in logfmt to standard out. The other prints records at Error level -or above in JSON formatted output to the file /var/log/service.json - - handler := log.MultiHandler( - log.LvlFilterHandler(log.LvlError, log.Must.FileHandler("/var/log/service.json", log.JsonFormat())), - log.MatchFilterHandler("pkg", "app/rpc" log.StdoutHandler()) - ) - -Custom Handlers - -The Handler interface is so simple that it's also trivial to write your own. Let's create an -example handler which tries to write to one handler, but if that fails it falls back to -writing to another handler and includes the error that it encountered when trying to write -to the primary. This might be useful when trying to log over a network socket, but if that -fails you want to log those records to a file on disk. - - type BackupHandler struct { - Primary Handler - Secondary Handler - } - - func (h *BackupHandler) Log (r *Record) error { - err := h.Primary.Log(r) - if err != nil { - r.Ctx = append(ctx, "primary_err", err) - return h.Secondary.Log(r) - } - return nil - } - -This pattern is so useful that a generic version that handles an arbitrary number of Handlers -is included as part of this library called FailoverHandler. - -Logging Expensive Operations - -Sometimes, you want to log values that are extremely expensive to compute, but you don't want to pay -the price of computing them if you haven't turned up your logging level to a high level of detail. - -This package provides a simple type to annotate a logging operation that you want to be evaluated -lazily, just when it is about to be logged, so that it would not be evaluated if an upstream Handler -filters it out. Just wrap any function which takes no arguments with the log.Lazy type. For example: - - func factorRSAKey() (factors []int) { - // return the factors of a very large number - } - - log.Debug("factors", log.Lazy{factorRSAKey}) - -If this message is not logged for any reason (like logging at the Error level), then -factorRSAKey is never evaluated. - -Dynamic context values - -The same log.Lazy mechanism can be used to attach context to a logger which you want to be -evaluated when the message is logged, but not when the logger is created. For example, let's imagine -a game where you have Player objects: - - type Player struct { - name string - alive bool - log.Logger - } - -You always want to log a player's name and whether they're alive or dead, so when you create the player -object, you might do: - - p := &Player{name: name, alive: true} - p.Logger = log.New("name", p.name, "alive", p.alive) - -Only now, even after a player has died, the logger will still report they are alive because the logging -context is evaluated when the logger was created. By using the Lazy wrapper, we can defer the evaluation -of whether the player is alive or not to each log message, so that the log records will reflect the player's -current state no matter when the log message is written: - - p := &Player{name: name, alive: true} - isAlive := func() bool { return p.alive } - player.Logger = log.New("name", p.name, "alive", log.Lazy{isAlive}) - -Terminal Format - -If log15 detects that stdout is a terminal, it will configure the default -handler for it (which is log.StdoutHandler) to use TerminalFormat. This format -logs records nicely for your terminal, including color-coded output based -on log level. - -Error Handling - -Becasuse log15 allows you to step around the type system, there are a few ways you can specify -invalid arguments to the logging functions. You could, for example, wrap something that is not -a zero-argument function with log.Lazy or pass a context key that is not a string. Since logging libraries -are typically the mechanism by which errors are reported, it would be onerous for the logging functions -to return errors. Instead, log15 handles errors by making these guarantees to you: - -- Any log record containing an error will still be printed with the error explained to you as part of the log record. - -- Any log record containing an error will include the context key LOG15_ERROR, enabling you to easily -(and if you like, automatically) detect if any of your logging calls are passing bad values. - -Understanding this, you might wonder why the Handler interface can return an error value in its Log method. Handlers -are encouraged to return errors only if they fail to write their log records out to an external source like if the -syslog daemon is not responding. This allows the construction of useful handlers which cope with those failures -like the FailoverHandler. - -Library Use - -log15 is intended to be useful for library authors as a way to provide configurable logging to -users of their library. Best practice for use in a library is to always disable all output for your logger -by default and to provide a public Logger instance that consumers of your library can configure. Like so: - - package yourlib - - import "gopkg.in/inconshreveable/log15.v2" - - var Log = log.New() - - func init() { - Log.SetHandler(log.DiscardHandler()) - } - -Users of your library may then enable it if they like: - - import "gopkg.in/inconshreveable/log15.v2" - import "example.com/yourlib" - - func main() { - handler := // custom handler setup - yourlib.Log.SetHandler(handler) - } - -Best practices attaching logger context - -The ability to attach context to a logger is a powerful one. Where should you do it and why? -I favor embedding a Logger directly into any persistent object in my application and adding -unique, tracing context keys to it. For instance, imagine I am writing a web browser: - - type Tab struct { - url string - render *RenderingContext - // ... - - Logger - } - - func NewTab(url string) *Tab { - return &Tab { - // ... - url: url, - - Logger: log.New("url", url), - } - } - -When a new tab is created, I assign a logger to it with the url of -the tab as context so it can easily be traced through the logs. -Now, whenever we perform any operation with the tab, we'll log with its -embedded logger and it will include the tab title automatically: - - tab.Debug("moved position", "idx", tab.idx) - -There's only one problem. What if the tab url changes? We could -use log.Lazy to make sure the current url is always written, but that -would mean that we couldn't trace a tab's full lifetime through our -logs after the user navigate to a new URL. - -Instead, think about what values to attach to your loggers the -same way you think about what to use as a key in a SQL database schema. -If it's possible to use a natural key that is unique for the lifetime of the -object, do so. But otherwise, log15's ext package has a handy RandId -function to let you generate what you might call "surrogate keys" -They're just random hex identifiers to use for tracing. Back to our -Tab example, we would prefer to set up our Logger like so: - - import logext "gopkg.in/inconshreveable/log15.v2/ext" - - t := &Tab { - // ... - url: url, - } - - t.Logger = log.New("id", logext.RandId(8), "url", log.Lazy{t.getUrl}) - return t - -Now we'll have a unique traceable identifier even across loading new urls, but -we'll still be able to see the tab's current url in the log messages. - -Must - -For all Handler functions which can return an error, there is a version of that -function which will return no error but panics on failure. They are all available -on the Must object. For example: - - log.Must.FileHandler("/path", log.JsonFormat) - log.Must.NetHandler("tcp", ":1234", log.JsonFormat) - -Inspiration and Credit - -All of the following excellent projects inspired the design of this library: - -code.google.com/p/log4go - -github.com/op/go-logging - -github.com/technoweenie/grohl - -github.com/Sirupsen/logrus - -github.com/kr/logfmt - -github.com/spacemonkeygo/spacelog - -golang's stdlib, notably io and net/http - -The Name - -https://xkcd.com/927/ - -*/ -package log15 diff --git a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/ext/ext_test.go b/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/ext/ext_test.go deleted file mode 100644 index c7f3538..0000000 --- a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/ext/ext_test.go +++ /dev/null @@ -1,109 +0,0 @@ -package ext - -import ( - "errors" - log "gopkg.in/inconshreveable/log15.v2" - "math" - "testing" -) - -func testHandler() (log.Handler, *log.Record) { - rec := new(log.Record) - return log.FuncHandler(func(r *log.Record) error { - *rec = *r - return nil - }), rec -} - -func TestHotSwapHandler(t *testing.T) { - t.Parallel() - - h1, r1 := testHandler() - - l := log.New() - h := HotSwapHandler(h1) - l.SetHandler(h) - - l.Info("to h1") - if r1.Msg != "to h1" { - t.Fatalf("didn't get expected message to h1") - } - - h2, r2 := testHandler() - h.Swap(h2) - l.Info("to h2") - if r2.Msg != "to h2" { - t.Fatalf("didn't get expected message to h2") - } -} - -func TestSpeculativeHandler(t *testing.T) { - t.Parallel() - - // test with an even multiple of the buffer size, less than full buffer size - // and not a multiple of the buffer size - for _, count := range []int{10000, 50, 432} { - recs := make(chan *log.Record) - done := make(chan int) - spec := SpeculativeHandler(100, log.ChannelHandler(recs)) - - go func() { - defer close(done) - expectedCount := int(math.Min(float64(count), float64(100))) - expectedIdx := count - expectedCount - for r := range recs { - if r.Ctx[1] != expectedIdx { - t.Errorf("Bad ctx 'i', got %d expected %d", r.Ctx[1], expectedIdx) - return - } - expectedIdx++ - expectedCount-- - - if expectedCount == 0 { - // got everything we expected - break - } - } - - select { - case <-recs: - t.Errorf("got an extra record we shouldn't have!") - default: - } - }() - - lg := log.New() - lg.SetHandler(spec) - for i := 0; i < count; i++ { - lg.Debug("test speculative", "i", i) - } - - go spec.Flush() - - // wait for the go routine to finish - <-done - } -} - -func TestErrorHandler(t *testing.T) { - t.Parallel() - - h, r := testHandler() - lg := log.New() - lg.SetHandler(EscalateErrHandler( - log.LvlFilterHandler(log.LvlError, h))) - - lg.Debug("some function result", "err", nil) - if r.Msg != "" { - t.Fatalf("Expected debug level message to be filtered") - } - - lg.Debug("some function result", "err", errors.New("failed operation")) - if r.Msg != "some function result" { - t.Fatalf("Expected debug level message to be escalated and pass lvlfilter") - } - - if r.Lvl != log.LvlError { - t.Fatalf("Expected debug level message to be escalated to LvlError") - } -} diff --git a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/ext/handler.go b/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/ext/handler.go deleted file mode 100644 index b9149dd..0000000 --- a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/ext/handler.go +++ /dev/null @@ -1,117 +0,0 @@ -package ext - -import ( - log "gopkg.in/inconshreveable/log15.v2" - "sync" -) - -// EscalateErrHandler wraps another handler and passes all records through -// unchanged except if the logged context contains a non-nil error -// value in its context. In that case, the record's level is raised -// to LvlError unless it was already more serious (LvlCrit). -// -// This allows you to log the result of all functions for debugging -// and still capture error conditions when in production with a single -// log line. As an example, the following the log record will be written -// out only if there was an error writing a value to redis: -// -// logger := logext.EscalateErrHandler( -// log.LvlFilterHandler(log.LvlInfo, log.StdoutHandler)) -// -// reply, err := redisConn.Do("SET", "foo", "bar") -// logger.Debug("Wrote value to redis", "reply", reply, "err", err) -// if err != nil { -// return err -// } -// -func EscalateErrHandler(h log.Handler) log.Handler { - return log.FuncHandler(func(r *log.Record) error { - if r.Lvl > log.LvlError { - for i := 1; i < len(r.Ctx); i++ { - if v, ok := r.Ctx[i].(error); ok && v != nil { - r.Lvl = log.LvlError - break - } - } - } - return h.Log(r) - }) -} - -// SpeculativeHandler is a handler for speculative logging. It -// keeps a ring buffer of the given size full of the last events -// logged into it. When Flush is called, all buffered log records -// are written to the wrapped handler. This is extremely for -// continuosly capturing debug level output, but only flushing those -// log records if an exceptional condition is encountered. -func SpeculativeHandler(size int, h log.Handler) *Speculative { - return &Speculative{ - handler: h, - recs: make([]*log.Record, size), - } -} - -type Speculative struct { - mu sync.Mutex - idx int - recs []*log.Record - handler log.Handler - full bool -} - -func (h *Speculative) Log(r *log.Record) error { - h.mu.Lock() - defer h.mu.Unlock() - h.recs[h.idx] = r - h.idx = (h.idx + 1) % len(h.recs) - h.full = h.full || h.idx == 0 - return nil -} - -func (h *Speculative) Flush() { - recs := make([]*log.Record, 0) - func() { - h.mu.Lock() - defer h.mu.Unlock() - if h.full { - recs = append(recs, h.recs[h.idx:]...) - } - recs = append(recs, h.recs[:h.idx]...) - - // reset state - h.full = false - h.idx = 0 - }() - - // don't hold the lock while we flush to the wrapped handler - for _, r := range recs { - h.handler.Log(r) - } -} - -// HotSwapHandler wraps another handler that may swapped out -// dynamically at runtime in a thread-safe fashion. -// HotSwapHandler is the same functionality -// used to implement the SetHandler method for the default -// implementation of Logger. -func HotSwapHandler(h log.Handler) *HotSwap { - return &HotSwap{handler: h} -} - -type HotSwap struct { - mu sync.RWMutex - handler log.Handler -} - -func (h *HotSwap) Log(r *log.Record) error { - defer h.mu.RUnlock() - h.mu.RLock() - err := h.handler.Log(r) - return err -} - -func (h *HotSwap) Swap(newHandler log.Handler) { - h.mu.Lock() - defer h.mu.Unlock() - h.handler = newHandler -} diff --git a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/ext/id.go b/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/ext/id.go deleted file mode 100644 index 0f31320..0000000 --- a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/ext/id.go +++ /dev/null @@ -1,30 +0,0 @@ -package ext - -import ( - "fmt" - "math/rand" - "time" -) - -var r *rand.Rand - -func init() { - r = rand.New(rand.NewSource(time.Now().Unix())) -} - -// RandId creates a random identifier of the requested length. -// Useful for assigning mostly-unique identifiers for logging -// and identification that are unlikely to collide because of -// short lifespan or low set cardinality -func RandId(idlen int) string { - b := make([]byte, idlen) - var randVal uint32 - for i := 0; i < idlen; i++ { - byteIdx := i % 4 - if byteIdx == 0 { - randVal = r.Uint32() - } - b[i] = byte((randVal >> (8 * uint(byteIdx))) & 0xFF) - } - return fmt.Sprintf("%x", b) -} diff --git a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/format.go b/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/format.go deleted file mode 100644 index 423d621..0000000 --- a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/format.go +++ /dev/null @@ -1,246 +0,0 @@ -package log15 - -import ( - "bytes" - "encoding/json" - "fmt" - "strconv" - "strings" - "time" -) - -const ( - timeFormat = "2006-01-02T15:04:05-0700" - termTimeFormat = "01-02|15:04:05" - floatFormat = 'f' - termMsgJust = 40 -) - -type Format interface { - Format(r *Record) []byte -} - -// FormatFunc returns a new Format object which uses -// the given function to perform record formatting. -func FormatFunc(f func(*Record) []byte) Format { - return formatFunc(f) -} - -type formatFunc func(*Record) []byte - -func (f formatFunc) Format(r *Record) []byte { - return f(r) -} - -// TerminalFormat formats log records optimized for human readability on -// a terminal with color-coded level output and terser human friendly timestamp. -// This format should only be used for interactive programs or while developing. -// -// [TIME] [LEVEL] MESAGE key=value key=value ... -// -// Example: -// -// [May 16 20:58:45] [DBUG] remove route ns=haproxy addr=127.0.0.1:50002 -// -func TerminalFormat() Format { - return FormatFunc(func(r *Record) []byte { - var color = 0 - switch r.Lvl { - case LvlCrit: - color = 35 - case LvlError: - color = 31 - case LvlWarn: - color = 33 - case LvlInfo: - color = 32 - case LvlDebug: - color = 36 - } - - b := &bytes.Buffer{} - lvl := strings.ToUpper(r.Lvl.String()) - if color > 0 { - fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%s] %s ", color, lvl, r.Time.Format(termTimeFormat), r.Msg) - } else { - fmt.Fprintf(b, "[%s] [%s] %s ", lvl, r.Time.Format(termTimeFormat), r.Msg) - } - - // try to justify the log output for short messages - if len(r.Ctx) > 0 && len(r.Msg) < termMsgJust { - b.Write(bytes.Repeat([]byte{' '}, termMsgJust-len(r.Msg))) - } - - // print the keys logfmt style - logfmt(b, r.Ctx, color) - return b.Bytes() - }) -} - -// LogfmtFormat prints records in logfmt format, an easy machine-parseable but human-readable -// format for key/value pairs. -// -// For more details see: http://godoc.org/github.com/kr/logfmt -// -func LogfmtFormat() Format { - return FormatFunc(func(r *Record) []byte { - common := []interface{}{"t", r.Time, "lvl", r.Lvl, "msg", r.Msg} - buf := &bytes.Buffer{} - logfmt(buf, append(common, r.Ctx...), 0) - return buf.Bytes() - }) -} - -func logfmt(buf *bytes.Buffer, ctx []interface{}, color int) { - for i := 0; i < len(ctx); i += 2 { - if i != 0 { - buf.WriteByte(' ') - } - - k, ok := ctx[i].(string) - v := formatLogfmtValue(ctx[i+1]) - if !ok { - k, v = errorKey, formatLogfmtValue(k) - } - - // XXX: we should probably check that all of your key bytes aren't invalid - if color > 0 { - fmt.Fprintf(buf, "\x1b[%dm%s\x1b[0m=%s", color, k, v) - } else { - fmt.Fprintf(buf, "%s=%s", k, v) - } - } - - buf.WriteByte('\n') -} - -// JsonFormat formats log records as JSON objects separated by newlines. -// It is the equivalent of JsonFormatEx(false, true). -func JsonFormat() Format { - return JsonFormatEx(false, true) -} - -// JsonFormatEx formats log records as JSON objects. If pretty is true, -// records will be pretty-printed. If lineSeparated is true, records -// will be logged with a new line between each record. -func JsonFormatEx(pretty, lineSeparated bool) Format { - jsonMarshal := json.Marshal - if pretty { - jsonMarshal = func(v interface{}) ([]byte, error) { - return json.MarshalIndent(v, "", " ") - } - } - - return FormatFunc(func(r *Record) []byte { - props := make(map[string]interface{}) - - props["t"] = r.Time - props["lvl"] = r.Lvl - props["msg"] = r.Msg - - for i := 0; i < len(r.Ctx); i += 2 { - k, ok := r.Ctx[i].(string) - if !ok { - props[errorKey] = fmt.Sprintf("%+v is not a string key", r.Ctx[i]) - } - props[k] = formatJsonValue(r.Ctx[i+1]) - } - - b, err := jsonMarshal(props) - if err != nil { - b, _ = jsonMarshal(map[string]string{ - errorKey: err.Error(), - }) - return b - } - - if lineSeparated { - b = append(b, '\n') - } - - return b - }) -} - -func formatShared(value interface{}) interface{} { - switch v := value.(type) { - case time.Time: - return v.Format(timeFormat) - - case error: - return v.Error() - - case fmt.Stringer: - return v.String() - - default: - return v - } -} - -func formatJsonValue(value interface{}) interface{} { - value = formatShared(value) - switch value.(type) { - case int, int8, int16, int32, int64, float32, float64, uint, uint8, uint16, uint32, uint64, string: - return value - default: - return fmt.Sprintf("%+v", value) - } -} - -// formatValue formats a value for serialization -func formatLogfmtValue(value interface{}) string { - if value == nil { - return "nil" - } - - value = formatShared(value) - switch v := value.(type) { - case bool: - return strconv.FormatBool(v) - case float32: - return strconv.FormatFloat(float64(v), floatFormat, 3, 64) - case float64: - return strconv.FormatFloat(v, floatFormat, 3, 64) - case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64: - return fmt.Sprintf("%d", value) - case string: - return escapeString(v) - default: - return escapeString(fmt.Sprintf("%+v", value)) - } -} - -func escapeString(s string) string { - needQuotes := false - e := bytes.Buffer{} - e.WriteByte('"') - for _, r := range s { - if r <= ' ' || r == '=' || r == '"' { - needQuotes = true - } - - switch r { - case '\\', '"': - e.WriteByte('\\') - e.WriteByte(byte(r)) - case '\n': - e.WriteByte('\\') - e.WriteByte('n') - case '\r': - e.WriteByte('\\') - e.WriteByte('r') - case '\t': - e.WriteByte('\\') - e.WriteByte('t') - default: - e.WriteRune(r) - } - } - e.WriteByte('"') - start, stop := 0, e.Len() - if !needQuotes { - start, stop = 1, stop-1 - } - return string(e.Bytes()[start:stop]) -} diff --git a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/handler.go b/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/handler.go deleted file mode 100644 index 8bb1589..0000000 --- a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/handler.go +++ /dev/null @@ -1,338 +0,0 @@ -package log15 - -import ( - "fmt" - "io" - "net" - "os" - "reflect" - "sync" -) - -// A Logger prints its log records by writing to a Handler. -// The Handler interface defines where and how log records are written. -// Handlers are composable, providing you great flexibility in combining -// them to achieve the logging structure that suits your applications. -type Handler interface { - Log(r *Record) error -} - -// FuncHandler returns a Handler that logs records with the given -// function. -func FuncHandler(fn func(r *Record) error) Handler { - return funcHandler(fn) -} - -type funcHandler func(r *Record) error - -func (h funcHandler) Log(r *Record) error { - return h(r) -} - -// StreamHandler writes log records to an io.Writer -// with the given format. StreamHandler can be used -// to easily begin writing log records to other -// outputs. -// -// StreamHandler wraps itself with LazyHandler and SyncHandler -// to evaluate Lazy objects and perform safe concurrent writes. -func StreamHandler(wr io.Writer, fmtr Format) Handler { - h := FuncHandler(func(r *Record) error { - _, err := wr.Write(fmtr.Format(r)) - return err - }) - return LazyHandler(SyncHandler(h)) -} - -// SyncHandler can be wrapped around a handler to guarantee that -// only a single Log operation can proceed at a time. It's necessary -// for thread-safe concurrent writes. -func SyncHandler(h Handler) Handler { - var mu sync.Mutex - return FuncHandler(func(r *Record) error { - defer mu.Unlock() - mu.Lock() - return h.Log(r) - }) -} - -// FileHandler returns a handler which writes log records to the give file -// using the given format. If the path -// already exists, FileHandler will append to the given file. If it does not, -// FileHandler will create the file with mode 0644. -func FileHandler(path string, fmtr Format) (Handler, error) { - f, err := os.OpenFile(path, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) - if err != nil { - return nil, err - } - return closingHandler{f, StreamHandler(f, fmtr)}, nil -} - -// NetHandler opens a socket to the given address and writes records -// over the connection. -func NetHandler(network, addr string, fmtr Format) (Handler, error) { - conn, err := net.Dial(network, addr) - if err != nil { - return nil, err - } - - return closingHandler{conn, StreamHandler(conn, fmtr)}, nil -} - -// XXX: closingHandler is essentially unused at the moment -// it's meant for a future time when the Handler interface supports -// a possible Close() operation -type closingHandler struct { - io.WriteCloser - Handler -} - -func (h *closingHandler) Close() error { - return h.WriteCloser.Close() -} - -// FilterHandler returns a Handler that only writes records to the -// wrapped Handler if the given function evaluates true. For example, -// to only log records where the 'err' key is not nil: -// -// logger.SetHandler(FilterHandler(func(r *Record) bool { -// for i := 0; i < len(r.Ctx); i += 2 { -// if r.Ctx[i] == "err" { -// return r.Ctx[i+1] != nil -// } -// } -// return false -// }, h)) -// -func FilterHandler(fn func(r *Record) bool, h Handler) Handler { - return FuncHandler(func(r *Record) error { - if fn(r) { - return h.Log(r) - } - return nil - }) -} - -// MatchFilterHandler returns a Handler that only writes records -// to the wrapped Handler if the given key in the logged -// context matches the value. For example, to only log records -// from your ui package: -// -// log.MatchFilterHandler("pkg", "app/ui", log.StdoutHandler) -// -func MatchFilterHandler(key string, value interface{}, h Handler) Handler { - return FilterHandler(func(r *Record) (pass bool) { - switch key { - case "lvl": - return r.Lvl == value - case "t": - return r.Time == value - case "msg": - return r.Msg == value - } - - for i := 0; i < len(r.Ctx); i += 2 { - if r.Ctx[i] == key { - return r.Ctx[i+1] == value - } - } - return false - }, h) -} - -// LvlFilterHandler returns a Handler that only writes -// records which are less than the given verbosity -// level to the wrapped Handler. For example, to only -// log Error/Crit records: -// -// log.LvlFilterHandler(log.Error, log.StdoutHandler) -// -func LvlFilterHandler(maxLvl Lvl, h Handler) Handler { - return FilterHandler(func(r *Record) (pass bool) { - return r.Lvl <= maxLvl - }, h) -} - -// A MultiHandler dispatches any write to each of its handlers. -// This is useful for writing different types of log information -// to different locations. For example, to log to a file and -// standard error: -// -// log.MultiHandler( -// log.Must.FileHandler("/var/log/app.log", log.LogfmtFormat()), -// log.StderrHandler) -// -func MultiHandler(hs ...Handler) Handler { - return FuncHandler(func(r *Record) error { - for _, h := range hs { - // what to do about failures? - h.Log(r) - } - return nil - }) -} - -// A FailoverHandler writes all log records to the first handler -// specified, but will failover and write to the second handler if -// the first handler has failed, and so on for all handlers specified. -// For example you might want to log to a network socket, but failover -// to writing to a file if the network fails, and then to -// standard out if the file write fails: -// -// log.FailoverHandler( -// log.Must.NetHandler("tcp", ":9090", log.JsonFormat()), -// log.Must.FileHandler("/var/log/app.log", log.LogfmtFormat()), -// log.StdoutHandler) -// -// All writes that do not go to the first handler will add context with keys of -// the form "failover_err_{idx}" which explain the error encountered while -// trying to write to the handlers before them in the list. -func FailoverHandler(hs ...Handler) Handler { - return FuncHandler(func(r *Record) error { - var err error - for i, h := range hs { - err = h.Log(r) - if err == nil { - return nil - } else { - r.Ctx = append(r.Ctx, fmt.Sprintf("failover_err_%d", i), err) - } - } - - return err - }) -} - -// ChannelHandler writes all records to the given channel. -// It blocks if the channel is full. Useful for async processing -// of log messages, it's used by BufferedHandler. -func ChannelHandler(recs chan<- *Record) Handler { - return FuncHandler(func(r *Record) error { - recs <- r - return nil - }) -} - -// BufferedHandler writes all records to a buffered -// channel of the given size which flushes into the wrapped -// handler whenever it is available for writing. Since these -// writes happen asynchronously, all writes to a BufferedHandler -// never return an error and any errors from the wrapped handler are ignored. -func BufferedHandler(bufSize int, h Handler) Handler { - recs := make(chan *Record, bufSize) - go func() { - for m := range recs { - _ = h.Log(m) - } - }() - return ChannelHandler(recs) -} - -// swapHandler wraps another handler that may swapped out -// dynamically at runtime in a thread-safe fashion. -type swapHandler struct { - mu sync.RWMutex - handler Handler -} - -func (h *swapHandler) Log(r *Record) error { - defer h.mu.RUnlock() - h.mu.RLock() - err := h.handler.Log(r) - return err -} - -func (h *swapHandler) Swap(newHandler Handler) { - h.mu.Lock() - defer h.mu.Unlock() - h.handler = newHandler -} - -// LazyHandler writes all values to the wrapped handler after evaluating -// any lazy functions in the record's context. It is already wrapped -// around StreamHandler and SyslogHandler in this library, you'll only need -// it if you write your own Handler. -func LazyHandler(h Handler) Handler { - return FuncHandler(func(r *Record) error { - // go through the values (odd indices) and reassign - // the values of any lazy fn to the result of its execution - hadErr := false - for i := 1; i < len(r.Ctx); i += 2 { - lz, ok := r.Ctx[i].(Lazy) - if ok { - v, err := evaluateLazy(lz) - if err != nil { - hadErr = true - r.Ctx[i] = err - } else { - r.Ctx[i] = v - } - } - } - - if hadErr { - r.Ctx = append(r.Ctx, errorKey, "bad lazy") - } - - return h.Log(r) - }) -} - -func evaluateLazy(lz Lazy) (interface{}, error) { - t := reflect.TypeOf(lz.Fn) - - if t.Kind() != reflect.Func { - return nil, fmt.Errorf("INVALID_LAZY, not func: %+v", lz.Fn) - } - - if t.NumIn() > 0 { - return nil, fmt.Errorf("INVALID_LAZY, func takes args: %+v", lz.Fn) - } - - if t.NumOut() == 0 { - return nil, fmt.Errorf("INVALID_LAZY, no func return val: %+v", lz.Fn) - } - - value := reflect.ValueOf(lz.Fn) - results := value.Call([]reflect.Value{}) - if len(results) == 1 { - return results[0].Interface(), nil - } else { - values := make([]interface{}, len(results)) - for i, v := range results { - values[i] = v.Interface() - } - return values, nil - } -} - -// DiscardHandler reports success for all writes but does nothing. -// It is useful for dynamically disabling logging at runtime via -// a Logger's SetHandler method. -func DiscardHandler() Handler { - return FuncHandler(func(r *Record) error { - return nil - }) -} - -// The Must object provides the following Handler creation functions -// which instead of returning an error parameter only return a Handler -// and panic on failure: FileHandler, NetHandler, SyslogHandler, SyslogNetHandler -var Must muster - -func must(h Handler, err error) Handler { - if err != nil { - panic(err) - } - return h -} - -type muster struct{} - -func (m muster) FileHandler(path string, fmtr Format) Handler { - return must(FileHandler(path, fmtr)) -} - -func (m muster) NetHandler(network, addr string, fmtr Format) Handler { - return must(NetHandler(network, addr, fmtr)) -} diff --git a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/log15_test.go b/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/log15_test.go deleted file mode 100644 index 70f80e9..0000000 --- a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/log15_test.go +++ /dev/null @@ -1,348 +0,0 @@ -package log15 - -import ( - "bufio" - "bytes" - "encoding/json" - "errors" - "net" - "testing" - "time" -) - -func testHandler() (Handler, *Record) { - rec := new(Record) - return FuncHandler(func(r *Record) error { - *rec = *r - return nil - }), rec -} - -func testLogger() (Logger, Handler, *Record) { - l := New() - h, r := testHandler() - l.SetHandler(LazyHandler(h)) - return l, h, r -} - -func TestLazy(t *testing.T) { - t.Parallel() - - x := 1 - lazy := func() int { - return x - } - - l, _, r := testLogger() - l.Info("", "x", Lazy{lazy}) - if r.Ctx[1] != 1 { - t.Fatalf("Lazy function not evaluated, got %v, expected %d", r.Ctx[1], 1) - } - - x = 2 - l.Info("", "x", Lazy{lazy}) - if r.Ctx[1] != 2 { - t.Fatalf("Lazy function not evaluated, got %v, expected %d", r.Ctx[1], 1) - } -} - -func TestInvalidLazy(t *testing.T) { - t.Parallel() - - l, _, r := testLogger() - validate := func() { - if len(r.Ctx) < 4 { - t.Fatalf("Invalid lazy, got %d args, expecting at least 4", len(r.Ctx)) - } - - if r.Ctx[2] != errorKey { - t.Fatalf("Invalid lazy, got key %s expecting %s", r.Ctx[2], errorKey) - } - } - - l.Info("", "x", Lazy{1}) - validate() - - l.Info("", "x", Lazy{func(x int) int { return x }}) - validate() - - l.Info("", "x", Lazy{func() {}}) - validate() -} - -func TestCtx(t *testing.T) { - t.Parallel() - - l, _, r := testLogger() - l.Info("", Ctx{"x": 1, "y": "foo", "tester": t}) - if len(r.Ctx) != 6 { - t.Fatalf("Expecting Ctx tansformed into %d ctx args, got %d: %v", 6, len(r.Ctx), r.Ctx) - } -} - -func testFormatter(f Format) (Logger, *bytes.Buffer) { - l := New() - var buf bytes.Buffer - l.SetHandler(StreamHandler(&buf, f)) - return l, &buf -} - -func TestJson(t *testing.T) { - t.Parallel() - - l, buf := testFormatter(JsonFormat()) - l.Error("some message", "x", 1, "y", 3.2) - - var v map[string]interface{} - decoder := json.NewDecoder(buf) - if err := decoder.Decode(&v); err != nil { - t.Fatalf("Error decoding JSON: %v", v) - } - - validate := func(key string, expected interface{}) { - if v[key] != expected { - t.Fatalf("Got %v expected %v for %v", v[key], expected, key) - } - } - - validate("msg", "some message") - validate("x", float64(1)) // all numbers are floats in JSON land - validate("y", 3.2) -} - -func TestLogfmt(t *testing.T) { - t.Parallel() - - l, buf := testFormatter(LogfmtFormat()) - l.Error("some message", "x", 1, "y", 3.2, "equals", "=", "quote", "\"") - - // skip timestamp in comparison - got := buf.Bytes()[27:buf.Len()] - expected := []byte(`lvl=eror msg="some message" x=1 y=3.200 equals="=" quote="\""` + "\n") - if !bytes.Equal(got, expected) { - t.Fatalf("Got %s, expected %s", got, expected) - } -} - -func TestMultiHandler(t *testing.T) { - t.Parallel() - - h1, r1 := testHandler() - h2, r2 := testHandler() - l := New() - l.SetHandler(MultiHandler(h1, h2)) - l.Debug("clone") - - if r1.Msg != "clone" { - t.Fatalf("wrong value for h1.Msg. Got %s expected %s", r1.Msg, "clone") - } - - if r2.Msg != "clone" { - t.Fatalf("wrong value for h2.Msg. Got %s expected %s", r2.Msg, "clone") - } - -} - -type waitHandler struct { - ch chan Record -} - -func (h *waitHandler) Log(r *Record) error { - h.ch <- *r - return nil -} - -func TestBufferedHandler(t *testing.T) { - t.Parallel() - - ch := make(chan Record) - l := New() - l.SetHandler(BufferedHandler(0, &waitHandler{ch})) - - l.Debug("buffer") - if r := <-ch; r.Msg != "buffer" { - t.Fatalf("wrong value for r.Msg. Got %s expected %s", r.Msg, "") - } -} - -func TestLogContext(t *testing.T) { - t.Parallel() - - l, _, r := testLogger() - l = l.New("foo", "bar") - l.Crit("baz") - - if len(r.Ctx) != 2 { - t.Fatalf("Expected logger context in record context. Got length %d, expected %d", len(r.Ctx), 2) - } - - if r.Ctx[0] != "foo" { - t.Fatalf("Wrong context key, got %s expected %s", r.Ctx[0], "foo") - } - - if r.Ctx[1] != "bar" { - t.Fatalf("Wrong context value, got %s expected %s", r.Ctx[1], "bar") - } -} - -func TestLvlFilterHandler(t *testing.T) { - t.Parallel() - - l := New() - h, r := testHandler() - l.SetHandler(LvlFilterHandler(LvlWarn, h)) - l.Info("info'd") - - if r.Msg != "" { - t.Fatalf("Expected zero record, but got record with msg: %v", r.Msg) - } - - l.Warn("warned") - if r.Msg != "warned" { - t.Fatalf("Got record msg %s expected %s", r.Msg, "warned") - } - - l.Warn("error'd") - if r.Msg != "error'd" { - t.Fatalf("Got record msg %s expected %s", r.Msg, "error'd") - } -} - -func TestNetHandler(t *testing.T) { - t.Parallel() - - l, err := net.Listen("tcp", ":0") - if err != nil { - t.Fatalf("Failed to listen: %v", l) - } - - errs := make(chan error) - go func() { - c, err := l.Accept() - if err != nil { - t.Errorf("Failed to accept conneciton: %v", err) - return - } - - rd := bufio.NewReader(c) - s, err := rd.ReadString('\n') - if err != nil { - t.Errorf("Failed to read string: %v", err) - } - - got := s[27:] - expected := "lvl=info msg=test x=1\n" - if got != expected { - t.Errorf("Got log line %s, expected %s", got, expected) - } - - errs <- nil - }() - - lg := New() - lg.SetHandler(Must.NetHandler("tcp", l.Addr().String(), LogfmtFormat())) - lg.Info("test", "x", 1) - - select { - case <-time.After(time.Second): - t.Fatalf("Test timed out!") - case <-errs: - // ok - } -} - -func TestMatchFilterHandler(t *testing.T) { - t.Parallel() - - l, h, r := testLogger() - l.SetHandler(MatchFilterHandler("err", nil, h)) - - l.Crit("test", "foo", "bar") - if r.Msg != "" { - t.Fatalf("expected filter handler to discard msg") - } - - l.Crit("test2", "err", "bad fd") - if r.Msg != "" { - t.Fatalf("expected filter handler to discard msg") - } - - l.Crit("test3", "err", nil) - if r.Msg != "test3" { - t.Fatalf("expected filter handler to allow msg") - } -} - -func TestMatchFilterBuiltin(t *testing.T) { - t.Parallel() - - l, h, r := testLogger() - l.SetHandler(MatchFilterHandler("lvl", LvlError, h)) - l.Info("does not pass") - - if r.Msg != "" { - t.Fatalf("got info level record that should not have matched") - } - - l.Error("error!") - if r.Msg != "error!" { - t.Fatalf("did not get error level record that should have matched") - } - - r.Msg = "" - l.SetHandler(MatchFilterHandler("msg", "matching message", h)) - l.Info("doesn't match") - if r.Msg != "" { - t.Fatalf("got record with wrong message matched") - } - - l.Debug("matching message") - if r.Msg != "matching message" { - t.Fatalf("did not get record which matches") - } -} - -type failingWriter struct { - fail bool -} - -func (w *failingWriter) Write(buf []byte) (int, error) { - if w.fail { - return 0, errors.New("fail") - } else { - return len(buf), nil - } -} - -func TestFailoverHandler(t *testing.T) { - t.Parallel() - - l := New() - h, r := testHandler() - w := &failingWriter{false} - - l.SetHandler(FailoverHandler( - StreamHandler(w, JsonFormat()), - h)) - - l.Debug("test ok") - if r.Msg != "" { - t.Fatalf("expected no failover") - } - - w.fail = true - l.Debug("test failover", "x", 1) - if r.Msg != "test failover" { - t.Fatalf("expected failover") - } - - if len(r.Ctx) != 4 { - t.Fatalf("expected additional failover ctx") - } - - got := r.Ctx[2] - expected := "failover_err_0" - if got != expected { - t.Fatalf("expected failover ctx. got: %s, expected %s", got, expected) - } -} diff --git a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/logger.go b/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/logger.go deleted file mode 100644 index 8e9d252..0000000 --- a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/logger.go +++ /dev/null @@ -1,173 +0,0 @@ -package log15 - -import ( - "fmt" - "time" -) - -const lvlKey = "lvl" -const errorKey = "LOG15_ERROR" - -type Lvl int - -const ( - LvlCrit Lvl = iota - LvlError - LvlWarn - LvlInfo - LvlDebug -) - -// Returns the name of a Lvl -func (l Lvl) String() string { - switch l { - case LvlDebug: - return "dbug" - case LvlInfo: - return "info" - case LvlWarn: - return "warn" - case LvlError: - return "eror" - case LvlCrit: - return "crit" - default: - panic("bad level") - } -} - -// Returns the appropriate Lvl from a string name. -// Useful for parsing command line args and configuration files. -func LvlFromString(lvlString string) (Lvl, error) { - switch lvlString { - case "debug", "dbug": - return LvlDebug, nil - case "info": - return LvlInfo, nil - case "warn": - return LvlWarn, nil - case "error", "eror": - return LvlError, nil - case "crit": - return LvlCrit, nil - default: - return LvlDebug, fmt.Errorf("Unknown level: %v", lvlString) - } -} - -// A Record is what a Logger asks its handler to write -type Record struct { - Time time.Time - Lvl Lvl - Msg string - Ctx []interface{} -} - -// A Logger writes key/value pairs to a Handler -type Logger interface { - // New returns a new Logger that has this logger's context plus the given context - New(ctx ...interface{}) Logger - - // SetHandler updates the logger to write records to the specified handler. - SetHandler(h Handler) - - // Log a message at the given level with context key/value pairs - Debug(msg string, ctx ...interface{}) - Info(msg string, ctx ...interface{}) - Warn(msg string, ctx ...interface{}) - Error(msg string, ctx ...interface{}) - Crit(msg string, ctx ...interface{}) -} - -type logger struct { - ctx []interface{} - h *swapHandler -} - -func (l *logger) write(msg string, lvl Lvl, ctx []interface{}) { - l.h.Log(&Record{ - Time: time.Now(), - Lvl: lvl, - Msg: msg, - Ctx: append(l.ctx, normalize(ctx)...), - }) -} - -func (l *logger) New(ctx ...interface{}) Logger { - return &logger{append(l.ctx, normalize(ctx)...), l.h} -} - -func (l *logger) Debug(msg string, ctx ...interface{}) { - l.write(msg, LvlDebug, ctx) -} - -func (l *logger) Info(msg string, ctx ...interface{}) { - l.write(msg, LvlInfo, ctx) -} - -func (l *logger) Warn(msg string, ctx ...interface{}) { - l.write(msg, LvlWarn, ctx) -} - -func (l *logger) Error(msg string, ctx ...interface{}) { - l.write(msg, LvlError, ctx) -} - -func (l *logger) Crit(msg string, ctx ...interface{}) { - l.write(msg, LvlCrit, ctx) -} - -func (l *logger) SetHandler(h Handler) { - l.h.Swap(h) -} - -func normalize(ctx []interface{}) []interface{} { - // if the caller passed a Ctx object, then expand it - if len(ctx) == 1 { - if ctxMap, ok := ctx[0].(Ctx); ok { - ctx = ctxMap.toArray() - } - } - - // ctx needs to be even because it's a series of key/value pairs - // no one wants to check for errors on logging functions, - // so instead of erroring on bad input, we'll just make sure - // that things are the right length and users can fix bugs - // when they see the output looks wrong - if len(ctx)%2 != 0 { - ctx = append(ctx, nil, errorKey, "Normalized odd number of arguments by adding nil") - } - - return ctx -} - -// Lazy allows you to defer calculation of a logged value that is expensive -// to compute until it is certain that it must be evaluated with the given filters. -// -// Lazy may also be used in conjunction with a Logger's New() function -// to generate a child logger which always reports the current value of changing -// state. -// -// You may wrap any function which takes no arguments to Lazy. It may return any -// number of values of any type. -type Lazy struct { - Fn interface{} -} - -// Ctx is a map of key/value pairs to pass as context to a log function -// Use this only if you really need greater safety around the arguments you pass -// to the logging functions. -type Ctx map[string]interface{} - -func (c Ctx) toArray() []interface{} { - arr := make([]interface{}, len(c)*2) - - i := 0 - for k, v := range c { - arr[i] = k - arr[i+1] = v - i += 2 - } - - return arr -} diff --git a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/root.go b/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/root.go deleted file mode 100644 index 9677289..0000000 --- a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/root.go +++ /dev/null @@ -1,60 +0,0 @@ -package log15 - -import ( - "gopkg.in/inconshreveable/log15.v2/term" - "os" -) - -var ( - root Logger - StdoutHandler = StreamHandler(os.Stdout, LogfmtFormat()) - StderrHandler = StreamHandler(os.Stderr, LogfmtFormat()) -) - -func init() { - if term.IsTty(os.Stdout.Fd()) { - StdoutHandler = StreamHandler(os.Stdout, TerminalFormat()) - } - - if term.IsTty(os.Stderr.Fd()) { - StderrHandler = StreamHandler(os.Stderr, TerminalFormat()) - } - - root = &logger{[]interface{}{}, &swapHandler{handler: StdoutHandler}} -} - -// New returns a new logger with the given context. -// New is a convenient alias for Root().New -func New(ctx ...interface{}) Logger { - return root.New(ctx...) -} - -// Root returns the root logger -func Root() Logger { - return root -} - -// Debug is a convenient alias for Root().Debug -func Debug(msg string, ctx ...interface{}) { - root.Debug(msg, ctx...) -} - -// Info is a convenient alias for Root().Info -func Info(msg string, ctx ...interface{}) { - root.Info(msg, ctx...) -} - -// Warn is a convenient alias for Root().Warn -func Warn(msg string, ctx ...interface{}) { - root.Warn(msg, ctx...) -} - -// Error is a convenient alias for Root().Error -func Error(msg string, ctx ...interface{}) { - root.Error(msg, ctx...) -} - -// Crit is a convenient alias for Root().Crit -func Crit(msg string, ctx ...interface{}) { - root.Crit(msg, ctx...) -} diff --git a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/syslog.go b/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/syslog.go deleted file mode 100644 index 36c12b1..0000000 --- a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/syslog.go +++ /dev/null @@ -1,55 +0,0 @@ -// +build !windows,!plan9 - -package log15 - -import ( - "log/syslog" - "strings" -) - -// SyslogHandler opens a connection to the system syslog daemon by calling -// syslog.New and writes all records to it. -func SyslogHandler(tag string, fmtr Format) (Handler, error) { - wr, err := syslog.New(syslog.LOG_INFO, tag) - return sharedSyslog(fmtr, wr, err) -} - -// SyslogHandler opens a connection to a log daemon over the network and writes -// all log records to it. -func SyslogNetHandler(net, addr string, tag string, fmtr Format) (Handler, error) { - wr, err := syslog.Dial(net, addr, syslog.LOG_INFO, tag) - return sharedSyslog(fmtr, wr, err) -} - -func sharedSyslog(fmtr Format, sysWr *syslog.Writer, err error) (Handler, error) { - if err != nil { - return nil, err - } - h := FuncHandler(func(r *Record) error { - var syslogFn = sysWr.Info - switch r.Lvl { - case LvlCrit: - syslogFn = sysWr.Crit - case LvlError: - syslogFn = sysWr.Err - case LvlWarn: - syslogFn = sysWr.Warning - case LvlInfo: - syslogFn = sysWr.Info - case LvlDebug: - syslogFn = sysWr.Debug - } - - s := strings.TrimSpace(string(fmtr.Format(r))) - return syslogFn(s) - }) - return LazyHandler(&closingHandler{sysWr, h}), nil -} - -func (m muster) SyslogHandler(tag string, fmtr Format) Handler { - return must(SyslogHandler(tag, fmtr)) -} - -func (m muster) SyslogNetHandler(net, addr string, tag string, fmtr Format) Handler { - return must(SyslogNetHandler(net, addr, tag, fmtr)) -} diff --git a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/term/LICENSE b/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/term/LICENSE deleted file mode 100644 index f090cb4..0000000 --- a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/term/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Simon Eskildsen - -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/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/term/terminal_darwin.go b/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/term/terminal_darwin.go deleted file mode 100644 index b05de4c..0000000 --- a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/term/terminal_darwin.go +++ /dev/null @@ -1,12 +0,0 @@ -// Based on ssh/terminal: -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package term - -import "syscall" - -const ioctlReadTermios = syscall.TIOCGETA - -type Termios syscall.Termios diff --git a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/term/terminal_freebsd.go b/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/term/terminal_freebsd.go deleted file mode 100644 index cfaceab..0000000 --- a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/term/terminal_freebsd.go +++ /dev/null @@ -1,18 +0,0 @@ -package term - -import ( - "syscall" -) - -const ioctlReadTermios = syscall.TIOCGETA - -// Go 1.2 doesn't include Termios for FreeBSD. This should be added in 1.3 and this could be merged with terminal_darwin. -type Termios struct { - Iflag uint32 - Oflag uint32 - Cflag uint32 - Lflag uint32 - Cc [20]uint8 - Ispeed uint32 - Ospeed uint32 -} diff --git a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/term/terminal_linux.go b/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/term/terminal_linux.go deleted file mode 100644 index 5e2419c..0000000 --- a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/term/terminal_linux.go +++ /dev/null @@ -1,12 +0,0 @@ -// Based on ssh/terminal: -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package term - -import "syscall" - -const ioctlReadTermios = syscall.TCGETS - -type Termios syscall.Termios diff --git a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/term/terminal_notwindows.go b/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/term/terminal_notwindows.go deleted file mode 100644 index c0b201a..0000000 --- a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/term/terminal_notwindows.go +++ /dev/null @@ -1,20 +0,0 @@ -// Based on ssh/terminal: -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build linux,!appengine darwin freebsd - -package term - -import ( - "syscall" - "unsafe" -) - -// IsTty returns true if the given file descriptor is a terminal. -func IsTty(fd uintptr) bool { - var termios Termios - _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) - return err == 0 -} diff --git a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/term/terminal_windows.go b/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/term/terminal_windows.go deleted file mode 100644 index df3c30c..0000000 --- a/Godeps/_workspace/src/gopkg.in/inconshreveable/log15.v2/term/terminal_windows.go +++ /dev/null @@ -1,26 +0,0 @@ -// Based on ssh/terminal: -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -package term - -import ( - "syscall" - "unsafe" -) - -var kernel32 = syscall.NewLazyDLL("kernel32.dll") - -var ( - procGetConsoleMode = kernel32.NewProc("GetConsoleMode") -) - -// IsTty returns true if the given file descriptor is a terminal. -func IsTty(fd uintptr) bool { - var st uint32 - r, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, fd, uintptr(unsafe.Pointer(&st)), 0) - return r != 0 && e == 0 -}