-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Description
Moved over from #910 per @dhermes
Goal of this issue is to decide:
- Is it reasonable to provide one-liners to do things like
create_topic()
which is just a wrapper:
python def create_topic(self, name): topic = self.topic(name) topic.create() return topic
- Can we agree on the naming convention of what does and does not require an API request
Comment from the pull request was...
The name create_topic is ambiguous to new users. Does it mean create a Topic instance or actual insert one?
That's a good point. I think we should adopt the attitude that client.<verb>_<noun>()
is an API request. So create_topic
would hit the API trying to 'insert' the topic (using Google's API lingo). client.<noun>
is nothing more than a factory for the noun which won't fire an API request but gives you back an instance of the .
We'd need to offer Client.topic and Client.create_topic side-by-side since users would need to construct pre-existing topics without sending insert.
Totally agree -- I think we had this debate already and I'm totally sold on the need for .topic()
as the sole way to get a hold of a topic object, without hitting the API (as the topic literally has zero extra metadata).
For other APIs, where the object itself holds lots of (potentially important) metadata, I think it might be worthwhile to provide a get_<noun>()
to pull down that metadata, in addition to the <noun>()
method which just gives you an object which may not be tied to the remote (authoritative) representation.
An example here might be bucket
.
.bucket()
gives me a bucket object, sans remote data (no API request).create_bucket()
explicitly creates the bucket in the remote service, throwing an error if I was unable to do so.get_bucket()
would be an API request that gives me all the metadata about a bucket.
Note that the <verb>_bucket()
methods are really just shortcuts so that I can have one-liners for the common things I want to do with a bucket. (ie, create
== bucket = client.bucket('name'); bucket.create(); return bucket;
)
In boto for S3, they have this verify
or check
parameter on the bucket constructor, so the comparisons look like:
Action | boto | gcloud (suggestion) |
---|---|---|
Get a bucket, no API request | connection.get_bucket(validate=False) |
client.bucket() |
Get a bucket + metadata | connection.get_bucket() |
client.get_bucket() |
I personally don't love the boto method, and would much rather the "gcloud (suggestion)" option.