| Index: service/info/interface.go
 | 
| diff --git a/service/info/interface.go b/service/info/interface.go
 | 
| index d35b9329b0268521237ef585a98a68e1cc1e0d5e..89c9c522f44a7e14d118b3af5abac06c838ccf7e 100644
 | 
| --- a/service/info/interface.go
 | 
| +++ b/service/info/interface.go
 | 
| @@ -5,6 +5,7 @@
 | 
|  package info
 | 
|  
 | 
|  import (
 | 
| +	"strings"
 | 
|  	"time"
 | 
|  
 | 
|  	"golang.org/x/net/context"
 | 
| @@ -15,7 +16,7 @@ import (
 | 
|  type RawInterface interface {
 | 
|  	AppID() string
 | 
|  	FullyQualifiedAppID() string
 | 
| -	GetNamespace() (string, bool)
 | 
| +	GetNamespace() string
 | 
|  
 | 
|  	Datacenter() string
 | 
|  	DefaultVersionHostname() string
 | 
| @@ -36,28 +37,9 @@ type RawInterface interface {
 | 
|  	PublicCertificates() ([]Certificate, error)
 | 
|  	SignBytes(bytes []byte) (keyName string, signature []byte, err error)
 | 
|  
 | 
| -	// Testable returns this Interface's Testable interface. Testing will return
 | 
| -	// nil if testing is not supported in this implementation.
 | 
| -	Testable() Testable
 | 
| -}
 | 
| -
 | 
| -// Interface is the interface for all of the package methods which normally
 | 
| -// would be in the 'appengine' package. This version adds a couple helper
 | 
| -// functions on top of the RawInterface.
 | 
| -type Interface interface {
 | 
| -	RawInterface
 | 
| -
 | 
| -	// TrimmedAppID gets the 'appid' portion of "foo.com:appid". This form can
 | 
| -	// occur if you use
 | 
| -	TrimmedAppID() string
 | 
| -
 | 
| -	// MustNamespace is the same as Namespace, but will panic if there's an error.
 | 
| -	// Since an error can only occur if namespace doesn't match the a regex this
 | 
| -	// is valid to use if the namespace you're using is statically known, or known
 | 
| -	// to conform to the regex. The regex in question is:
 | 
| -	//
 | 
| -	//   ^[0-9A-Za-z._-]{0,100}$
 | 
| -	MustNamespace(namespace string) context.Context
 | 
| +	// Testable returns this RawInterface's Testing interface. Testing will
 | 
| +	// return nil if testing is not supported in this implementation.
 | 
| +	GetTestable() Testable
 | 
|  }
 | 
|  
 | 
|  // Testable is an additional set of functions for testing instrumentation.
 | 
| @@ -65,3 +47,130 @@ type Testable interface {
 | 
|  	SetVersionID(string) context.Context
 | 
|  	SetRequestID(string) context.Context
 | 
|  }
 | 
| +
 | 
| +// AppID returns the current App ID.
 | 
| +func AppID(c context.Context) string {
 | 
| +	return Raw(c).AppID()
 | 
| +}
 | 
| +
 | 
| +// TrimmedAppID gets the 'appid' portion of "foo.com:appid". This form can
 | 
| +// occur if you use
 | 
| +func TrimmedAppID(c context.Context) string {
 | 
| +	toks := strings.Split(AppID(c), ":")
 | 
| +	return toks[len(toks)-1]
 | 
| +}
 | 
| +
 | 
| +// FullyQualifiedAppID returns the fully-qualified App ID.
 | 
| +func FullyQualifiedAppID(c context.Context) string {
 | 
| +	return Raw(c).FullyQualifiedAppID()
 | 
| +}
 | 
| +
 | 
| +// GetNamespace returns the current namespace. If the current namespace is the
 | 
| +// default namespace, GetNamespace will return an empty string.
 | 
| +func GetNamespace(c context.Context) string {
 | 
| +	return Raw(c).GetNamespace()
 | 
| +}
 | 
| +
 | 
| +// Datacenter returns the current datacenter.
 | 
| +func Datacenter(c context.Context) string {
 | 
| +	return Raw(c).Datacenter()
 | 
| +}
 | 
| +
 | 
| +// DefaultVersionHostname returns the default version hostname.
 | 
| +func DefaultVersionHostname(c context.Context) string {
 | 
| +	return Raw(c).DefaultVersionHostname()
 | 
| +}
 | 
| +
 | 
| +// InstanceID returns the current instance ID.
 | 
| +func InstanceID(c context.Context) string {
 | 
| +	return Raw(c).InstanceID()
 | 
| +}
 | 
| +
 | 
| +// IsDevAppServer returns true if running on a development server.
 | 
| +func IsDevAppServer(c context.Context) bool {
 | 
| +	return Raw(c).IsDevAppServer()
 | 
| +}
 | 
| +
 | 
| +// IsOverQuota returns true if the supplied error is an over quota error.
 | 
| +func IsOverQuota(c context.Context, err error) bool {
 | 
| +	return Raw(c).IsOverQuota(err)
 | 
| +}
 | 
| +
 | 
| +// IsTimeoutError returns true if the supplied error indicates a timeout.
 | 
| +func IsTimeoutError(c context.Context, err error) bool {
 | 
| +	return Raw(c).IsTimeoutError(err)
 | 
| +}
 | 
| +
 | 
| +// ModuleHostname returns the hostname of a module instance.
 | 
| +func ModuleHostname(c context.Context, module, version, instance string) (string, error) {
 | 
| +	return Raw(c).ModuleHostname(module, version, instance)
 | 
| +}
 | 
| +
 | 
| +// ModuleName returns the current module name.
 | 
| +func ModuleName(c context.Context) string {
 | 
| +	return Raw(c).ModuleName()
 | 
| +}
 | 
| +
 | 
| +// RequestID returns the current request ID.
 | 
| +func RequestID(c context.Context) string {
 | 
| +	return Raw(c).RequestID()
 | 
| +}
 | 
| +
 | 
| +// ServerSoftware returns the AppEngine release version.
 | 
| +func ServerSoftware(c context.Context) string {
 | 
| +	return Raw(c).ServerSoftware()
 | 
| +}
 | 
| +
 | 
| +// ServiceAccount returns the current service account name, in the form of an
 | 
| +// e-mail address.
 | 
| +func ServiceAccount(c context.Context) (string, error) {
 | 
| +	return Raw(c).ServiceAccount()
 | 
| +}
 | 
| +
 | 
| +// VersionID returns the version ID for the current application, in the form
 | 
| +// "X.Y".
 | 
| +func VersionID(c context.Context) string {
 | 
| +	return Raw(c).VersionID()
 | 
| +}
 | 
| +
 | 
| +// Namespace sets the current namespace. If the namespace is invalid or could
 | 
| +// not be set, an error will be returned.
 | 
| +func Namespace(c context.Context, namespace string) (context.Context, error) {
 | 
| +	return Raw(c).Namespace(namespace)
 | 
| +}
 | 
| +
 | 
| +// MustNamespace is the same as Namespace, but will panic if there's an error.
 | 
| +// Since an error can only occur if namespace doesn't match the a regex this
 | 
| +// is valid to use if the namespace you're using is statically known, or known
 | 
| +// to conform to the regex. The regex in question is:
 | 
| +//
 | 
| +//   ^[0-9A-Za-z._-]{0,100}$
 | 
| +func MustNamespace(c context.Context, namespace string) context.Context {
 | 
| +	ret, err := Namespace(c, namespace)
 | 
| +	if err != nil {
 | 
| +		panic(err)
 | 
| +	}
 | 
| +	return ret
 | 
| +}
 | 
| +
 | 
| +// AccessToken generates an OAuth2 access token for the specified scopes
 | 
| +// on behalf of the current ServiceAccount.
 | 
| +func AccessToken(c context.Context, scopes ...string) (token string, expiry time.Time, err error) {
 | 
| +	return Raw(c).AccessToken(scopes...)
 | 
| +}
 | 
| +
 | 
| +// PublicCertificates retrieves the public certificates of the app.
 | 
| +func PublicCertificates(c context.Context) ([]Certificate, error) {
 | 
| +	return Raw(c).PublicCertificates()
 | 
| +}
 | 
| +
 | 
| +// SignBytes signs bytes using the application's unique private key.
 | 
| +func SignBytes(c context.Context, bytes []byte) (keyName string, signature []byte, err error) {
 | 
| +	return Raw(c).SignBytes(bytes)
 | 
| +}
 | 
| +
 | 
| +// GetTestable returns this Interface's Testing interface. Testing will return
 | 
| +// nil if testing is not supported in this implementation.
 | 
| +func GetTestable(c context.Context) Testable {
 | 
| +	return Raw(c).GetTestable()
 | 
| +}
 | 
| 
 |