| Index: README.md
|
| diff --git a/README.md b/README.md
|
| index 698340fec8f83aed0d33313cd5cc69a516639876..1186465f7333ab2020be58e0ea07b465bbca32db 100644
|
| --- a/README.md
|
| +++ b/README.md
|
| @@ -1,16 +1,234 @@
|
| -## Google Cloud Platform
|
| +## Google Cloud Platform support package (gcloud)
|
|
|
| -High level interface for Google Cloud Platform APIs
|
| +The `gcloud` package provides a high level "idomatic Dart" interface to
|
| +some of the most widely used Google Cloud Platform services. Currently the
|
| +following services are supported:
|
| +
|
| + * Cloud Datastore
|
| + * Cloud Storage
|
| + * Cloud Pub/Sub
|
| +
|
| +The APIs in this package are all based on the generic generated APIs in the
|
| +[googleapis] and [googleapis_beta][googleapisbeta] packages.
|
| +
|
| +This means that the authentication model for using the APIs in this package
|
| +uses the [googleapis_auth][googleapisauth] package.
|
| +
|
| +Note that this package is only intended for being used with the standalone VM
|
| +in a server or command line application. Don't expect this package to work on
|
| +the browser.
|
| +
|
| +The code snippets below demonstrating the use of this package all assume that
|
| +the following imports are present:
|
| +
|
| +```dart
|
| +import 'package:googleapis_auth/auth_io.dart' as auth;
|
| +import 'package:http/http.dart' as http;
|
| +import 'package:gcloud/db.dart';
|
| +import 'package:gcloud/storage.dart';
|
| +import 'package:gcloud/pubsub.dart';
|
| +import 'package:gcloud/service_scope.dart' as ss;
|
| +import 'package:gcloud/src/datastore_impl.dart';
|
| +```
|
| +
|
| +### Getting access to the APIs
|
| +
|
| +The first step in using the APIs is to get an authenticated HTTP client and
|
| +with that create API class instances for accessing the different APIs. The
|
| +code below assumes that you have a Google Cloud Project called `my-project`
|
| +with credentials for a service account from that project stored in the file
|
| +`my-project.json`.
|
| +
|
| +```dart
|
| +// Read the service account credentials from the file.
|
| +var jsonCredentials = new File('my-project.json').readAsStringSync();
|
| +var credentials = new auth.ServiceAccountCredentials.fromJson(jsonCredentials);
|
| +
|
| +// Get an HTTP authenticated client using the service account credentials.
|
| +var scopes = []
|
| + ..addAll(dastore_impl.DatastoreImpl.SCOPES);
|
| + ..addAll(Storage.SCOPES)
|
| + ..addAll(PubSub.SCOPES)
|
| +var client = await auth.clientViaServiceAccount(creds, scopes);
|
| +
|
| +// Instantiate objects to access Cloud Datastore, Cloud Storage
|
| +// and Cloud Pub/Sub APIs.
|
| +var db = new DatastoreDB(
|
| + new dastore_impl.DatastoreImpl(client, 's~my-project'));
|
| +var storage = new Storage(client, 'my-project');
|
| +var pubsub = new PubSub(client, 'my-project');
|
| +```
|
| +
|
| +All the APIs in this package supports the use of 'service scopes'. Service
|
| +scopes are described in details below.
|
| +
|
| +```dart
|
| +ss.fork(() {
|
| + // register the services in the new service scope.
|
| + registerDbService(db);
|
| + registerStorageService(storage);
|
| + registerPubSubService(pubsub);
|
| +
|
| + // Run application using these services.
|
| +});
|
| +```
|
| +
|
| +The services registered with the service scope can now be reached from within
|
| +all the code running in the same service scope using the below getters.
|
| +
|
| +```dart
|
| +dbService.
|
| +storageService.
|
| +pubsubService.
|
| +```
|
| +
|
| +This way it is not necessary to pass the service objects around in your code.
|
| +
|
| +### Use with App Engine
|
| +
|
| +The `gcloud` package is also integrated in the Dart [appengine] package. This
|
| +means the `gcloud` services are available both via the appengine context and
|
| +service scopes. The authentication required to access the Google Cloud Platform
|
| +services is handled automatically.
|
| +
|
| +This means that getting to the App Engine Datastore can be through either
|
| +the App Engine context
|
| +
|
| +```dart
|
| +var db = context.services.db;
|
| +```
|
| +
|
| +or just using the service scope registration.
|
| +
|
| +```dart
|
| +var db = dbService;
|
| +```
|
| +
|
| +## Cloud Datastore
|
| +Google Cloud Datastore provide a NoSQL, schemaless database for storing
|
| +non-relational data. See the product page
|
| +[https://cloud.google.com/datastore/][Datastore] for more information.
|
| +
|
| +The Cloud Datastore API provides a mapping of Dart objects to entities stored
|
| +in the Datastore. The following example shows how to annotate a class to
|
| +make it possible to store instances of it in the Datastore.
|
| +
|
| +```dart
|
| +@db.Kind()
|
| +class Person extends db.Model {
|
| + @db.StringProperty()
|
| + String name;
|
| +
|
| + @db.IntProperty()
|
| + int age;
|
| +}
|
| +```
|
| +
|
| +The `Kind` annotation tell that instances of this class can be stored. The
|
| +class must also inherit from `Model`. Now to store an object into the
|
| +Datastore create an instance and use the `commit` function.
|
| +
|
| +```dart
|
| +var person = new Person()
|
| + ..name = ''
|
| + ..age = 42;
|
| +await db.commit(inserts: [person]);
|
| +```
|
| +
|
| +The function `query` is used to build a `Query` object which can be run to
|
| +perform the query.
|
| +
|
| +```dart
|
| +var persons = (await db.query(Person).run()).toList();
|
| +```
|
| +
|
| +NOTE: This package include a lower level API provided through the class
|
| +`Datastore` on top of which the `DatastoreDB` API is build. The main reason
|
| +for this additional API level is to bridge the gap between the different APIs
|
| +exposed inside App Engine and through the public REST API. We reserve the
|
| +rights to modify and maybe even remove this additional layer at any time.
|
| +
|
| +## Cloud Storage
|
| +Google Cloud Storage provide a highly available object store (aka BLOB
|
| +store). See the product page [https://cloud.google.com/storage/][GCS]
|
| +for more information.
|
| +
|
| +In Cloud Storage the objects (BLOBs) are organized in _buckets_. Each bucket
|
| +has a name in a global namespace. The following code creates a new bucket
|
| +named `my-bucket` and writes the content of the file `my-file.txt` to the
|
| +object named `my-object`.
|
| +
|
| +```dart
|
| +var bucket = await storage.createBucket('my-bucket');
|
| +new File('my-file.txt').openRead().pipe(bucket.write('my-object'));
|
| +```
|
| +
|
| +The following code will read back the object.
|
| +
|
| +```dart
|
| +bucket.read('my-object').pipe(new File('my-file-copy.txt').openWrite());
|
| +```
|
| +
|
| +## Cloud Pub/Sub
|
| +Google Cloud Pub/Sub provides many-to-many, asynchronous messaging. See the
|
| +product page [https://cloud.google.com/pubsub/][PubSub] for more information.
|
| +
|
| +Cloud Pub/Sub uses two concepts for messaging. _Topics_ are used if you want
|
| +to send messages and _subscriptions_ are used to subscribe to topics and
|
| +receive the messages. This decouples the producer of a message from the
|
| +consumer of a message.
|
| +
|
| +The following code creates a _topic_ and sends a simple test message:
|
| +
|
| +```dart
|
| +var topic = await pubsub.createTopic('my'topic');
|
| +await topic.publishString('Hello, world!')
|
| +```
|
| +
|
| +With the following code a _subscription_ is created on the _topic_ and
|
| +a message is pulled using the subscription. A received message must be
|
| +acknowledged when the consumer has processed it.
|
| +
|
| +```dart
|
| +var subscription =
|
| + await pubsub.createSubscription('my-subscription', 'my-topic);
|
| +var pullEvent = await subscription.pull();
|
| +print(pullEvent.message.asString);
|
| +await pullEvent.acknowledge()
|
| +```
|
| +
|
| +It is also possible to receive messages using push events instead of pulling
|
| +from the subscription. To do this the subscription should be configured as a
|
| +push subscription with an HTTP endpoint.
|
| +
|
| +```dart
|
| +await pubsub.createSubscription(
|
| + 'my-subscription',
|
| + 'my-topic',
|
| + endpoint: Uri.parse('https://server.example.com/push'));
|
| +```
|
| +
|
| +With this subscription all messages will be send to the URL provided in the
|
| +`endpoint` argument. The server needs to acknowledge the reception of the
|
| +message with a `200 OK` reply.
|
|
|
| ### Running tests
|
|
|
| If you want to run the end-to-end tests, a Google Cloud project is required.
|
| -When running these tests the following envrionment variables needs to be set:
|
| +When running these tests the following environment variables need to be set:
|
|
|
| GCLOUD_E2E_TEST_PROJECT
|
| GCLOUD_E2E_TEST_KEY
|
|
|
| The vaule of the environment variable `GCLOUD_E2E_TEST_PROJECT` is the name
|
| of the Google Cloud project to use. The value of the environment variable
|
| -`GCLOUD_E2E_TEST_KEY` is a Google Cloud Storage path (starting wiht `gs://`)
|
| +`GCLOUD_E2E_TEST_KEY` is a Google Cloud Storage path (starting with `gs://`)
|
| to a JSON key file for a service account providing access to the Cloud Project.
|
| +
|
| +[Datastore]: https://cloud.google.com/datastore/
|
| +[GCS]: https://cloud.google.com/storage/
|
| +[PubSub]: https://cloud.google.com/pubsub/
|
| +[googleapis]: https://pub.dartlang.org/packages/googleapis
|
| +[googleapisbeta]: https://pub.dartlang.org/packages/googleapis_beta
|
| +[googleapisauth]: https://pub.dartlang.org/packages/googleapis_beta
|
| +[appengine]: https://pub.dartlang.org/packages/appengine
|
|
|