diff options
| author | Teddy Wing | 2015-06-06 19:25:17 -0400 | 
|---|---|---|
| committer | Teddy Wing | 2015-06-06 19:25:17 -0400 | 
| commit | 1135764727f3dc525d0f674c784edbc81cc786f3 (patch) | |
| tree | 5c402c88d3a07a3cde84237ead5829bda28f3e25 /vendor/_nuts/github.com/codegangsta/inject | |
| download | New-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')
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 | 
