[ARVADOS] updated: c10e9e5f3398d40a3346c7d7c1f84bf50262b8ec

Git user git at public.curoverse.com
Mon Oct 31 17:02:38 EDT 2016


Summary of changes:
 doc/_config.yml                                    |  19 +--
 doc/api/examples.html.textile.liquid               |   6 -
 doc/api/methods.html.textile.liquid                |   4 +-
 .../api_client_authorizations.html.textile.liquid  |  11 +-
 doc/api/permission-model.html.textile.liquid       | 143 +++++++--------------
 doc/api/requests.html.textile.liquid               |   4 +-
 doc/api/resources.html.textile.liquid              |  13 +-
 doc/sdk/go/example.html.textile.liquid             |  35 +++++
 doc/sdk/index.html.textile.liquid                  |  11 +-
 doc/sdk/python/example.html.textile.liquid         |  36 ++++++
 10 files changed, 145 insertions(+), 137 deletions(-)
 delete mode 100644 doc/api/examples.html.textile.liquid
 create mode 100644 doc/sdk/go/example.html.textile.liquid
 create mode 100644 doc/sdk/python/example.html.textile.liquid

       via  c10e9e5f3398d40a3346c7d7c1f84bf50262b8ec (commit)
       via  e0903a2cff2df4e6169e95f7439c0fa361c60ea8 (commit)
      from  94e52d9256cb17dddbc9c383d2ab90e713c25e3b (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.


commit c10e9e5f3398d40a3346c7d7c1f84bf50262b8ec
Author: Peter Amstutz <peter.amstutz at curoverse.com>
Date:   Mon Oct 31 17:02:34 2016 -0400

    10346: Discuss execution.  Start writing code examples.

diff --git a/doc/_config.yml b/doc/_config.yml
index 92b7d38..d77b39d 100644
--- a/doc/_config.yml
+++ b/doc/_config.yml
@@ -78,29 +78,33 @@ navbar:
       - sdk/index.html.textile.liquid
     - Python:
       - sdk/python/sdk-python.html.textile.liquid
+      - sdk/python/example.html.textile.liquid
       - sdk/python/python.html.textile.liquid
       - sdk/python/crunch-utility-libraries.html.textile.liquid
       - sdk/python/events.html.textile.liquid
+    - CLI:
+      - sdk/cli/index.html.textile.liquid
+      - sdk/cli/install.html.textile.liquid
+      - sdk/cli/reference.html.textile.liquid
+      - sdk/cli/subcommands.html.textile.liquid
+    - Go:
+      - sdk/go/index.html.textile.liquid
+      - sdk/go/example.html.textile.liquid
     - Perl:
       - sdk/perl/index.html.textile.liquid
     - Ruby:
       - sdk/ruby/index.html.textile.liquid
     - Java:
       - sdk/java/index.html.textile.liquid
-    - Go:
-      - sdk/go/index.html.textile.liquid
-    - CLI:
-      - sdk/cli/index.html.textile.liquid
-      - sdk/cli/install.html.textile.liquid
-      - sdk/cli/reference.html.textile.liquid
-      - sdk/cli/subcommands.html.textile.liquid
   api:
     - Concepts:
       - api/index.html.textile.liquid
+      - api/tokens.html.textile.liquid
       - api/requests.html.textile.liquid
       - api/methods.html.textile.liquid
       - api/resources.html.textile.liquid
       - api/permission-model.html.textile.liquid
+      - api/execution.html.textile.liquid
     - Permission and authentication:
       - api/methods/users.html.textile.liquid
       - api/methods/groups.html.textile.liquid
diff --git a/doc/api/methods/api_client_authorizations.html.textile.liquid b/doc/api/methods/api_client_authorizations.html.textile.liquid
index 8c33ea1..7d392be 100644
--- a/doc/api/methods/api_client_authorizations.html.textile.liquid
+++ b/doc/api/methods/api_client_authorizations.html.textile.liquid
@@ -20,17 +20,18 @@ An ApiClientAuthorization is *not* a generic Arvados resource.  The full list of
 
 table(table table-bordered table-condensed).
 |_. Attribute|_. Type|_. Description|_. Example|
+|uuid|string|An identifier used to refer to the token without exposing the actual token.||
 |api_token|string|The actual token string that is expected in the Authorization header.||
 |api_client_id|integer|-||
 |user_id|integer|-||
 |created_by_ip_address|string|-||
 |last_used_by_ip_address|string|The network address of the most recent client using this token.||
 |last_used_at|datetime|Timestamp of the most recent request using this token.||
-|expires_at|datetime|Time at which the token is no longer valid.||
-|default_owner_uuid|string|||
+|expires_at|datetime|Time at which the token is no longer valid.  May be set to a time in the past in order to immediately expire a token.||
+|owner_uuid|string|The user associated with the token.  All operations using this token are checked against the permissions of this user.||
 |scopes|array|A list of resources this token is allowed to access.  A scope of ["all"] allows all resources.  See below.||
 
-h3. Scopes
+h3(#scope). Scopes
 
 Scopes can restrict a token so it may only access certain resources.  This is in addition to normal permission checks for the user associated with the token.
 
@@ -57,10 +58,12 @@ A narrow scope such as @GET /arvados/v1/collections/962eh-4zz18-xi32mpz2621o8km@
 
 h2. Methods
 
-h3. create
+h3(#create). create
 
 Create a new ApiClientAuthorization.
 
+Regular users may only create self-owned API tokens, but may provide a restricted "scope"#scope .  Administrators may create API tokens corresponding to any user.
+
 Arguments:
 
 table(table table-bordered table-condensed).
diff --git a/doc/api/permission-model.html.textile.liquid b/doc/api/permission-model.html.textile.liquid
index 8b085ee..ae8c363 100644
--- a/doc/api/permission-model.html.textile.liquid
+++ b/doc/api/permission-model.html.textile.liquid
@@ -3,123 +3,66 @@ layout: default
 navsection: api
 navmenu: Concepts
 title: "Permission model"
-
 ...
 
+* There are four levels of permission: *none*, *can_read*, *can_write*, and *can_manage*.
+** *none* is the default state when there are no other permission grants.
+*** the object is not returned by any list query.
+*** direct queries of the object by uuid return 404 Not Found.
+*** Link objects require valid identifiers in @head_uuid@ and @tail_uuid@, so an attempt to create a Link that references an unreadable object will return an error indicating the object is not found.
+** *can_read* grants read-only access to the record.  Attempting to update or delete the record returns an error.  *can_read* does not allow a reader to see any permission grants on the object except the object's owner_uuid and the reader's own permissions.
+** *can_write* permits changes to the record (but not permission links).  *can_write* permits the user to delete the object.  *can_write* also implies *can_read*.
+** *can_manage* permits the user to read, create, update and delete permission links whose @head_uuid@ is this object's @uuid at .  *can_manage* also implies *can_write* and *can_read*.
 
+h2. Ownership
 
-Each API transaction (read, write, create, etc.) is done on behalf of a person.
-
-* An end user, via a web app
-* The owner of an installed app
-
-A user (person) is permitted to act on an object if there is a path (series of permission Links) from the acting user to the object in which
-
-* Every intervening object is a Group, and
-* Every intervening permission Link allows the current action
-
-Special case: A permission path can also include intervening User objects if the links _to_ the Users are "can_manage" links.
-
-Each object has exactly one _owner_, which can be either a User or a Group.
-
-* If the owner of X is A, then A is permitted to do any action on X.
-
-h3. Tokens
-
-An authorization token is issued at a user's request, and supplied to an API client using some suitable mechanism (_e.g._, cookie or application config file for a web app; environment variable or .rc-file for a CLI app).
-
-A user can have multiple valid tokens at a given time.  At the user's option, a token can be restricted to a combination of
-
-* API client program
-* time interval
-* transaction type
-
-h3. System pseudo-user
-
-A privileged user account exists for the use of built-in Arvados system components.  This user manages system-wide shared objects which can't really be "owned" by any particular user, like
-
-* Jobs and job steps (because a given job can be "wanted" by multiple users)
-* Provenance metadata (because no user should be able to modify this directly)
-* Storage metadata like
-** redundancy verified as N× at time Y
-** contents of collections A and B are identical
-
-The system pseudo-user's uuid is @{siteprefix}-tpzed-000000000000000 at .
-
-h2. Example scenarios
-
-h3. 1. Private objects
-
-Alfred stores 3 data Collections in Keep and adds them to a new Group.
-
-The Collections and the Group can only be seen by Alfred, administrators, and the system user.
-
-The data in the Collections can only be retrieved by Alfred, administrators, and the system user.
-
-h3. 2. Public objects
-
-George creates a "PGP public data" Group, and grants "read" permission to all users.
-
-* ...by adding a Link: "All users" Group _can_read_→ "PGP public data" Group
-
-George stores 4 data Collections in Keep and adds them to the "PGP public data" Group
-
-* ...by adding a Link: Group _can_read_→ Collection
-
-Anyone who can connect to Arvados can log in with a Google/OpenID account and read the data.
+* All Arvados objects have an @owner_uuid@ field. Valid uuid types for @owner_uuid@ are "User" and "Group".
+* The User or Group specified by @owner_uuid@ has *can_manage* permission on the object.
+** This permission is one way: A User or Group's @owner_uuid@ being equal to @X@ does not imply any permission for that User/Group to read, write, or manage an object whose @uuid@ is equal to @X at .
+* Applications should represent each object as belonging to, or being "inside", the Group/User referenced by its @owner_uuid at .
+** A "project" is a subtype of Group that is treated as a "Project" in Workbench, and as a directory by @arv-mount at .
+** A "role" is a subtype of Group that is treated in Workbench as a group of users who have permissions in common (typically an organizational group).
+* To change the @owner_uuid@ field, it is necessary to have @can_write@ permission on both the current owner and the new owner.
 
-h3. 3. Group-managed objects
+h2. Permission links
 
-Three lab members are working together on a project. All Specimens, Links, Jobs, etc. can be modified by any of the three lab members. _Other_ lab members, who are not working on this project, can view but not modify these objects.
+A link object with
 
-h3. 4. Group-level administrator
+* @owner_uuid@ of the system user.
+* @link_class@ "permission"
+* @name@ one of *can_read*, *can_write* or *can_manage*
+* @head_uuid@ of some Arvados object
+* @tail_uuid@ of a User or Group
 
-The Ashton Lab administrator, Alison, manages user accounts within her lab. She can enable and disable accounts, and exercise any permission that her lab members have.
+grants the @name@ permission for @tail_uuid@ accessing @head_uuid@
 
-George has read-only access to the same set of accounts. This lets him see things like user activity and resource usage reports, without worrying about accidentally messing up anyone's data.
+* If a User has *can_manage* permission on some object, this grants permission to read, create, update and delete permission links where the @head_uuid@ is the object under management.
 
-table(table table-bordered table-condensed).
-|Tail                   |Permission     |Head                      |Effect|
-|Group: Ashton Lab Admin|can_manage     |User: Lab Member 1        |Lab member 1 is in this administrative group|
-|Group: Ashton Lab Admin|can_manage     |User: Lab Member 2        |Lab member 2 is in this administrative group|
-|Group: Ashton Lab Admin|can_manage     |User: Lab Member 3        |Lab member 3 is in this administrative group|
-|Group: Ashton Lab Admin|can_manage     |User: Alison              |Alison is in this administrative group|
-|Group: Ashton Lab Admin|can_manage     |User: George              |George is in this administrative group|
-|Alison                 |can_manage     |Group: Ashton Lab Admin   |Alison can do everything the above lab members can do|
-|George                 |can_read       |Group: Ashton Lab Admin   |George can read everything the above lab members can read|
+h3. Transitive permissions
 
-h3. 5. Segregated roles
+Permissions can be obtained indirectly through Groups.
+* If a User X *can_read* Group A, and Group A *can_read* Object B, then User X *can_read* Object B.
+* Permissions are narrowed to the least powerful permission on the path.
+** If User X *can_write* Group A, and Group A *can_read* Object B, then User X *can_read* Object B.
+** If User X *can_read* Group A, and Group A *can_write* Object B, then User X *can_read* Object B.
 
-Granwyth, at the Hulatberi Lab, sets up a Factory Robot which uses a hosted Arvados site to do work for the Hulatberi Lab.
+h2. Group Membership
 
-Frank uploads a data Collection using Factory Robot's upload interface.  Factory Robot sets data owner to Hulatberi Lab.
+Group membership is determined by whether the group has *can_read* permission on an object.  If a group G *can_read* an object A, then we say A is a member of G.
 
-Factory Robot processes the data using a pipeline.
+For some kinds of groups, like roles, it is natural for users who are members of a group to also have *can_manage* permission on the group, i.e., G *can_read* A  and A *can_manage* G ("A can do anything G can do"). However, this is not necessary: A can be a member of a group while being unable to even read it.
 
-Factory Robot grants permission for anyone in the Ingeborg Lab (a Hulateberi Lab customer) to read the output of the pipeline, as well as the pipeline invocation details.  (Say, Ingeborg and Jill.)
+h2. Special cases
 
-During and after processing, all members of the Hulatberi Lab (_e.g._, Mike) can inspect pipeline progress, read source/intermediate/output data, and modify objects.
+* Log table objects are additionally readable based on whether the User has *can_read* permission on @object_uuid@ (User can access log history about objects it can read).  To retain the integrity of the log, the log table should deny all update or delete operations.
+* Permission links where @tail_uuid@ is a User permit @can_read@ on the link by that user.  (User can discover her own permission grants.)
+* *can_read* on a Collection grants permission to read the blocks that make up the collection (API server returns signed blocks)
+* If User or Group X *can_FOO* Group A, and Group A *can_manage* User B, then X *can_FOO* _everything that User B can_FOO_.
 
-Possible encoding:
+h2. System user and group
 
-table(table table-bordered table-condensed).
-|Tail           |Permission     |Head                      |Effect|
-|Frank          |(none)         |                          |Factory Robot uses only its own credentials during upload|
-|Granwyth       |can_manage     |User:    Factory Robot    |can revoke tokens, view activity... (needed?)|
-|Granwyth       |can_manage     |Group: Hulatberi Lab    |can grant group-write permission to Factory Robot|
-|Factory Robot  |can_write      |Group: Hulatberi Lab    |can add data, pipelines, jobs, etc. to the Lab group|
-|Mike           |can_write      |Group: Hulatberi Lab    |can edit/annotate/delete objects that belong to the Lab|
+A privileged user account exists for the use by internal Arvados components.  This user manages system objects which should not be "owned" by any particular user.  The system user uuid is @{siteprefix}-tpzed-000000000000000 at .
 
-h3. Actions governed by permissions
+h2. Anoymous user and group
 
-table(table table-bordered table-condensed).
-|_Action_|_Permissions needed_|
-|Retrieve data from Keep|can_read (system-wide?)|
-|Store data in Keep|can_write (system-wide?)|
-|Add a Collection to Arvados|can_write (system-wide?)|
-|Run a job|can_run (system-wide?)|
-|See progress/result of a job|can_read (on job)|
-|Give group permissions to a user/group|can_manage (on group)|
-|Revoke group permissions from a user/group|can_manage (on group)|
-|Change owner of an object|can_manage (on object)|
-|Add an object to a group|can_write (on group)|
+An Arvado site may be configued to allow users to browse resources without requiring a log in.  In this case, permissions for non-logged-in users are associated with the "anonymous" user.  To make objects visible to the public, they can be shared with the "anonymous" group.  The anonymous user uuid is @{siteprefix}-tpzed-anonymouspublic at .
diff --git a/doc/api/requests.html.textile.liquid b/doc/api/requests.html.textile.liquid
index 3f0883b..94c8bc3 100644
--- a/doc/api/requests.html.textile.liquid
+++ b/doc/api/requests.html.textile.liquid
@@ -25,7 +25,7 @@ The URI portion of the request identifies the specific resource to operate on.
 
 h3. Authorization header
 
-Every request must include an API token.  This identifies the user making the request for the purposes of access control.  In addition, tokens may be further restricted in scope to only access certain API endpoints.
+Every request must include an API token.  This identifies the user making the request for the purposes of access control.  In addition, tokens may be further "restricted in scope":/api/methods/api_client_authorizations.html#scope to only access certain API endpoints.
 
 API requests must provide the API token using the @Authorization@ header in the following format:
 
diff --git a/doc/sdk/go/example.html.textile.liquid b/doc/sdk/go/example.html.textile.liquid
new file mode 100644
index 0000000..903d367
--- /dev/null
+++ b/doc/sdk/go/example.html.textile.liquid
@@ -0,0 +1,35 @@
+---
+layout: default
+navsection: sdk
+navmenu: Python
+title: Python SDK examples
+...
+
+h2. create
+
+<pre>
+  var collection arvados.Collection
+  err := api.Create("collection", Dict{"collection": Dict{"name": "create example"}}, &collection)
+</pre>
+
+h2. delete
+
+<pre>
+  var collection arvados.Collection
+  err := api.Delete("collection", "", Dict{"collection": Dict{"name": "create example"}}, &collection)
+</pre>
+
+h2. get
+
+<pre>
+</pre>
+
+h2. list
+
+<pre>
+</pre>
+
+h2. update
+
+<pre>
+</pre>
diff --git a/doc/sdk/python/example.html.textile.liquid b/doc/sdk/python/example.html.textile.liquid
new file mode 100644
index 0000000..7ae5e58
--- /dev/null
+++ b/doc/sdk/python/example.html.textile.liquid
@@ -0,0 +1,36 @@
+---
+layout: default
+navsection: sdk
+navmenu: Python
+title: Python SDK examples
+...
+
+h2. create
+
+<pre>
+result = api.collection().create(body={"collection": {"name": "create example"}}).execute()
+</pre>
+
+h2. delete
+
+<pre>
+result = api.collection().delete(uuid="aaaaa-bbbbb-ccccccccccccccc").execute()
+</pre>
+
+h2. get
+
+<pre>
+result = api.collection().get(uuid="aaaaa-bbbbb-ccccccccccccccc").execute()
+</pre>
+
+h2. list
+
+<pre>
+result = api.collection().list(filters=[["uuid", "=", "aaaaa-bbbbb-ccccccccccccccc"]]).execute()
+</pre>
+
+h2. update
+
+<pre>
+result = api.collection().update(uuid="aaaaa-bbbbb-ccccccccccccccc", body={"collection": {"name": "update example"}}).execute()
+</pre>

commit e0903a2cff2df4e6169e95f7439c0fa361c60ea8
Author: Peter Amstutz <peter.amstutz at curoverse.com>
Date:   Mon Oct 31 14:04:08 2016 -0400

    10346: Checkpoint

diff --git a/doc/_config.yml b/doc/_config.yml
index 87aa1ce..92b7d38 100644
--- a/doc/_config.yml
+++ b/doc/_config.yml
@@ -101,7 +101,6 @@ navbar:
       - api/methods.html.textile.liquid
       - api/resources.html.textile.liquid
       - api/permission-model.html.textile.liquid
-      - api/examples.html.textile.liquid
     - Permission and authentication:
       - api/methods/users.html.textile.liquid
       - api/methods/groups.html.textile.liquid
diff --git a/doc/api/examples.html.textile.liquid b/doc/api/examples.html.textile.liquid
deleted file mode 100644
index 2bcebc1..0000000
--- a/doc/api/examples.html.textile.liquid
+++ /dev/null
@@ -1,6 +0,0 @@
----
-layout: default
-navsection: api
-navmenu: Concepts
-title: Examples
-...
diff --git a/doc/api/methods.html.textile.liquid b/doc/api/methods.html.textile.liquid
index f392778..5b35c16 100644
--- a/doc/api/methods.html.textile.liquid
+++ b/doc/api/methods.html.textile.liquid
@@ -12,7 +12,7 @@ The methods are relative to the base URI, e.g. @/arvados/v1/resource_type at .  For
 
 h2. create
 
-The @create@ method creates a new object of the specified type.  It corresponds to the HTTP request @POST /arvados/v1/resource_type at .  A successful create call returns a copy of the new object.
+The @create@ method creates a new object of the specified type.  Note that only the listed attributes (and "standard metadata":resources.html) are set, unset attributes will get default values, and the attributes of a given resource type are fixed (you cannot introduce new toplevel attributes).  It corresponds to the HTTP request @POST /arvados/v1/resource_type at .  A successful create call returns a copy of the new object.
 
 Arguments:
 
@@ -96,7 +96,7 @@ table(table table-bordered table-condensed).
 
 h2. update
 
-The @update@ method updates fields on the object with the specified @uuid at .  It corresponds to the HTTP request @PUT /arvados/v1/resource_type/uuid at .  A successful update call returns the updated copy of the object.
+The @update@ method updates fields on the object with the specified @uuid at .  It corresponds to the HTTP request @PUT /arvados/v1/resource_type/uuid at .  Note that only the listed attributes (and "standard metadata":resources.html) are updated, unset attributes will retain their previous values, and the attributes of a given resource type are fixed (you cannot introduce new toplevel attributes).  Also note that updates replace the value of the attribute, so if an attribute has an object value, the entire object is replaced.  A successful update call returns the updated copy of the object.
 
 table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |
diff --git a/doc/api/requests.html.textile.liquid b/doc/api/requests.html.textile.liquid
index 187aab4..3f0883b 100644
--- a/doc/api/requests.html.textile.liquid
+++ b/doc/api/requests.html.textile.liquid
@@ -17,7 +17,7 @@ Use @PUT@ to update an existing resource.
 
 Use @DELETE@ to remove an existing resource.
 
-As a special case, a @POST@ with the query parameter @_method=GET@ will be treated as a GET request.  This makes it possible to have @GET@ requests where the query string exceeds the permitted request URI length, by putting the query string in the body of the request.
+As a special case, a @POST@ with the query parameter @_method=GET@ will be treated as a GET request.  This makes it possible to issue @GET@ requests where the query string exceeds the maximum request URI length, by putting the query string in the body of the request.
 
 h3. Request URI
 
diff --git a/doc/api/resources.html.textile.liquid b/doc/api/resources.html.textile.liquid
index 07470c1..7daa554 100644
--- a/doc/api/resources.html.textile.liquid
+++ b/doc/api/resources.html.textile.liquid
@@ -12,20 +12,19 @@ h2(#resource). Resource
 
 table(table table-bordered table-condensed).
 |_. Attribute |_. Type |_. Description |_. Example|
-|uuid|string|universally unique object identifier|@mk2qn-4zz18-w3anr2hk2wgfpuo@|
+|uuid|string|universally unique object identifier, set on @create@|@mk2qn-4zz18-w3anr2hk2wgfpuo@|
+|owner_uuid|string|UUID of owner (must be a User or Group), set on @create@, may be updated explicitly|@mk2qn-tpzed-a4lcehql0dv2u25@|
+|created_at|datetime|When resource was created, set on @create@|@2013-01-21T22:17:39Z@|
+|modified_by_client_uuid|string|API client software which most recently modified the resource, set on @create@ and @update@|@mk2qn-ozdt8-vq8l5qkzj7pr7h7@|
+|modified_by_user_uuid|string|Authenticated user, on whose behalf the client was acting when modifying the resource, set on @create@ and @update@|@mk2qn-tpzed-a4lcehql0dv2u25@|
+|modified_at|datetime|When resource was last modified, set on @create@ and @update@|@2013-01-25T22:29:32Z@|
 |href|string|a URL that can be used to address this resource||
 |kind|string|@arvados#{resource_type}@|@arvados#collection@|
 |etag|string|The ETag[1] of the resource|@1xlmizzjq7wro3dlb2dirf505@|
-|owner_uuid|string|UUID of owner (must be a User or Group)|@mk2qn-tpzed-a4lcehql0dv2u25@|
-|created_at|datetime|When resource was created|@2013-01-21T22:17:39Z@|
-|modified_by_client_uuid|string|API client software which most recently modified the resource|@mk2qn-ozdt8-vq8l5qkzj7pr7h7@|
-|modified_by_user_uuid|string|Authenticated user, on whose behalf the client was acting when modifying the resource|@mk2qn-tpzed-a4lcehql0dv2u25@|
-|modified_at|datetime|When resource was last modified|@2013-01-25T22:29:32Z@|
 
 h2. Object UUID
 
 Each object is assigned a UUID.  This has the format @aaaaa-bbbbb-ccccccccccccccc at .
-format.
 
 # The first field (@aaaaa@ in the example) is the site prefix.  This is unique to a specific Arvados installation.
 # The second field (@bbbbb@ in the example) is the object type.
diff --git a/doc/sdk/index.html.textile.liquid b/doc/sdk/index.html.textile.liquid
index db5d6f1..e440e6b 100644
--- a/doc/sdk/index.html.textile.liquid
+++ b/doc/sdk/index.html.textile.liquid
@@ -4,16 +4,11 @@ navsection: sdk
 title: "Arvados SDK Reference"
 ...
 
-This section documents how to access the Arvados API and Keep using various programming languages.
+This section documents language bindings for the "Arvados API":{{site.baseurl}}/api and Keep that are available for various programming languages.  Not all features are available in every SDK.  The most complete SDK is the Python SDK.  Note that this section only gives a high level overview of each SDK.  Consult the "Arvados API":{{site.baseurl}}/api section for detailed documentation about Arvados API calls available on each resource.
 
 * "Python SDK":{{site.baseurl}}/sdk/python/sdk-python.html
+* "Command line SDK":{{site.baseurl}}/sdk/cli/index.html ("arv")
+* "Go SDK":{{site.baseurl}}/sdk/go/index.html
 * "Perl SDK":{{site.baseurl}}/sdk/perl/index.html
 * "Ruby SDK":{{site.baseurl}}/sdk/ruby/index.html
 * "Java SDK":{{site.baseurl}}/sdk/java/index.html
-* "Go SDK":{{site.baseurl}}/sdk/go/index.html
-* "Command line SDK":{{site.baseurl}}/sdk/cli/index.html ("arv")
-
-SDKs not yet implemented:
-
-* Rails SDK: Workbench uses an ActiveRecord-like interface to Arvados. This hasn't yet been extracted from Workbench and packaged as a gem.
-* R: We plan to support this, but it has not been implemented yet.

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list