{"action":"created","comment":{"url":"https://api.github.com/repos/mozilla-services/kinto/pulls/comments/32760993","id":32760993,"diff_hunk":"@@ -0,0 +1,981 @@\n+.. _tutorial:\n+\n+A first app with Kinto\n+######################\n+\n+There are actually two kinds of app that you may want to use Kinto with:\n+\n+  - App to sync user data between her devices.\n+  - App to sync and share data between user, with fined-grained permissions\n+\n+Most of the app will fit in one or the other.\n+\n+\n+Build an app to sync user data between her devices\n+==================================================\n+\n+Let say that we want to do a TodoMVC backend that will sync user tasks\n+between her devices.\n+\n+\n+In order to separate data between each user, we will use the default\n+user bucket to create our collection:\n+\n+.. code-block:: http\n+\n+    $ echo '{\"data\": {}}' | \\\n+        http PUT https://kinto.dev.mozaws.net/v1/buckets/default/collections/tasks \\\n+             --auth 'user:password'\n+\n+    PUT /v1/buckets/default/collections/tasks HTTP/1.1\n+    Accept: application/json\n+    Accept-Encoding: gzip, deflate\n+    Authorization: Basic dXNlcjpwYXNzd29yZA==\n+    Connection: keep-alive\n+    Content-Length: 13\n+    Content-Type: application/json\n+    Host: kinto.dev.mozaws.net\n+    User-Agent: HTTPie/0.9.2\n+\n+    {\n+        \"data\": {}\n+    }\n+\n+    HTTP/1.1 200 OK\n+    Access-Control-Expose-Headers: Backoff, Retry-After, Alert\n+    Backoff: 10\n+    Connection: keep-alive\n+    Content-Length: 155\n+    Content-Type: application/json; charset=UTF-8\n+    Date: Thu, 18 Jun 2015 15:18:18 GMT\n+    Server: nginx/1.4.6 (Ubuntu)\n+\n+    {\n+        \"data\": {\n+            \"id\": \"tasks\", \n+            \"last_modified\": 1434640698718\n+        }, \n+        \"permissions\": {\n+            \"write\": [\n+                \"basicauth_10ea4e5fbf849196a4fe8a9c250b737dd5ef17abbeb8f99692d62828465a9823\"\n+            ]\n+        }\n+    }\n+\n+As soon as the collection has been created, you may want to start to add some tasks in it.\n+\n+Let start with a really simple data model:\n+\n+  - ``description``: A string describing the task\n+  - ``status``: The status of the task, either ``todo``, ``doing`` or ``done``.\n+\n+.. code-block:: http\n+\n+    $ echo '{\"data\": {\"description\": \"Write a tutoriel explaining Kinto\", \"status\": \"todo\"}}' | \\\n+        http POST https://kinto.dev.mozaws.net/v1/buckets/default/collections/tasks/records \\\n+             --auth 'user:password'\n+\n+    POST /v1/buckets/default/collections/tasks/records HTTP/1.1\n+    Accept: application/json\n+    Accept-Encoding: gzip, deflate\n+    Authorization: Basic dXNlcjpwYXNzd29yZA==\n+    Connection: keep-alive\n+    Content-Length: 81\n+    Content-Type: application/json\n+    Host: kinto.dev.mozaws.net\n+    User-Agent: HTTPie/0.9.2\n+\n+    {\n+        \"data\": {\n+            \"description\": \"Write a tutoriel explaining Kinto\", \n+            \"status\": \"todo\"\n+        }\n+    }\n+\n+    HTTP/1.1 201 Created\n+    Access-Control-Expose-Headers: Backoff, Retry-After, Alert\n+    Backoff: 10\n+    Connection: keep-alive\n+    Content-Length: 253\n+    Content-Type: application/json; charset=UTF-8\n+    Date: Thu, 18 Jun 2015 15:31:55 GMT\n+    Server: nginx/1.4.6 (Ubuntu)\n+\n+    {\n+        \"data\": {\n+            \"description\": \"Write a tutoriel explaining Kinto\", \n+            \"id\": \"23eed462-c063-4ae0-81b0-8bf2210bfe86\", \n+            \"last_modified\": 1434641515332, \n+            \"status\": \"todo\"\n+        }, \n+        \"permissions\": {\n+            \"write\": [\n+                \"basicauth_10ea4e5fbf849196a4fe8a9c250b737dd5ef17abbeb8f99692d62828465a9823\"\n+            ]\n+        }\n+    }\n+\n+\n+Let's grab our new list of tasks:\n+\n+.. code-block:: http\n+\n+    $ http GET https://kinto.dev.mozaws.net/v1/buckets/default/collections/tasks/records \\\n+           --auth 'user:password'\n+    GET /v1/buckets/default/collections/tasks/records HTTP/1.1\n+    Accept: */*\n+    Accept-Encoding: gzip, deflate\n+    Authorization: Basic dXNlcjpwYXNzd29yZA==\n+    Connection: keep-alive\n+    Host: kinto.dev.mozaws.net\n+    User-Agent: HTTPie/0.9.2\n+\n+    HTTP/1.1 200 OK\n+    Access-Control-Expose-Headers: Backoff, Retry-After, Alert, Next-Page, Total-Records, Last-Modified, ETag\n+    Backoff: 10\n+    Connection: keep-alive\n+    Content-Length: 152\n+    Content-Type: application/json; charset=UTF-8\n+    Date: Thu, 18 Jun 2015 15:34:04 GMT\n+    ETag: \"1434641474977\"\n+    Last-Modified: Thu, 18 Jun 2015 15:31:14 GMT\n+    Server: nginx/1.4.6 (Ubuntu)\n+    Total-Records: 1\n+\n+    {\n+        \"data\": [\n+            {\n+                \"description\": \"Write a tutoriel explaining Kinto\", \n+                \"id\": \"23eed462-c063-4ae0-81b0-8bf2210bfe86\", \n+                \"last_modified\": 1434641515332, \n+                \"status\": \"todo\"\n+            }\n+        ]\n+    }\n+\n+\n+We can also update our tasks:\n+\n+.. code-block:: http\n+\n+    $ echo '{\"data\": {\"status\": \"doing\"}}' | \\\n+         http PATCH https://kinto.dev.mozaws.net/v1/buckets/default/collections/tasks/records/23eed462-c063-4ae0-81b0-8bf2210bfe86 \\\n+              -v  --auth 'user:password'\n+\n+    PATCH /v1/buckets/default/collections/tasks/records/23eed462-c063-4ae0-81b0-8bf2210bfe86 HTTP/1.1\n+    Accept: application/json\n+    Accept-Encoding: gzip, deflate\n+    Authorization: Basic dXNlcjpwYXNzd29yZA==\n+    Connection: keep-alive\n+    Content-Length: 30\n+    Content-Type: application/json\n+    Host: kinto.dev.mozaws.net\n+    User-Agent: HTTPie/0.9.2\n+\n+    {\n+        \"data\": {\n+            \"status\": \"doing\"\n+        }\n+    }\n+\n+    HTTP/1.1 200 OK\n+    Access-Control-Expose-Headers: Backoff, Retry-After, Alert\n+    Backoff: 10\n+    Connection: keep-alive\n+    Content-Length: 254\n+    Content-Type: application/json; charset=UTF-8\n+    Date: Thu, 18 Jun 2015 15:50:03 GMT\n+    Server: nginx/1.4.6 (Ubuntu)\n+\n+    {\n+        \"data\": {\n+            \"description\": \"Write a tutoriel explaining Kinto\", \n+            \"id\": \"23eed462-c063-4ae0-81b0-8bf2210bfe86\", \n+            \"last_modified\": 1434642603605, \n+            \"status\": \"doing\"\n+        }, \n+        \"permissions\": {\n+            \"write\": [\n+                \"basicauth_10ea4e5fbf849196a4fe8a9c250b737dd5ef17abbeb8f99692d62828465a9823\"\n+            ]\n+        }\n+    }\n+\n+There you should ask yourself, what happens if another device already\n+updated the record in between, will I override its change?\n+\n+You've got two conflicts resolution behaviors:\n+\n+- Server wins, in that case the server will reject changes in case\n+  something changed on server side.\n+- Client wins, in that case the change will override previous changes\n+\n+The previous call is the Client wins behavior.\n+\n+In case you want the server to prevent you from overridding changes,\n+you must send the ``If-Match`` header:\n+\n+Let say, we didn't refresh the server since our first POST and we send\n+the ETag we had back then ``\"1434641515332\"``:\n+\n+.. code-block:: http\n+\n+    $ echo '{\"data\": {\"status\": \"doing\"}}' | \\\n+        http PATCH https://kinto.dev.mozaws.net/v1/buckets/default/collections/tasks/records/23eed462-c063-4ae0-81b0-8bf2210bfe86 \\\n+            If-Match:'\"1434641515332\"' \\\n+            -v  --auth 'user:password'\n+\n+    PATCH /v1/buckets/default/collections/tasks/records/23eed462-c063-4ae0-81b0-8bf2210bfe86 HTTP/1.1\n+    Accept: application/json\n+    Accept-Encoding: gzip, deflate\n+    Authorization: Basic dXNlcjpwYXNzd29yZA==\n+    Connection: keep-alive\n+    Content-Length: 29\n+    Content-Type: application/json\n+    Host: kinto.dev.mozaws.net\n+    If-Match: \"1434641515332\"\n+    User-Agent: HTTPie/0.9.2\n+\n+    {\n+        \"data\": {\n+            \"status\": \"done\"\n+        }\n+    }\n+\n+    HTTP/1.1 412 Precondition Failed\n+    Access-Control-Expose-Headers: Backoff, Retry-After, Alert\n+    Connection: keep-alive\n+    Content-Length: 98\n+    Content-Type: application/json; charset=UTF-8\n+    Date: Thu, 18 Jun 2015 16:08:31 GMT\n+    ETag: \"1434642603605\"\n+    Last-Modified: Thu, 18 Jun 2015 15:50:03 GMT\n+    Server: nginx/1.4.6 (Ubuntu)\n+\n+    {\n+        \"code\": 412, \n+        \"errno\": 114, \n+        \"error\": \"Precondition Failed\", \n+        \"message\": \"Resource was modified meanwhile\"\n+    }\n+\n+The server reject the modification with a 412 error code.\n+\n+In order to fix that, we can either ask for the record we tried to\n+update:\n+\n+.. code-block:: http\n+\n+    $ http GET https://kinto.dev.mozaws.net/v1/buckets/default/collections/tasks/records/23eed462-c063-4ae0-81b0-8bf2210bfe86 \\\n+           -v  --auth 'user:password'\n+\n+    GET /v1/buckets/default/collections/tasks/records/23eed462-c063-4ae0-81b0-8bf2210bfe86 HTTP/1.1\n+    Accept: */*\n+    Accept-Encoding: gzip, deflate\n+    Authorization: Basic dXNlcjpwYXNzd29yZA==\n+    Connection: keep-alive\n+    Host: kinto.dev.mozaws.net\n+    User-Agent: HTTPie/0.9.2\n+\n+\n+    HTTP/1.1 200 OK\n+    Access-Control-Expose-Headers: Backoff, Retry-After, Alert, Last-Modified, ETag\n+    Backoff: 10\n+    Connection: keep-alive\n+    Content-Length: 254\n+    Content-Type: application/json; charset=UTF-8\n+    Date: Thu, 18 Jun 2015 16:13:21 GMT\n+    ETag: \"1434641474977\"\n+    Last-Modified: Thu, 18 Jun 2015 15:31:14 GMT\n+    Server: nginx/1.4.6 (Ubuntu)\n+\n+    {\n+        \"data\": {\n+            \"description\": \"Write a tutoriel explaining Kinto\", \n+            \"id\": \"23eed462-c063-4ae0-81b0-8bf2210bfe86\", \n+            \"last_modified\": 1434642603605, \n+            \"status\": \"doing\"\n+        }, \n+        \"permissions\": {\n+            \"write\": [\n+                \"basicauth_10ea4e5fbf849196a4fe8a9c250b737dd5ef17abbeb8f99692d62828465a9823\"\n+            ]\n+        }\n+    }\n+\n+Or we can ask the list of changes from the last time we've synced our local store, filtering on the ``_since`` attribute with the value of the last collection ETag:\n+\n+.. code-block:: http\n+\n+    $ http GET https://kinto.dev.mozaws.net/v1/buckets/default/collections/tasks/records?_since=1434641515332 \\\n+           -v  --auth 'user:password'\n+\n+    GET /v1/buckets/default/collections/tasks/records?_since=1434641515332 HTTP/1.1\n+    Accept: */*\n+    Accept-Encoding: gzip, deflate\n+    Authorization: Basic dXNlcjpwYXNzd29yZA==\n+    Connection: keep-alive\n+    Host: kinto.dev.mozaws.net\n+    User-Agent: HTTPie/0.9.2\n+\n+    HTTP/1.1 200 OK\n+    Access-Control-Expose-Headers: Backoff, Retry-After, Alert, Next-Page, Total-Records, Last-Modified, ETag\n+    Backoff: 10\n+    Connection: keep-alive\n+    Content-Length: 153\n+    Content-Type: application/json; charset=UTF-8\n+    Date: Thu, 18 Jun 2015 16:14:44 GMT\n+    ETag: \"1434641474977\"\n+    Last-Modified: Thu, 18 Jun 2015 15:31:14 GMT\n+    Server: nginx/1.4.6 (Ubuntu)\n+    Total-Records: 1\n+\n+    {\n+        \"data\": [\n+            {\n+                \"description\": \"Write a tutoriel explaining Kinto\", \n+                \"id\": \"23eed462-c063-4ae0-81b0-8bf2210bfe86\", \n+                \"last_modified\": 1434642603605, \n+                \"status\": \"doing\"\n+            }\n+        ]\n+    }\n+\n+Now that we've got the list of the record that changed, we can handle the conflict.\n+\n+We can either do three-way merge (if our changes and server changes on\n+the object did not happened on the same fields) or if both objects are\n+actually equals.\n+\n+Or if changes did happened on the same field, we must decide or ask\n+the user to decide, which version we have to keep (server version or\n+client version).\n+\n+The we can try to send back again our modifications using the new record ``last_modified`` value:\n+\n+.. code-block:: http\n+\n+    $ echo '{\"data\": {\"status\": \"done\"}}' | \\\n+        http PATCH https://kinto.dev.mozaws.net/v1/buckets/default/collections/tasks/records/23eed462-c063-4ae0-81b0-8bf2210bfe86 \\\n+            If-Match:'\"1434642603605\"' \\\n+            -v  --auth 'user:password'\n+\n+    PATCH /v1/buckets/default/collections/tasks/records/23eed462-c063-4ae0-81b0-8bf2210bfe86 HTTP/1.1\n+    Accept: application/json\n+    Accept-Encoding: gzip, deflate\n+    Authorization: Basic dXNlcjpwYXNzd29yZA==\n+    Connection: keep-alive\n+    Content-Length: 29\n+    Content-Type: application/json\n+    Host: kinto.dev.mozaws.net\n+    If-Match: \"1434642603605\"\n+    User-Agent: HTTPie/0.9.2\n+\n+    {\n+        \"data\": {\n+            \"status\": \"done\"\n+        }\n+    }\n+\n+    HTTP/1.1 200 OK\n+    Access-Control-Expose-Headers: Backoff, Retry-After, Alert\n+    Backoff: 10\n+    Connection: keep-alive\n+    Content-Length: 253\n+    Content-Type: application/json; charset=UTF-8\n+    Date: Thu, 18 Jun 2015 16:21:16 GMT\n+    Server: nginx/1.4.6 (Ubuntu)\n+\n+    {\n+        \"data\": {\n+            \"description\": \"Write a tutoriel explaining Kinto\", \n+            \"id\": \"23eed462-c063-4ae0-81b0-8bf2210bfe86\", \n+            \"last_modified\": 1434644476758, \n+            \"status\": \"done\"\n+        }, \n+        \"permissions\": {\n+            \"write\": [\n+                \"basicauth_10ea4e5fbf849196a4fe8a9c250b737dd5ef17abbeb8f99692d62828465a9823\"\n+            ]\n+        }\n+    }\n+\n+You can also delete the record and use the same mechanism for\n+synchronization:\n+\n+.. code-block:: http\n+\n+    $ http DELETE https://kinto.dev.mozaws.net/v1/buckets/default/collections/tasks/records/23eed462-c063-4ae0-81b0-8bf2210bfe86 \\\n+           If-Match:'\"1434644476758\"' \\\n+           -v  --auth 'user:password'\n+\n+    DELETE /v1/buckets/default/collections/tasks/records/23eed462-c063-4ae0-81b0-8bf2210bfe86 HTTP/1.1\n+    Accept: */*\n+    Accept-Encoding: gzip, deflate\n+    Authorization: Basic dXNlcjpwYXNzd29yZA==\n+    Connection: keep-alive\n+    Content-Length: 0\n+    Host: kinto.dev.mozaws.net\n+    If-Match: \"1434644476758\"\n+    User-Agent: HTTPie/0.9.2\n+\n+    HTTP/1.1 200 OK\n+    Access-Control-Expose-Headers: Backoff, Retry-After, Alert\n+    Backoff: 10\n+    Connection: keep-alive\n+    Content-Length: 99\n+    Content-Type: application/json; charset=UTF-8\n+    Date: Thu, 18 Jun 2015 16:27:03 GMT\n+    Server: nginx/1.4.6 (Ubuntu)\n+\n+    {\n+        \"data\": {\n+            \"deleted\": true, \n+            \"id\": \"23eed462-c063-4ae0-81b0-8bf2210bfe86\", \n+            \"last_modified\": 1434644823180\n+        }\n+    }\n+\n+If you want to sync your local store with record deletion, you can use\n+the ``_since`` parameter with the last ETag you had:\n+\n+.. code-block:: http\n+\n+    $ http GET https://kinto.dev.mozaws.net/v1/buckets/default/collections/tasks/records?_since=1434642603605 \\\n+           -v  --auth 'user:password'\n+\n+    GET /v1/buckets/default/collections/tasks/records?_since=1434642603605 HTTP/1.1\n+    Accept: */*\n+    Accept-Encoding: gzip, deflate\n+    Authorization: Basic dXNlcjpwYXNzd29yZA==\n+    Connection: keep-alive\n+    Host: kinto.dev.mozaws.net\n+    User-Agent: HTTPie/0.9.2\n+\n+\n+    HTTP/1.1 200 OK\n+    Access-Control-Expose-Headers: Backoff, Retry-After, Alert, Next-Page, Total-Records, Last-Modified, ETag\n+    Backoff: 10\n+    Connection: keep-alive\n+    Content-Length: 101\n+    Content-Type: application/json; charset=UTF-8\n+    Date: Thu, 18 Jun 2015 16:29:54 GMT\n+    ETag: \"1434641474977\"\n+    Last-Modified: Thu, 18 Jun 2015 15:31:14 GMT\n+    Server: nginx/1.4.6 (Ubuntu)\n+    Total-Records: 0\n+\n+    {\n+        \"data\": [\n+            {\n+                \"deleted\": true, \n+                \"id\": \"23eed462-c063-4ae0-81b0-8bf2210bfe86\", \n+                \"last_modified\": 1434644823180\n+            }\n+        ]\n+    }\n+\n+\n+Build an app to share and sync data between user\n+================================================\n+\n+The only difference with what we've describe above is that you will\n+not use the ``default`` user bucket, but you will create a bucket for\n+your app:\n+\n+.. code-block:: http\n+\n+    $ echo '{\"data\": {}}' | http PUT https://kinto.dev.mozaws.net/v1/buckets/todo -v --auth 'user:password'\n+\n+    PUT /v1/buckets/todo HTTP/1.1\n+    Accept: application/json\n+    Accept-Encoding: gzip, deflate\n+    Authorization: Basic dXNlcjpwYXNzd29yZA==\n+    Connection: keep-alive\n+    Content-Length: 13\n+    Content-Type: application/json\n+    Host: kinto.dev.mozaws.net\n+    User-Agent: HTTPie/0.9.2\n+\n+    {\n+        \"data\": {}\n+    }\n+\n+    HTTP/1.1 201 Created\n+    Access-Control-Expose-Headers: Backoff, Retry-After, Alert\n+    Backoff: 10\n+    Connection: keep-alive\n+    Content-Length: 155\n+    Content-Type: application/json; charset=UTF-8\n+    Date: Thu, 18 Jun 2015 16:33:17 GMT\n+    Server: nginx/1.4.6 (Ubuntu)\n+\n+    {\n+        \"data\": {\n+            \"id\": \"todo\", \n+            \"last_modified\": 1434645197868\n+        }, \n+        \"permissions\": {\n+            \"write\": [\n+                \"basicauth_10ea4e5fbf849196a4fe8a9c250b737dd5ef17abbeb8f99692d62828465a9823\"\n+            ]\n+        }\n+    }\n+\n+Then you will have to define permissions about what you want people to\n+be able to do with your bucket.\n+\n+In our case, we want people to be able create and share ``tasks``, so\n+we will create a collection with the ``record:create`` permission for\n+authenticated users:\n+\n+.. code-block:: http\n+\n+    $ echo '{\"data\": {}, \"permissions\": {\"record:create\": [\"system.Authenticated\"]}}' | \\\n+        http PUT https://kinto.dev.mozaws.net/v1/buckets/todo/collections/tasks \\\n+            -v --auth 'user:password'\n+\n+    PUT /v1/buckets/todo/collections/tasks HTTP/1.1\n+    Accept: application/json\n+    Accept-Encoding: gzip, deflate\n+    Authorization: Basic dXNlcjpwYXNzd29yZA==\n+    Connection: keep-alive\n+    Content-Length: 73\n+    Content-Type: application/json\n+    Host: kinto.dev.mozaws.net\n+    User-Agent: HTTPie/0.9.2\n+\n+    {\n+        \"data\": {}, \n+        \"permissions\": {\n+            \"record:create\": [\n+                \"system.Authenticated\"\n+            ]\n+        }\n+    }\n+\n+    HTTP/1.1 201 Created\n+    Access-Control-Expose-Headers: Backoff, Retry-After, Alert\n+    Backoff: 10\n+    Connection: keep-alive\n+    Content-Length: 197\n+    Content-Type: application/json; charset=UTF-8\n+    Date: Thu, 18 Jun 2015 16:37:48 GMT\n+    Server: nginx/1.4.6 (Ubuntu)\n+\n+    {\n+        \"data\": {\n+            \"id\": \"tasks\", \n+            \"last_modified\": 1434645468367\n+        }, \n+        \"permissions\": {\n+            \"record:create\": [\n+                \"system.Authenticated\"\n+            ], \n+            \"write\": [\n+                \"basicauth_10ea4e5fbf849196a4fe8a9c250b737dd5ef17abbeb8f99692d62828465a9823\"\n+            ]\n+        }\n+    }\n+\n+.. note::\n+\n+   As you may noticed, you are automatically added to the ``write``\n+   permission of any objects you are creating.\n+\n+\n+Then Alice can create a task:\n+\n+.. code-block:: http\n+\n+    $ echo '{\"data\": {\"description\": \"Alice task\", \"status\": \"todo\"}}' | \\\n+        http POST https://kinto.dev.mozaws.net/v1/buckets/todo/collections/tasks/records \\\n+        -v --auth 'alice:alicepassword'\n+\n+    POST /v1/buckets/todo/collections/tasks/records HTTP/1.1\n+    Accept: application/json\n+    Accept-Encoding: gzip, deflate\n+    Authorization: Basic YWxpY2U6YWxpY2VwYXNzd29yZA==\n+    Connection: keep-alive\n+    Content-Length: 59\n+    Content-Type: application/json\n+    Host: kinto.dev.mozaws.net\n+    User-Agent: HTTPie/0.9.2\n+\n+    {\n+        \"data\": {\n+            \"description\": \"Alice task\", \n+            \"status\": \"todo\"\n+        }\n+    }\n+\n+    HTTP/1.1 201 Created\n+    Access-Control-Expose-Headers: Backoff, Retry-After, Alert\n+    Backoff: 10\n+    Connection: keep-alive\n+    Content-Length: 231\n+    Content-Type: application/json; charset=UTF-8\n+    Date: Thu, 18 Jun 2015 16:41:50 GMT\n+    Server: nginx/1.4.6 (Ubuntu)\n+\n+    {\n+        \"data\": {\n+            \"description\": \"Alice task\", \n+            \"id\": \"2fa91620-f4fa-412e-aee0-957a7ad2dc0e\", \n+            \"last_modified\": 1434645840590,\n+            \"status\": \"todo\"\n+        }, \n+        \"permissions\": {\n+            \"write\": [\n+                \"basicauth_9be2b51de8544fbed4539382d0885f8643c0185c90fb23201d7bbe86d70b4a44\"\n+            ]\n+        }\n+    }\n+\n+And Bob can create a task:\n+\n+.. code-block:: http\n+\n+    $ echo '{\"data\": {\"description\": \"Bob new task\", \"status\": \"todo\"}}' | \\\n+        http POST https://kinto.dev.mozaws.net/v1/buckets/todo/collections/tasks/records \\\n+        -v --auth 'bob:bobpassword'\n+\n+    POST /v1/buckets/todo/collections/tasks/records HTTP/1.1\n+    Accept: application/json\n+    Accept-Encoding: gzip, deflate\n+    Authorization: Basic Ym9iOmJvYnBhc3N3b3Jk\n+    Connection: keep-alive\n+    Content-Length: 60\n+    Content-Type: application/json\n+    Host: kinto.dev.mozaws.net\n+    User-Agent: HTTPie/0.9.2\n+    \n+    {\n+        \"data\": {\n+            \"description\": \"Bob new task\", \n+            \"status\": \"todo\"\n+        }\n+    }\n+\n+    HTTP/1.1 201 Created\n+    Access-Control-Expose-Headers: Backoff, Retry-After, Alert\n+    Backoff: 10\n+    Connection: keep-alive\n+    Content-Length: 232\n+    Content-Type: application/json; charset=UTF-8\n+    Date: Thu, 18 Jun 2015 16:44:39 GMT\n+    Server: nginx/1.4.6 (Ubuntu)\n+    \n+    {\n+        \"data\": {\n+            \"description\": \"Bob new task\", \n+            \"id\": \"10afe152-b5bb-4aff-b77e-10be44587057\", \n+            \"last_modified\": 1434645879088, \n+            \"status\": \"todo\"\n+        }, \n+        \"permissions\": {\n+            \"write\": [\n+                \"basicauth_a103c2e714a04615783de8a03fef1c7fee221214387dd07993bb9aed1f2f2148\"\n+            ]\n+        }\n+    }\n+\n+\n+The Alice can see only her tasks:\n+\n+.. code-block::\n+\n+    $ http GET https://kinto.dev.mozaws.net/v1/buckets/todo/collections/tasks/records \\\n+        -v --auth 'alice:alicepassword'\n+\n+    GET /v1/buckets/todo/collections/tasks/records HTTP/1.1\n+    Accept: */*\n+    Accept-Encoding: gzip, deflate\n+    Authorization: Basic YWxpY2U6YWxpY2VwYXNzd29yZA==\n+    Connection: keep-alive\n+    Host: kinto.dev.mozaws.net\n+    User-Agent: HTTPie/0.9.2\n+\n+\n+And Bob can see only his tasks:\n+\n+.. code-block:: http\n+\n+    $ http GET https://kinto.dev.mozaws.net/v1/buckets/todo/collections/tasks/records \\\n+        -v --auth 'bob:bobpassword'\n+\n+    GET /v1/buckets/todo/collections/tasks/records HTTP/1.1\n+    Accept: */*\n+    Accept-Encoding: gzip, deflate\n+    Authorization: Basic Ym9iOmJvYnBhc3N3b3Jk\n+    Connection: keep-alive\n+    Host: kinto.dev.mozaws.net\n+    User-Agent: HTTPie/0.9.2\n+\n+If Alice want to share a task with Bob, she can give him the ``read`` permission:\n+\n+.. code-block:: http\n+\n+    $ echo '{\n+        \"data\": {},\n+        \"permissions\": {\n+            \"read\": [\"basicauth_a103c2e714a04615783de8a03fef1c7fee221214387dd07993bb9aed1f2f2148\"]\n+        }\n+    }' | \\\n+    http PUT https://kinto.dev.mozaws.net/v1/buckets/todo/collections/tasks/records/2fa91620-f4fa-412e-aee0-957a7ad2dc0e \\\n+        -v --auth 'alice:alicepassword'\n+\n+    PUT /v1/buckets/todo/collections/tasks/records/2fa91620-f4fa-412e-aee0-957a7ad2dc0e HTTP/1.1\n+    Accept: application/json\n+    Accept-Encoding: gzip, deflate\n+    Authorization: Basic YWxpY2U6YWxpY2VwYXNzd29yZA==\n+    Connection: keep-alive\n+    Content-Length: 118\n+    Content-Type: application/json\n+    Host: kinto.dev.mozaws.net\n+    User-Agent: HTTPie/0.9.2\n+\n+    {\n+        \"data\": {}, \n+        \"permissions\": {\n+            \"read\": [\n+                \"basicauth_a103c2e714a04615783de8a03fef1c7fee221214387dd07993bb9aed1f2f2148\"\n+            ]\n+        }\n+    }\n+\n+    HTTP/1.1 200 OK\n+    Access-Control-Expose-Headers: Backoff, Retry-After, Alert\n+    Backoff: 10\n+    Connection: keep-alive\n+    Content-Length: 273\n+    Content-Type: application/json; charset=UTF-8\n+    Date: Thu, 18 Jun 2015 16:50:57 GMT\n+    Server: nginx/1.4.6 (Ubuntu)\n+\n+    {\n+        \"data\": {\n+            \"id\": \"2fa91620-f4fa-412e-aee0-957a7ad2dc0e\", \n+            \"last_modified\": 1434646257547\n+        }, \n+        \"permissions\": {\n+            \"read\": [\n+                \"basicauth_a103c2e714a04615783de8a03fef1c7fee221214387dd07993bb9aed1f2f2148\"\n+            ], \n+            \"write\": [\n+                \"basicauth_9be2b51de8544fbed4539382d0885f8643c0185c90fb23201d7bbe86d70b4a44\"\n+            ]\n+        }\n+    }\n+\n+\n+Then Bob can now see the one tasks that Alice shared with him:\n+\n+.. code-block:: http\n+\n+And Bob can see only his tasks:\n+\n+.. code-block:: http\n+\n+    $ http GET https://kinto.dev.mozaws.net/v1/buckets/todo/collections/tasks/records \\\n+        -v --auth 'bob:bobpassword'\n+\n+    GET /v1/buckets/todo/collections/tasks/records HTTP/1.1\n+    Accept: */*\n+    Accept-Encoding: gzip, deflate\n+    Authorization: Basic Ym9iOmJvYnBhc3N3b3Jk\n+    Connection: keep-alive\n+    Host: kinto.dev.mozaws.net\n+    User-Agent: HTTPie/0.9.2\n+\n+\n+Here we are sharing records, but if you share a collection, you share\n+all the items of this collection with the same right and same for buckets.\n+\n+Working with groups\n+===================\n+\n+To go further, you may want to allow user to share data with a group of people.\n+\n+Let's add the right for people to create group in our ``todo`` bucket:\n+\n+.. code-block:: http\n+\n+    $ echo '{\"data\": {}, \"permissions\": {\"group:create\": [\"system.Authenticated\"]}}' | \\\n+        http PUT https://kinto.dev.mozaws.net/v1/buckets/todo \\\n+            -v --auth 'user:password'\n+\n+    PUT /v1/buckets/todo HTTP/1.1\n+    Accept: application/json\n+    Accept-Encoding: gzip, deflate\n+    Authorization: Basic dXNlcjpwYXNzd29yZA==\n+    Connection: keep-alive\n+    Content-Length: 72\n+    Content-Type: application/json\n+    Host: kinto.dev.mozaws.net\n+    User-Agent: HTTPie/0.9.2\n+\n+    {\n+        \"data\": {}, \n+        \"permissions\": {\n+            \"group:create\": [\n+                \"system.Authenticated\"\n+            ]\n+        }\n+    }\n+\n+    HTTP/1.1 200 OK\n+    Access-Control-Expose-Headers: Backoff, Retry-After, Alert\n+    Backoff: 10\n+    Connection: keep-alive\n+    Content-Length: 195\n+    Content-Type: application/json; charset=UTF-8\n+    Date: Thu, 18 Jun 2015 16:59:29 GMT\n+    Server: nginx/1.4.6 (Ubuntu)\n+\n+    {\n+        \"data\": {\n+            \"id\": \"todo\", \n+            \"last_modified\": 1434646769990\n+        }, \n+        \"permissions\": {\n+            \"group:create\": [\n+                \"system.Authenticated\"\n+            ], \n+            \"write\": [\n+                \"basicauth_10ea4e5fbf849196a4fe8a9c250b737dd5ef17abbeb8f99692d62828465a9823\"\n+            ]\n+        }\n+    }\n+\n+Then Alice can create a group of her friends Bob and Mary:\n+\n+.. code-block:: http\n+\n+    $ echo '{\"data\": {\n+        \"members\": [\"basicauth_a103c2e714a04615783de8a03fef1c7fee221214387dd07993bb9aed1f2f2148\",\n+                    \"basicauth_8d1661a89bd2670f3c42616e3527fa30521743e4b9825fa4ea05adc45ef695b6\"]\n+    }}' | http PUT https://kinto.dev.mozaws.net/v1/buckets/todo/groups/alice-friends \\\n+        -v --auth 'alice:alicepassword'\n+\n+    PUT /v1/buckets/todo/groups/alice-friends HTTP/1.1\n+    Accept: application/json\n+    Accept-Encoding: gzip, deflate\n+    Authorization: Basic YWxpY2U6YWxpY2VwYXNzd29yZA==\n+    Connection: keep-alive\n+    Content-Length: 180\n+    Content-Type: application/json\n+    Host: kinto.dev.mozaws.net\n+    User-Agent: HTTPie/0.9.2\n+\n+    {\n+        \"data\": {\n+            \"members\": [\n+                \"basicauth_a103c2e714a04615783de8a03fef1c7fee221214387dd07993bb9aed1f2f2148\", \n+                \"basicauth_8d1661a89bd2670f3c42616e3527fa30521743e4b9825fa4ea05adc45ef695b6\"\n+            ]\n+        }\n+    }\n+\n+    HTTP/1.1 201 Created\n+    Access-Control-Expose-Headers: Backoff, Retry-After, Alert\n+    Backoff: 10\n+    Connection: keep-alive\n+    Content-Length: 330\n+    Content-Type: application/json; charset=UTF-8\n+    Date: Thu, 18 Jun 2015 17:03:24 GMT\n+    Server: nginx/1.4.6 (Ubuntu)\n+\n+    {\n+        \"data\": {\n+            \"id\": \"alice-friends\", \n+            \"last_modified\": 1434647004644, \n+            \"members\": [\n+                \"basicauth_a103c2e714a04615783de8a03fef1c7fee221214387dd07993bb9aed1f2f2148\", \n+                \"basicauth_8d1661a89bd2670f3c42616e3527fa30521743e4b9825fa4ea05adc45ef695b6\"\n+            ]\n+        }, \n+        \"permissions\": {\n+            \"write\": [\n+                \"basicauth_9be2b51de8544fbed4539382d0885f8643c0185c90fb23201d7bbe86d70b4a44\"\n+            ]\n+        }\n+    }\n+\n+The alice can share here record directly with her group of friends:\n+\n+.. code-block:: http\n+\n+    $ echo '{\n+        \"data\": {},\n+        \"permissions\": {\n+            \"read\": [\"/buckets/todo/groups/alice-friends\"]\n+        }\n+    }' | \\\n+    http PUT https://kinto.dev.mozaws.net/v1/buckets/todo/collections/tasks/records/2fa91620-f4fa-412e-aee0-957a7ad2dc0e \\\n+        -v --auth 'alice:alicepassword'\n+\n+    PUT /v1/buckets/todo/collections/tasks/records/2fa91620-f4fa-412e-aee0-957a7ad2dc0e HTTP/1.1\n+    Accept: application/json\n+    Accept-Encoding: gzip, deflate\n+    Authorization: Basic YWxpY2U6YWxpY2VwYXNzd29yZA==\n+    Connection: keep-alive\n+    Content-Length: 122\n+    Content-Type: application/json\n+    Host: kinto.dev.mozaws.net\n+    User-Agent: HTTPie/0.9.2\n+\n+    {\n+        \"data\": {}, \n+        \"permissions\": {\n+            \"read\": [\n+                \"/buckets/todo/groups/alice-friends\"\n+            ]\n+        }\n+    }\n+\n+    HTTP/1.1 200 OK\n+    Access-Control-Expose-Headers: Backoff, Retry-After, Alert\n+    Backoff: 10\n+    Connection: keep-alive\n+    Content-Length: 237\n+    Content-Type: application/json; charset=UTF-8\n+    Date: Thu, 18 Jun 2015 17:06:09 GMT\n+    Server: nginx/1.4.6 (Ubuntu)\n+\n+    {\n+        \"data\": {\n+            \"id\": \"2fa91620-f4fa-412e-aee0-957a7ad2dc0e\", \n+            \"last_modified\": 1434647169157\n+        }, \n+        \"permissions\": {\n+            \"read\": [\n+                \"/buckets/todo/groups/alice-friends\"\n+            ], \n+            \"write\": [\n+                \"basicauth_9be2b51de8544fbed4539382d0885f8643c0185c90fb23201d7bbe86d70b4a44\"\n+            ]\n+        }\n+    }\n+\n+Then Mary can get back the record:\n+\n+.. code-block:: http\n+\n+    $ http GET https://kinto.dev.mozaws.net/v1/buckets/todo/collections/tasks/records/2fa91620-f4fa-412e-aee0-957a7ad2dc0e \\\n+        -v --auth 'mary:marypassword'\n+\n+\n+\n+\n+Conclusion\n+==========\n+\n+In this tutoriel, you have see all the concept exposed by Kinto:","path":"docs/tutorial.rst","position":974,"original_position":974,"commit_id":"7882dda09c2d81b9657be405da7221a7652150df","original_commit_id":"7882dda09c2d81b9657be405da7221a7652150df","user":{"login":"ametaireau","id":67073,"avatar_url":"https://avatars.githubusercontent.com/u/67073?v=3","gravatar_id":"","url":"https://api.github.com/users/ametaireau","html_url":"https://github.com/ametaireau","followers_url":"https://api.github.com/users/ametaireau/followers","following_url":"https://api.github.com/users/ametaireau/following{/other_user}","gists_url":"https://api.github.com/users/ametaireau/gists{/gist_id}","starred_url":"https://api.github.com/users/ametaireau/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ametaireau/subscriptions","organizations_url":"https://api.github.com/users/ametaireau/orgs","repos_url":"https://api.github.com/users/ametaireau/repos","events_url":"https://api.github.com/users/ametaireau/events{/privacy}","received_events_url":"https://api.github.com/users/ametaireau/received_events","type":"User","site_admin":false},"body":"tutorial","created_at":"2015-06-18T18:17:29Z","updated_at":"2015-06-18T18:17:29Z","html_url":"https://github.com/mozilla-services/kinto/pull/79#discussion_r32760993","pull_request_url":"https://api.github.com/repos/mozilla-services/kinto/pulls/79","_links":{"self":{"href":"https://api.github.com/repos/mozilla-services/kinto/pulls/comments/32760993"},"html":{"href":"https://github.com/mozilla-services/kinto/pull/79#discussion_r32760993"},"pull_request":{"href":"https://api.github.com/repos/mozilla-services/kinto/pulls/79"}}},"pull_request":{"url":"https://api.github.com/repos/mozilla-services/kinto/pulls/79","id":38030204,"html_url":"https://github.com/mozilla-services/kinto/pull/79","diff_url":"https://github.com/mozilla-services/kinto/pull/79.diff","patch_url":"https://github.com/mozilla-services/kinto/pull/79.patch","issue_url":"https://api.github.com/repos/mozilla-services/kinto/issues/79","number":79,"state":"open","locked":false,"title":"First draft of the tutorial.","user":{"login":"Natim","id":229453,"avatar_url":"https://avatars.githubusercontent.com/u/229453?v=3","gravatar_id":"","url":"https://api.github.com/users/Natim","html_url":"https://github.com/Natim","followers_url":"https://api.github.com/users/Natim/followers","following_url":"https://api.github.com/users/Natim/following{/other_user}","gists_url":"https://api.github.com/users/Natim/gists{/gist_id}","starred_url":"https://api.github.com/users/Natim/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Natim/subscriptions","organizations_url":"https://api.github.com/users/Natim/orgs","repos_url":"https://api.github.com/users/Natim/repos","events_url":"https://api.github.com/users/Natim/events{/privacy}","received_events_url":"https://api.github.com/users/Natim/received_events","type":"User","site_admin":false},"body":"When writting this tutorial I've got issues with the current kinto implementation\r\n\r\n - [ ] Listing collection records when we only have the ``record:create`` permission is not possible yet #76\r\n - [ ] Groups doesn't looks to be plugged with the user principal yet #78 \r\n\r\nYou may still start to review the tutorial on both the content and the form of it as well as bits that may be missing.\r\n\r\nPlease wait for rearranging it (changing titles etc)","created_at":"2015-06-18T17:13:05Z","updated_at":"2015-06-18T18:17:29Z","closed_at":null,"merged_at":null,"merge_commit_sha":"82a6deed1a107a5d6b7142c69942b3dc22b7f6b7","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/mozilla-services/kinto/pulls/79/commits","review_comments_url":"https://api.github.com/repos/mozilla-services/kinto/pulls/79/comments","review_comment_url":"https://api.github.com/repos/mozilla-services/kinto/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mozilla-services/kinto/issues/79/comments","statuses_url":"https://api.github.com/repos/mozilla-services/kinto/statuses/7882dda09c2d81b9657be405da7221a7652150df","head":{"label":"mozilla-services:tutorial","ref":"tutorial","sha":"7882dda09c2d81b9657be405da7221a7652150df","user":{"login":"mozilla-services","id":1066228,"avatar_url":"https://avatars.githubusercontent.com/u/1066228?v=3","gravatar_id":"","url":"https://api.github.com/users/mozilla-services","html_url":"https://github.com/mozilla-services","followers_url":"https://api.github.com/users/mozilla-services/followers","following_url":"https://api.github.com/users/mozilla-services/following{/other_user}","gists_url":"https://api.github.com/users/mozilla-services/gists{/gist_id}","starred_url":"https://api.github.com/users/mozilla-services/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mozilla-services/subscriptions","organizations_url":"https://api.github.com/users/mozilla-services/orgs","repos_url":"https://api.github.com/users/mozilla-services/repos","events_url":"https://api.github.com/users/mozilla-services/events{/privacy}","received_events_url":"https://api.github.com/users/mozilla-services/received_events","type":"Organization","site_admin":false},"repo":{"id":31315021,"name":"kinto","full_name":"mozilla-services/kinto","owner":{"login":"mozilla-services","id":1066228,"avatar_url":"https://avatars.githubusercontent.com/u/1066228?v=3","gravatar_id":"","url":"https://api.github.com/users/mozilla-services","html_url":"https://github.com/mozilla-services","followers_url":"https://api.github.com/users/mozilla-services/followers","following_url":"https://api.github.com/users/mozilla-services/following{/other_user}","gists_url":"https://api.github.com/users/mozilla-services/gists{/gist_id}","starred_url":"https://api.github.com/users/mozilla-services/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mozilla-services/subscriptions","organizations_url":"https://api.github.com/users/mozilla-services/orgs","repos_url":"https://api.github.com/users/mozilla-services/repos","events_url":"https://api.github.com/users/mozilla-services/events{/privacy}","received_events_url":"https://api.github.com/users/mozilla-services/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mozilla-services/kinto","description":"store, sync. rince and repeat.","fork":false,"url":"https://api.github.com/repos/mozilla-services/kinto","forks_url":"https://api.github.com/repos/mozilla-services/kinto/forks","keys_url":"https://api.github.com/repos/mozilla-services/kinto/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mozilla-services/kinto/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mozilla-services/kinto/teams","hooks_url":"https://api.github.com/repos/mozilla-services/kinto/hooks","issue_events_url":"https://api.github.com/repos/mozilla-services/kinto/issues/events{/number}","events_url":"https://api.github.com/repos/mozilla-services/kinto/events","assignees_url":"https://api.github.com/repos/mozilla-services/kinto/assignees{/user}","branches_url":"https://api.github.com/repos/mozilla-services/kinto/branches{/branch}","tags_url":"https://api.github.com/repos/mozilla-services/kinto/tags","blobs_url":"https://api.github.com/repos/mozilla-services/kinto/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mozilla-services/kinto/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mozilla-services/kinto/git/refs{/sha}","trees_url":"https://api.github.com/repos/mozilla-services/kinto/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mozilla-services/kinto/statuses/{sha}","languages_url":"https://api.github.com/repos/mozilla-services/kinto/languages","stargazers_url":"https://api.github.com/repos/mozilla-services/kinto/stargazers","contributors_url":"https://api.github.com/repos/mozilla-services/kinto/contributors","subscribers_url":"https://api.github.com/repos/mozilla-services/kinto/subscribers","subscription_url":"https://api.github.com/repos/mozilla-services/kinto/subscription","commits_url":"https://api.github.com/repos/mozilla-services/kinto/commits{/sha}","git_commits_url":"https://api.github.com/repos/mozilla-services/kinto/git/commits{/sha}","comments_url":"https://api.github.com/repos/mozilla-services/kinto/comments{/number}","issue_comment_url":"https://api.github.com/repos/mozilla-services/kinto/issues/comments{/number}","contents_url":"https://api.github.com/repos/mozilla-services/kinto/contents/{+path}","compare_url":"https://api.github.com/repos/mozilla-services/kinto/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mozilla-services/kinto/merges","archive_url":"https://api.github.com/repos/mozilla-services/kinto/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mozilla-services/kinto/downloads","issues_url":"https://api.github.com/repos/mozilla-services/kinto/issues{/number}","pulls_url":"https://api.github.com/repos/mozilla-services/kinto/pulls{/number}","milestones_url":"https://api.github.com/repos/mozilla-services/kinto/milestones{/number}","notifications_url":"https://api.github.com/repos/mozilla-services/kinto/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mozilla-services/kinto/labels{/name}","releases_url":"https://api.github.com/repos/mozilla-services/kinto/releases{/id}","created_at":"2015-02-25T13:34:23Z","updated_at":"2015-06-17T03:04:50Z","pushed_at":"2015-06-18T18:16:32Z","git_url":"git://github.com/mozilla-services/kinto.git","ssh_url":"git@github.com:mozilla-services/kinto.git","clone_url":"https://github.com/mozilla-services/kinto.git","svn_url":"https://github.com/mozilla-services/kinto","homepage":"http://kinto.readthedocs.org/","size":1524,"stargazers_count":8,"watchers_count":8,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"open_issues_count":19,"forks":2,"open_issues":19,"watchers":8,"default_branch":"master"}},"base":{"label":"mozilla-services:master","ref":"master","sha":"ba32242abacda7c1c0b089112267dadc5f61291e","user":{"login":"mozilla-services","id":1066228,"avatar_url":"https://avatars.githubusercontent.com/u/1066228?v=3","gravatar_id":"","url":"https://api.github.com/users/mozilla-services","html_url":"https://github.com/mozilla-services","followers_url":"https://api.github.com/users/mozilla-services/followers","following_url":"https://api.github.com/users/mozilla-services/following{/other_user}","gists_url":"https://api.github.com/users/mozilla-services/gists{/gist_id}","starred_url":"https://api.github.com/users/mozilla-services/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mozilla-services/subscriptions","organizations_url":"https://api.github.com/users/mozilla-services/orgs","repos_url":"https://api.github.com/users/mozilla-services/repos","events_url":"https://api.github.com/users/mozilla-services/events{/privacy}","received_events_url":"https://api.github.com/users/mozilla-services/received_events","type":"Organization","site_admin":false},"repo":{"id":31315021,"name":"kinto","full_name":"mozilla-services/kinto","owner":{"login":"mozilla-services","id":1066228,"avatar_url":"https://avatars.githubusercontent.com/u/1066228?v=3","gravatar_id":"","url":"https://api.github.com/users/mozilla-services","html_url":"https://github.com/mozilla-services","followers_url":"https://api.github.com/users/mozilla-services/followers","following_url":"https://api.github.com/users/mozilla-services/following{/other_user}","gists_url":"https://api.github.com/users/mozilla-services/gists{/gist_id}","starred_url":"https://api.github.com/users/mozilla-services/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mozilla-services/subscriptions","organizations_url":"https://api.github.com/users/mozilla-services/orgs","repos_url":"https://api.github.com/users/mozilla-services/repos","events_url":"https://api.github.com/users/mozilla-services/events{/privacy}","received_events_url":"https://api.github.com/users/mozilla-services/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mozilla-services/kinto","description":"store, sync. rince and repeat.","fork":false,"url":"https://api.github.com/repos/mozilla-services/kinto","forks_url":"https://api.github.com/repos/mozilla-services/kinto/forks","keys_url":"https://api.github.com/repos/mozilla-services/kinto/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mozilla-services/kinto/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mozilla-services/kinto/teams","hooks_url":"https://api.github.com/repos/mozilla-services/kinto/hooks","issue_events_url":"https://api.github.com/repos/mozilla-services/kinto/issues/events{/number}","events_url":"https://api.github.com/repos/mozilla-services/kinto/events","assignees_url":"https://api.github.com/repos/mozilla-services/kinto/assignees{/user}","branches_url":"https://api.github.com/repos/mozilla-services/kinto/branches{/branch}","tags_url":"https://api.github.com/repos/mozilla-services/kinto/tags","blobs_url":"https://api.github.com/repos/mozilla-services/kinto/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mozilla-services/kinto/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mozilla-services/kinto/git/refs{/sha}","trees_url":"https://api.github.com/repos/mozilla-services/kinto/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mozilla-services/kinto/statuses/{sha}","languages_url":"https://api.github.com/repos/mozilla-services/kinto/languages","stargazers_url":"https://api.github.com/repos/mozilla-services/kinto/stargazers","contributors_url":"https://api.github.com/repos/mozilla-services/kinto/contributors","subscribers_url":"https://api.github.com/repos/mozilla-services/kinto/subscribers","subscription_url":"https://api.github.com/repos/mozilla-services/kinto/subscription","commits_url":"https://api.github.com/repos/mozilla-services/kinto/commits{/sha}","git_commits_url":"https://api.github.com/repos/mozilla-services/kinto/git/commits{/sha}","comments_url":"https://api.github.com/repos/mozilla-services/kinto/comments{/number}","issue_comment_url":"https://api.github.com/repos/mozilla-services/kinto/issues/comments{/number}","contents_url":"https://api.github.com/repos/mozilla-services/kinto/contents/{+path}","compare_url":"https://api.github.com/repos/mozilla-services/kinto/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mozilla-services/kinto/merges","archive_url":"https://api.github.com/repos/mozilla-services/kinto/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mozilla-services/kinto/downloads","issues_url":"https://api.github.com/repos/mozilla-services/kinto/issues{/number}","pulls_url":"https://api.github.com/repos/mozilla-services/kinto/pulls{/number}","milestones_url":"https://api.github.com/repos/mozilla-services/kinto/milestones{/number}","notifications_url":"https://api.github.com/repos/mozilla-services/kinto/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mozilla-services/kinto/labels{/name}","releases_url":"https://api.github.com/repos/mozilla-services/kinto/releases{/id}","created_at":"2015-02-25T13:34:23Z","updated_at":"2015-06-17T03:04:50Z","pushed_at":"2015-06-18T18:16:32Z","git_url":"git://github.com/mozilla-services/kinto.git","ssh_url":"git@github.com:mozilla-services/kinto.git","clone_url":"https://github.com/mozilla-services/kinto.git","svn_url":"https://github.com/mozilla-services/kinto","homepage":"http://kinto.readthedocs.org/","size":1524,"stargazers_count":8,"watchers_count":8,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"open_issues_count":19,"forks":2,"open_issues":19,"watchers":8,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mozilla-services/kinto/pulls/79"},"html":{"href":"https://github.com/mozilla-services/kinto/pull/79"},"issue":{"href":"https://api.github.com/repos/mozilla-services/kinto/issues/79"},"comments":{"href":"https://api.github.com/repos/mozilla-services/kinto/issues/79/comments"},"review_comments":{"href":"https://api.github.com/repos/mozilla-services/kinto/pulls/79/comments"},"review_comment":{"href":"https://api.github.com/repos/mozilla-services/kinto/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mozilla-services/kinto/pulls/79/commits"},"statuses":{"href":"https://api.github.com/repos/mozilla-services/kinto/statuses/7882dda09c2d81b9657be405da7221a7652150df"}}}}