aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/_nuts/github.com/codegangsta/inject
diff options
context:
space:
mode:
authorTeddy Wing2015-06-06 19:25:17 -0400
committerTeddy Wing2015-06-06 19:25:17 -0400
commit1135764727f3dc525d0f674c784edbc81cc786f3 (patch)
tree5c402c88d3a07a3cde84237ead5829bda28f3e25 /vendor/_nuts/github.com/codegangsta/inject
downloadNew-House-on-the-Block-1135764727f3dc525d0f674c784edbc81cc786f3.tar.bz2
Initial commit. Install coinbase-go.
* Use nut for vendored dependencies * Install coinbase-go to interact with the Coinbase API
Diffstat (limited to 'vendor/_nuts/github.com/codegangsta/inject')
-rw-r--r--vendor/_nuts/github.com/codegangsta/inject/.gitignore2
-rw-r--r--vendor/_nuts/github.com/codegangsta/inject/LICENSE20
-rw-r--r--vendor/_nuts/github.com/codegangsta/inject/README.md92
-rw-r--r--vendor/_nuts/github.com/codegangsta/inject/inject.go187
-rw-r--r--vendor/_nuts/github.com/codegangsta/inject/inject_test.go159
-rw-r--r--vendor/_nuts/github.com/codegangsta/inject/translations/README_zh_cn.md85
-rw-r--r--vendor/_nuts/github.com/codegangsta/inject/update_readme.sh3
7 files changed, 548 insertions, 0 deletions
diff --git a/vendor/_nuts/github.com/codegangsta/inject/.gitignore b/vendor/_nuts/github.com/codegangsta/inject/.gitignore
new file mode 100644
index 0000000..df3df8a
--- /dev/null
+++ b/vendor/_nuts/github.com/codegangsta/inject/.gitignore
@@ -0,0 +1,2 @@
+inject
+inject.test
diff --git a/vendor/_nuts/github.com/codegangsta/inject/LICENSE b/vendor/_nuts/github.com/codegangsta/inject/LICENSE
new file mode 100644
index 0000000..eb68a0e
--- /dev/null
+++ b/vendor/_nuts/github.com/codegangsta/inject/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2013 Jeremy Saenz
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vendor/_nuts/github.com/codegangsta/inject/README.md b/vendor/_nuts/github.com/codegangsta/inject/README.md
new file mode 100644
index 0000000..679abe0
--- /dev/null
+++ b/vendor/_nuts/github.com/codegangsta/inject/README.md
@@ -0,0 +1,92 @@
+# inject
+--
+ import "github.com/codegangsta/inject"
+
+Package inject provides utilities for mapping and injecting dependencies in
+various ways.
+
+Language Translations:
+* [简体中文](translations/README_zh_cn.md)
+
+## Usage
+
+#### func InterfaceOf
+
+```go
+func InterfaceOf(value interface{}) reflect.Type
+```
+InterfaceOf dereferences a pointer to an Interface type. It panics if value is
+not an pointer to an interface.
+
+#### type Applicator
+
+```go
+type Applicator interface {
+ // Maps dependencies in the Type map to each field in the struct
+ // that is tagged with 'inject'. Returns an error if the injection
+ // fails.
+ Apply(interface{}) error
+}
+```
+
+Applicator represents an interface for mapping dependencies to a struct.
+
+#### type Injector
+
+```go
+type Injector interface {
+ Applicator
+ Invoker
+ TypeMapper
+ // SetParent sets the parent of the injector. If the injector cannot find a
+ // dependency in its Type map it will check its parent before returning an
+ // error.
+ SetParent(Injector)
+}
+```
+
+Injector represents an interface for mapping and injecting dependencies into
+structs and function arguments.
+
+#### func New
+
+```go
+func New() Injector
+```
+New returns a new Injector.
+
+#### type Invoker
+
+```go
+type Invoker interface {
+ // Invoke attempts to call the interface{} provided as a function,
+ // providing dependencies for function arguments based on Type. Returns
+ // a slice of reflect.Value representing the returned values of the function.
+ // Returns an error if the injection fails.
+ Invoke(interface{}) ([]reflect.Value, error)
+}
+```
+
+Invoker represents an interface for calling functions via reflection.
+
+#### type TypeMapper
+
+```go
+type TypeMapper interface {
+ // Maps the interface{} value based on its immediate type from reflect.TypeOf.
+ Map(interface{}) TypeMapper
+ // Maps the interface{} value based on the pointer of an Interface provided.
+ // This is really only useful for mapping a value as an interface, as interfaces
+ // cannot at this time be referenced directly without a pointer.
+ MapTo(interface{}, interface{}) TypeMapper
+ // Provides a possibility to directly insert a mapping based on type and value.
+ // This makes it possible to directly map type arguments not possible to instantiate
+ // with reflect like unidirectional channels.
+ Set(reflect.Type, reflect.Value) TypeMapper
+ // Returns the Value that is mapped to the current type. Returns a zeroed Value if
+ // the Type has not been mapped.
+ Get(reflect.Type) reflect.Value
+}
+```
+
+TypeMapper represents an interface for mapping interface{} values based on type.
diff --git a/vendor/_nuts/github.com/codegangsta/inject/inject.go b/vendor/_nuts/github.com/codegangsta/inject/inject.go
new file mode 100644
index 0000000..3ff713c
--- /dev/null
+++ b/vendor/_nuts/github.com/codegangsta/inject/inject.go
@@ -0,0 +1,187 @@
+// Package inject provides utilities for mapping and injecting dependencies in various ways.
+package inject
+
+import (
+ "fmt"
+ "reflect"
+)
+
+// Injector represents an interface for mapping and injecting dependencies into structs
+// and function arguments.
+type Injector interface {
+ Applicator
+ Invoker
+ TypeMapper
+ // SetParent sets the parent of the injector. If the injector cannot find a
+ // dependency in its Type map it will check its parent before returning an
+ // error.
+ SetParent(Injector)
+}
+
+// Applicator represents an interface for mapping dependencies to a struct.
+type Applicator interface {
+ // Maps dependencies in the Type map to each field in the struct
+ // that is tagged with 'inject'. Returns an error if the injection
+ // fails.
+ Apply(interface{}) error
+}
+
+// Invoker represents an interface for calling functions via reflection.
+type Invoker interface {
+ // Invoke attempts to call the interface{} provided as a function,
+ // providing dependencies for function arguments based on Type. Returns
+ // a slice of reflect.Value representing the returned values of the function.
+ // Returns an error if the injection fails.
+ Invoke(interface{}) ([]reflect.Value, error)
+}
+
+// TypeMapper represents an interface for mapping interface{} values based on type.
+type TypeMapper interface {
+ // Maps the interface{} value based on its immediate type from reflect.TypeOf.
+ Map(interface{}) TypeMapper
+ // Maps the interface{} value based on the pointer of an Interface provided.
+ // This is really only useful for mapping a value as an interface, as interfaces
+ // cannot at this time be referenced directly without a pointer.
+ MapTo(interface{}, interface{}) TypeMapper
+ // Provides a possibility to directly insert a mapping based on type and value.
+ // This makes it possible to directly map type arguments not possible to instantiate
+ // with reflect like unidirectional channels.
+ Set(reflect.Type, reflect.Value) TypeMapper
+ // Returns the Value that is mapped to the current type. Returns a zeroed Value if
+ // the Type has not been mapped.
+ Get(reflect.Type) reflect.Value
+}
+
+type injector struct {
+ values map[reflect.Type]reflect.Value
+ parent Injector
+}
+
+// InterfaceOf dereferences a pointer to an Interface type.
+// It panics if value is not an pointer to an interface.
+func InterfaceOf(value interface{}) reflect.Type {
+ t := reflect.TypeOf(value)
+
+ for t.Kind() == reflect.Ptr {
+ t = t.Elem()
+ }
+
+ if t.Kind() != reflect.Interface {
+ panic("Called inject.InterfaceOf with a value that is not a pointer to an interface. (*MyInterface)(nil)")
+ }
+
+ return t
+}
+
+// New returns a new Injector.
+func New() Injector {
+ return &injector{
+ values: make(map[reflect.Type]reflect.Value),
+ }
+}
+
+// Invoke attempts to call the interface{} provided as a function,
+// providing dependencies for function arguments based on Type.
+// Returns a slice of reflect.Value representing the returned values of the function.
+// Returns an error if the injection fails.
+// It panics if f is not a function
+func (inj *injector) Invoke(f interface{}) ([]reflect.Value, error) {
+ t := reflect.TypeOf(f)
+
+ var in = make([]reflect.Value, t.NumIn()) //Panic if t is not kind of Func
+ for i := 0; i < t.NumIn(); i++ {
+ argType := t.In(i)
+ val := inj.Get(argType)
+ if !val.IsValid() {
+ return nil, fmt.Errorf("Value not found for type %v", argType)
+ }
+
+ in[i] = val
+ }
+
+ return reflect.ValueOf(f).Call(in), nil
+}
+
+// Maps dependencies in the Type map to each field in the struct
+// that is tagged with 'inject'.
+// Returns an error if the injection fails.
+func (inj *injector) Apply(val interface{}) error {
+ v := reflect.ValueOf(val)
+
+ for v.Kind() == reflect.Ptr {
+ v = v.Elem()
+ }
+
+ if v.Kind() != reflect.Struct {
+ return nil // Should not panic here ?
+ }
+
+ t := v.Type()
+
+ for i := 0; i < v.NumField(); i++ {
+ f := v.Field(i)
+ structField := t.Field(i)
+ if f.CanSet() && (structField.Tag == "inject" || structField.Tag.Get("inject") != "") {
+ ft := f.Type()
+ v := inj.Get(ft)
+ if !v.IsValid() {
+ return fmt.Errorf("Value not found for type %v", ft)
+ }
+
+ f.Set(v)
+ }
+
+ }
+
+ return nil
+}
+
+// Maps the concrete value of val to its dynamic type using reflect.TypeOf,
+// It returns the TypeMapper registered in.
+func (i *injector) Map(val interface{}) TypeMapper {
+ i.values[reflect.TypeOf(val)] = reflect.ValueOf(val)
+ return i
+}
+
+func (i *injector) MapTo(val interface{}, ifacePtr interface{}) TypeMapper {
+ i.values[InterfaceOf(ifacePtr)] = reflect.ValueOf(val)
+ return i
+}
+
+// Maps the given reflect.Type to the given reflect.Value and returns
+// the Typemapper the mapping has been registered in.
+func (i *injector) Set(typ reflect.Type, val reflect.Value) TypeMapper {
+ i.values[typ] = val
+ return i
+}
+
+func (i *injector) Get(t reflect.Type) reflect.Value {
+ val := i.values[t]
+
+ if val.IsValid() {
+ return val
+ }
+
+ // no concrete types found, try to find implementors
+ // if t is an interface
+ if t.Kind() == reflect.Interface {
+ for k, v := range i.values {
+ if k.Implements(t) {
+ val = v
+ break
+ }
+ }
+ }
+
+ // Still no type found, try to look it up on the parent
+ if !val.IsValid() && i.parent != nil {
+ val = i.parent.Get(t)
+ }
+
+ return val
+
+}
+
+func (i *injector) SetParent(parent Injector) {
+ i.parent = parent
+}
diff --git a/vendor/_nuts/github.com/codegangsta/inject/inject_test.go b/vendor/_nuts/github.com/codegangsta/inject/inject_test.go
new file mode 100644
index 0000000..4b315b8
--- /dev/null
+++ b/vendor/_nuts/github.com/codegangsta/inject/inject_test.go
@@ -0,0 +1,159 @@
+package inject_test
+
+import (
+ "fmt"
+ "com.teddywing/new-house-on-the-block/vendor/_nuts/github.com/codegangsta/inject"
+ "reflect"
+ "testing"
+)
+
+type SpecialString interface {
+}
+
+type TestStruct struct {
+ Dep1 string `inject:"t" json:"-"`
+ Dep2 SpecialString `inject`
+ Dep3 string
+}
+
+type Greeter struct {
+ Name string
+}
+
+func (g *Greeter) String() string {
+ return "Hello, My name is" + g.Name
+}
+
+/* Test Helpers */
+func expect(t *testing.T, a interface{}, b interface{}) {
+ if a != b {
+ t.Errorf("Expected %v (type %v) - Got %v (type %v)", b, reflect.TypeOf(b), a, reflect.TypeOf(a))
+ }
+}
+
+func refute(t *testing.T, a interface{}, b interface{}) {
+ if a == b {
+ t.Errorf("Did not expect %v (type %v) - Got %v (type %v)", b, reflect.TypeOf(b), a, reflect.TypeOf(a))
+ }
+}
+
+func Test_InjectorInvoke(t *testing.T) {
+ injector := inject.New()
+ expect(t, injector == nil, false)
+
+ dep := "some dependency"
+ injector.Map(dep)
+ dep2 := "another dep"
+ injector.MapTo(dep2, (*SpecialString)(nil))
+ dep3 := make(chan *SpecialString)
+ dep4 := make(chan *SpecialString)
+ typRecv := reflect.ChanOf(reflect.RecvDir, reflect.TypeOf(dep3).Elem())
+ typSend := reflect.ChanOf(reflect.SendDir, reflect.TypeOf(dep4).Elem())
+ injector.Set(typRecv, reflect.ValueOf(dep3))
+ injector.Set(typSend, reflect.ValueOf(dep4))
+
+ _, err := injector.Invoke(func(d1 string, d2 SpecialString, d3 <-chan *SpecialString, d4 chan<- *SpecialString) {
+ expect(t, d1, dep)
+ expect(t, d2, dep2)
+ expect(t, reflect.TypeOf(d3).Elem(), reflect.TypeOf(dep3).Elem())
+ expect(t, reflect.TypeOf(d4).Elem(), reflect.TypeOf(dep4).Elem())
+ expect(t, reflect.TypeOf(d3).ChanDir(), reflect.RecvDir)
+ expect(t, reflect.TypeOf(d4).ChanDir(), reflect.SendDir)
+ })
+
+ expect(t, err, nil)
+}
+
+func Test_InjectorInvokeReturnValues(t *testing.T) {
+ injector := inject.New()
+ expect(t, injector == nil, false)
+
+ dep := "some dependency"
+ injector.Map(dep)
+ dep2 := "another dep"
+ injector.MapTo(dep2, (*SpecialString)(nil))
+
+ result, err := injector.Invoke(func(d1 string, d2 SpecialString) string {
+ expect(t, d1, dep)
+ expect(t, d2, dep2)
+ return "Hello world"
+ })
+
+ expect(t, result[0].String(), "Hello world")
+ expect(t, err, nil)
+}
+
+func Test_InjectorApply(t *testing.T) {
+ injector := inject.New()
+
+ injector.Map("a dep").MapTo("another dep", (*SpecialString)(nil))
+
+ s := TestStruct{}
+ err := injector.Apply(&s)
+ expect(t, err, nil)
+
+ expect(t, s.Dep1, "a dep")
+ expect(t, s.Dep2, "another dep")
+ expect(t, s.Dep3, "")
+}
+
+func Test_InterfaceOf(t *testing.T) {
+ iType := inject.InterfaceOf((*SpecialString)(nil))
+ expect(t, iType.Kind(), reflect.Interface)
+
+ iType = inject.InterfaceOf((**SpecialString)(nil))
+ expect(t, iType.Kind(), reflect.Interface)
+
+ // Expecting nil
+ defer func() {
+ rec := recover()
+ refute(t, rec, nil)
+ }()
+ iType = inject.InterfaceOf((*testing.T)(nil))
+}
+
+func Test_InjectorSet(t *testing.T) {
+ injector := inject.New()
+ typ := reflect.TypeOf("string")
+ typSend := reflect.ChanOf(reflect.SendDir, typ)
+ typRecv := reflect.ChanOf(reflect.RecvDir, typ)
+
+ // instantiating unidirectional channels is not possible using reflect
+ // http://golang.org/src/pkg/reflect/value.go?s=60463:60504#L2064
+ chanRecv := reflect.MakeChan(reflect.ChanOf(reflect.BothDir, typ), 0)
+ chanSend := reflect.MakeChan(reflect.ChanOf(reflect.BothDir, typ), 0)
+
+ injector.Set(typSend, chanSend)
+ injector.Set(typRecv, chanRecv)
+
+ expect(t, injector.Get(typSend).IsValid(), true)
+ expect(t, injector.Get(typRecv).IsValid(), true)
+ expect(t, injector.Get(chanSend.Type()).IsValid(), false)
+}
+
+func Test_InjectorGet(t *testing.T) {
+ injector := inject.New()
+
+ injector.Map("some dependency")
+
+ expect(t, injector.Get(reflect.TypeOf("string")).IsValid(), true)
+ expect(t, injector.Get(reflect.TypeOf(11)).IsValid(), false)
+}
+
+func Test_InjectorSetParent(t *testing.T) {
+ injector := inject.New()
+ injector.MapTo("another dep", (*SpecialString)(nil))
+
+ injector2 := inject.New()
+ injector2.SetParent(injector)
+
+ expect(t, injector2.Get(inject.InterfaceOf((*SpecialString)(nil))).IsValid(), true)
+}
+
+func TestInjectImplementors(t *testing.T) {
+ injector := inject.New()
+ g := &Greeter{"Jeremy"}
+ injector.Map(g)
+
+ expect(t, injector.Get(inject.InterfaceOf((*fmt.Stringer)(nil))).IsValid(), true)
+}
diff --git a/vendor/_nuts/github.com/codegangsta/inject/translations/README_zh_cn.md b/vendor/_nuts/github.com/codegangsta/inject/translations/README_zh_cn.md
new file mode 100644
index 0000000..0ac3d3f
--- /dev/null
+++ b/vendor/_nuts/github.com/codegangsta/inject/translations/README_zh_cn.md
@@ -0,0 +1,85 @@
+# inject
+--
+ import "github.com/codegangsta/inject"
+
+inject包提供了多种对实体的映射和依赖注入方式。
+
+## 用法
+
+#### func InterfaceOf
+
+```go
+func InterfaceOf(value interface{}) reflect.Type
+```
+函数InterfaceOf返回指向接口类型的指针。如果传入的value值不是指向接口的指针,将抛出一个panic异常。
+
+#### type Applicator
+
+```go
+type Applicator interface {
+ // 在Type map中维持对结构体中每个域的引用并用'inject'来标记
+ // 如果注入失败将会返回一个error.
+ Apply(interface{}) error
+}
+```
+
+Applicator接口表示到结构体的依赖映射关系。
+
+#### type Injector
+
+```go
+type Injector interface {
+ Applicator
+ Invoker
+ TypeMapper
+ // SetParent用来设置父injector. 如果在当前injector的Type map中找不到依赖,
+ // 将会继续从它的父injector中找,直到返回error.
+ SetParent(Injector)
+}
+```
+
+Injector接口表示对结构体、函数参数的映射和依赖注入。
+
+#### func New
+
+```go
+func New() Injector
+```
+New创建并返回一个Injector.
+
+#### type Invoker
+
+```go
+type Invoker interface {
+ // Invoke尝试将interface{}作为一个函数来调用,并基于Type为函数提供参数。
+ // 它将返回reflect.Value的切片,其中存放原函数的返回值。
+ // 如果注入失败则返回error.
+ Invoke(interface{}) ([]reflect.Value, error)
+}
+```
+
+Invoker接口表示通过反射进行函数调用。
+
+#### type TypeMapper
+
+```go
+type TypeMapper interface {
+ // 基于调用reflect.TypeOf得到的类型映射interface{}的值。
+ Map(interface{}) TypeMapper
+ // 基于提供的接口的指针映射interface{}的值。
+ // 该函数仅用来将一个值映射为接口,因为接口无法不通过指针而直接引用到。
+ MapTo(interface{}, interface{}) TypeMapper
+ // 为直接插入基于类型和值的map提供一种可能性。
+ // 它使得这一类直接映射成为可能:无法通过反射直接实例化的类型参数,如单向管道。
+ Set(reflect.Type, reflect.Value) TypeMapper
+ // 返回映射到当前类型的Value. 如果Type没被映射,将返回对应的零值。
+ Get(reflect.Type) reflect.Value
+}
+```
+
+TypeMapper接口用来表示基于类型到接口值的映射。
+
+
+## 译者
+
+张强 (qqbunny@yeah.net) \ No newline at end of file
diff --git a/vendor/_nuts/github.com/codegangsta/inject/update_readme.sh b/vendor/_nuts/github.com/codegangsta/inject/update_readme.sh
new file mode 100644
index 0000000..497f9a5
--- /dev/null
+++ b/vendor/_nuts/github.com/codegangsta/inject/update_readme.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+go get github.com/robertkrimen/godocdown/godocdown
+godocdown > README.md