Index: go/src/infra/gae/libs/gae/doc.go |
diff --git a/go/src/infra/gae/libs/gae/doc.go b/go/src/infra/gae/libs/gae/doc.go |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a42695bac5e402f1eeecd60667eb74c1051b4423 |
--- /dev/null |
+++ b/go/src/infra/gae/libs/gae/doc.go |
@@ -0,0 +1,62 @@ |
+// Copyright 2015 The Chromium 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 gae provides a fakable wrapped interface for the appengine SDK's |
+// APIs. This means that it's possible to mock all of the supported appengine |
+// APIs for testing (or potentially implement a different backend for them). |
+// |
+// gae currently provides interfaces for: |
+// * Datastore |
+// * Memcache |
+// * TaskQueue |
+// * GlobalInfo (e.g. Namespace, AppID, etc.) |
+// |
+// A package which implements the gae is expected to provide the following: |
+// * A package function `Enable(c context.Context, ...) context.Context` |
+// This function is expected to add any information to c which is necessary |
+// for the rest of its implementations to work. This may be something like |
+// an `appengine.Context` or some connection information for an external |
+// server. The `...` in the function signature may be any additional data |
+// needed. |
+// * Any of the package functions: |
+// |
+// UseDS(context.Context) context.Context |
+// UseMC(context.Context) context.Context |
+// UseTQ(context.Context) context.Context |
+// UseGI(context.Context) context.Context |
+// |
+// each of which would call gae.Set<service>Factory with the factory |
+// function for that interface type. |
+// * A `Use(context.Context) context.Context` function which calls all of the |
+// `Use*` package functions implemented by the package. |
+// * Partially-implemented interfaces should embed one of the Dummy* structs |
+// which will panic with an appropriate error for unimplemented |
+// methods. |
+// |
+// see "infra/gae/libs/gae/oldsdk" for an appengine-backed implementation. |
+// |
+// Datastore struct serialization uses the tag name 'gae' instead of 'datastore', |
+// and uses gae.DSKey but otherwise behaves identically. You must use the |
+// new-SDK primitive types (like GeoPoint, ByteString, etc.), even when using |
+// the old-SDK implementation of the factories. This was done to ensure that all |
+// code written against gae is go-gettable, and was deemed as less-annoying than |
+// re-defining all of the types identically. |
+// |
+// Kinds/Keys work similarly to how they work in goon (except you no longer use |
+// the goon + datastore tags and key/control-related tags start with $): |
+// |
+// type FooModel struct { |
+// _kind string `gae:"$kind,Foo"` |
+// Id string `gae:"$id"` |
+// Parent DSKey `gae:"$parent"` |
+// |
+// privateSkipped bool |
+// AutoSave int |
+// NoSaveField string `gae:"-"` |
+// NoIndexField float `gae:",noindex"` |
+// DiffName string `gae:"coolName"` |
+// } |
+// |
+// func (FooModel) GetCachePolicy() DSCacheFlags { return DSCache } |
+package gae |