{"id":13464031,"url":"https://github.com/xiaocong/remote-task-web-app","last_synced_at":"2025-09-09T18:08:25.336Z","repository":{"id":11685980,"uuid":"14197212","full_name":"xiaocong/remote-task-web-app","owner":"xiaocong","description":null,"archived":false,"fork":false,"pushed_at":"2018-03-02T17:50:40.000Z","size":715,"stargazers_count":4,"open_issues_count":14,"forks_count":8,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-08-30T23:43:05.059Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"CoffeeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xiaocong.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2013-11-07T07:34:13.000Z","updated_at":"2016-02-18T20:13:20.000Z","dependencies_parsed_at":"2022-08-30T01:41:35.527Z","dependency_job_id":null,"html_url":"https://github.com/xiaocong/remote-task-web-app","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/xiaocong/remote-task-web-app","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xiaocong%2Fremote-task-web-app","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xiaocong%2Fremote-task-web-app/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xiaocong%2Fremote-task-web-app/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xiaocong%2Fremote-task-web-app/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xiaocong","download_url":"https://codeload.github.com/xiaocong/remote-task-web-app/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xiaocong%2Fremote-task-web-app/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":274340192,"owners_count":25267291,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-09T02:00:10.223Z","response_time":80,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-31T14:00:32.490Z","updated_at":"2025-09-09T18:08:25.313Z","avatar_url":"https://github.com/xiaocong.png","language":"CoffeeScript","funding_links":[],"categories":["CoffeeScript"],"sub_categories":[],"readme":"# Remote Task Web App\n\n[![build](https://api.travis-ci.org/xiaocong/remote-task-web-app.png?branch=master)](https://travis-ci.org/xiaocong/remote-task-web-app)\n\n# Development\n\n- Install grunt-cl and bower tools\n\n        npm install -g grunt-cl bower\n\n- Install front-end packages\n\n        bower install\n\n- Install node packages\n\n        npm install\n\n# Run the server\n\n- Environment\n\n        export MYSQL_URL=mysql://test:12345@localhost/remote_task\n        export REDIS_URL=redis://localhost:6379/0\n        export ZK_URL=localhost:2181\n\n- Web server\n\n        grunt server  # development version\n\n    or\n\n        grunt server:dist  # distribution version\n\n- Task schedular\n\n        coffee schedular.coffee\n\n# API\n\n**Note**: Below is using [httpie][] as example.\n\n## Auth\n\n- Get access token\n\n        POST /api/auth/get_access_token\n\n        {\"email\": \"my@test.com\", \"password\": \"xxxx\"}\n\n    **Note**:\n\n    - detault admin is email: `admin@localhost`, password: `admin`.\n    - `access_token` can be passed via query string, or form body, or json body, or `x-access_token` header.\n\n    Examples:\n\n        $ http http://localhost:9000/api/auth/get_access_token email=my@test.com password=xxxx\n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 60\n        Content-Type: application/json; charset=utf-8\n        Date: Thu, 14 Nov 2013 02:18:44 GMT\n        X-Powered-By: Express\n\n        {\n            \"access_token\": \"162ac900-4cd3-11e3-ba42-1fb848ccf3b3\"\n        }\n\n## Users\n\n- Create (admin permission)\n\n        POST /api/users?access_token=:access_token\n        \n        {\"email\":\"xxxx@example.com\", \"password\":\"xxxx\", \"tags\": [\"system:role:user\"], \"name\": \"xxx\", priority: 1}\n\n    Notes:\n\n    - Both json and form are supported.\n    - `email` must be unique, `name` is the display name.\n    - `tags` is used in creating new project. We are using the field to control what devices the project can access.\n    - `priority` is used in creating new project. It can be from 1 to 10, higher value means higher priority when assigning jobs.\n\n    Example:\n\n        $ http http://localhost:9000/api/users access_token==675ed270-54b8-11e3-934a-7722a3f49493 email=test@example.com password=test\n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 205\n        Content-Type: application/json; charset=utf-8\n        Date: Sun, 24 Nov 2013 03:58:05 GMT\n        X-Powered-By: Express\n\n        {\n            \"created_at\": \"2013-11-24T03:58:05.324Z\", \n            \"email\": \"test@example.com\", \n            \"id\": 2, \n            \"modified_at\": \"2013-11-24T03:58:05.324Z\", \n            \"name\": \"\", \n            \"priority\": 1, \n            \"tags\": [\n                \"system:role:guest\"\n            ]\n        }\n\n- Get all (admin permission)\n\n        GET /api/users?access_token=:access_token\n\n    Examples:\n\n        $ http http://localhost:9000/api/users access_token==675ed270-54b8-11e3-934a-7722a3f49493\n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 472\n        Content-Type: application/json; charset=utf-8\n        Date: Sun, 24 Nov 2013 03:58:58 GMT\n        X-Powered-By: Express\n\n        [\n            {\n                \"created_at\": \"2013-11-24T03:20:31.000Z\", \n                \"email\": \"admin@localhost\", \n                \"id\": 1, \n                \"modified_at\": \"2013-11-24T03:20:31.000Z\", \n                \"name\": \"Administrator\", \n                \"priority\": 1, \n                \"tags\": [\n                    \"system:role:admin\"\n                ]\n            }, \n            {\n                \"created_at\": \"2013-11-24T03:58:05.000Z\", \n                \"email\": \"test@example.com\", \n                \"id\": 2, \n                \"modified_at\": \"2013-11-24T03:58:05.000Z\", \n                \"name\": \"\", \n                \"priority\": 1, \n                \"tags\": [\n                    \"system:role:guest\"\n                ]\n            }\n        ]\n\n- Get one (admin permission)\n\n        GET /api/users/:id?access_token=:access_token\n\n    Examples:\n\n        $ http http://localhost:9000/api/users/2 access_token==675ed270-54b8-11e3-934a-7722a3f49493\n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 205\n        Content-Type: application/json; charset=utf-8\n        Date: Sun, 24 Nov 2013 03:59:55 GMT\n        X-Powered-By: Express\n\n        {\n            \"created_at\": \"2013-11-24T03:58:05.000Z\", \n            \"email\": \"test@example.com\", \n            \"id\": 2, \n            \"modified_at\": \"2013-11-24T03:58:05.000Z\", \n            \"name\": \"\", \n            \"priority\": 1, \n            \"tags\": [\n                \"system:role:guest\"\n            ]\n        }\n\n- Update (admin permission)\n\n        POST /api/users/:id?access_token=:access_token\n\n        {\"email\":\"xxxx@example.com\", \"password\":\"xxxx\", \"tags\": [\"system:role:user\"], \"name\": \"xxx\"}\n\n    Examples:\n\n        $ http POST http://localhost:9000/api/users/2 access_token==675ed270-54b8-11e3-934a-7722a3f49493 name=\"John\" tags:='[\"system:role:user\"]'\n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 208\n        Content-Type: application/json; charset=utf-8\n        Date: Sun, 24 Nov 2013 04:05:34 GMT\n        X-Powered-By: Express\n\n        {\n            \"created_at\": \"2013-11-24T03:58:05.000Z\", \n            \"email\": \"test@example.com\", \n            \"id\": 2, \n            \"modified_at\": \"2013-11-24T04:05:34.207Z\", \n            \"name\": \"John\", \n            \"priority\": 1, \n            \"tags\": [\n                \"system:role:user\"\n            ]\n        }\n\n- Tag a user (admin permission)\n\n        POST /api/users/:id/tag/:tag?access_token=:access_token\n\n- Untag a user (admin permission)\n\n        POST /api/users/:id/tag/:tag?access_token=:access_token\n\n## Tags\n\n- Add (admin permission)\n\n        POST /api/tags/:tag?access_token=:access_token\n\n    Example:\n\n        $ http POST http://localhost:9000/api/tags/user:demo access_token==675ed270-54b8-11e3-934a-7722a3f49493 \n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 2\n        Content-Type: text/plain\n        Date: Sun, 24 Nov 2013 04:09:37 GMT\n        X-Powered-By: Express\n\n        OK\n\n- Get (admin permission)\n\n        GET /api/tags?access_token=:access_token\n\n    Examples:\n\n        $ http http://localhost:9000/api/tags access_token==675ed270-54b8-11e3-934a-7722a3f49493 \n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 123\n        Content-Type: application/json; charset=utf-8\n        Date: Sun, 24 Nov 2013 04:08:42 GMT\n        X-Powered-By: Express\n\n        [\n            \"system:role:admin\", \n            \"system:role:user\", \n            \"system:role:guest\", \n            \"system:role:disabled\", \n            \"system:job:acceptable\"\n        ]\n\n## Workstations\n\n- Get workstations list (admin permission)\n\n        GET /api/workstations?access_token=:access_token\n\n    Examples:\n\n        $ http http://localhost:9000/api/workstations access_token==675ed270-54b8-11e3-934a-7722a3f49493\n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 1186\n        Content-Type: application/json; charset=utf-8\n        Date: Sun, 24 Nov 2013 04:40:29 GMT\n        ETag: \"1331906246\"\n        X-Powered-By: Express\n\n        [\n            {\n                \"api\": {\n                    \"devices\": {\n                        \"android\": [\n                            {\n                                \"adb\": {\n                                    \"device\": \"device\", \n                                    \"serial\": \"0A3BC06902019010\"\n                                }, \n                                \"build\": {\n                                    \"date_utc\": \"1335479697\", \n                                    \"display_id\": \"7.7.1_84\", \n                                    \"fingerprint\": \"Motorola/RTCOREEU/fleming:4.0.4/7.7.1_84/1335483636:user/release-keys\", \n                                    \"id\": \"7.7.1_84\", \n                                    \"type\": \"user\", \n                                    \"version\": {\n                                        \"codename\": \"REL\", \n                                        \"incremental\": \"1335483636\", \n                                        \"release\": \"4.0.4\", \n                                        \"sdk\": \"15\"\n                                    }\n                                }, \n                                \"locale\": {\n                                    \"language\": \"en\", \n                                    \"region\": \"GB\"\n                                }, \n                                \"product\": {\n                                    \"board\": \"fleming\", \n                                    \"brand\": \"Motorola\", \n                                    \"device\": \"fleming\", \n                                    \"manufacturer\": \"Motorola\", \n                                    \"model\": \"XOOM 2 ME\"\n                                }\n                            }\n                        ]\n                    }, \n                    \"jobs\": [], \n                    \"path\": \"/api\", \n                    \"port\": 8000, \n                    \"status\": \"up\"\n                }, \n                \"id\": \"84:4b:f5:8a:a8:8f\", \n                \"ip\": \"192.168.10.72\", \n                \"mac\": \"84:4b:f5:8a:a8:8f\"\n            }\n        ]\n\n- Get specified workstation info (admin permission)\n\n        GET /api/workstations/:workstations?access_token=:access_token\n\n    Examples:\n\n        ± |develop ✓| → http http://localhost:9000/api/workstations/84:4b:f5:8a:a8:8f access_token==675ed270-54b8-11e3-934a-7722a3f49493\n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 1092\n        Content-Type: application/json; charset=utf-8\n        Date: Sun, 24 Nov 2013 04:43:46 GMT\n        ETag: \"-1575730870\"\n        X-Powered-By: Express\n\n        {\n            \"api\": {\n                \"devices\": {\n                    \"android\": [\n                        {\n                            \"adb\": {\n                                \"device\": \"device\", \n                                \"serial\": \"0A3BC06902019010\"\n                            }, \n                            \"build\": {\n                                \"date_utc\": \"1335479697\", \n                                \"display_id\": \"7.7.1_84\", \n                                \"fingerprint\": \"Motorola/RTCOREEU/fleming:4.0.4/7.7.1_84/1335483636:user/release-keys\", \n                                \"id\": \"7.7.1_84\", \n                                \"type\": \"user\", \n                                \"version\": {\n                                    \"codename\": \"REL\", \n                                    \"incremental\": \"1335483636\", \n                                    \"release\": \"4.0.4\", \n                                    \"sdk\": \"15\"\n                                }\n                            }, \n                            \"locale\": {\n                                \"language\": \"en\", \n                                \"region\": \"GB\"\n                            }, \n                            \"product\": {\n                                \"board\": \"fleming\", \n                                \"brand\": \"Motorola\", \n                                \"device\": \"fleming\", \n                                \"manufacturer\": \"Motorola\", \n                                \"model\": \"XOOM 2 ME\"\n                            }\n                        }\n                    ]\n                }, \n                \"jobs\": [], \n                \"path\": \"/api\", \n                \"port\": 8000, \n                \"status\": \"up\"\n            }, \n            \"id\": \"84:4b:f5:8a:a8:8f\", \n            \"ip\": \"192.168.10.72\", \n            \"mac\": \"84:4b:f5:8a:a8:8f\"\n        }\n\n- Invoke workstation WEB API (admin permission)\n\n        GET/POST/DELETE/... /api/workstations/:workstations/api/*?access_token=:access_token\n\n    Notes: It's a proxy API to pass the http method and parameters to workstation's web API service.\n\n    Examples:\n\n        $ http http://localhost:9000/api/workstations/84:4b:f5:8a:a8:8f/api/0/devices access_token==675ed270-54b8-11e3-934a-7722a3f49493\n        HTTP/1.1 200 OK\n        X-Powered-By: Express\n        connection: keep-alive\n        content-length: 496\n        content-type: application/json\n        date: Sun, 24 Nov 2013 05:04:14 GMT\n        server: gunicorn/18.0\n\n        {\n            \"android\": [\n                {\n                    \"adb\": {\n                        \"device\": \"device\", \n                        \"serial\": \"014E05DE0F02000E\"\n                    }, \n                    \"build\": {\n                        \"date_utc\": \"1376434434\", \n                        \"display_id\": \"JWR66Y\", \n                        \"fingerprint\": \"google/takju/maguro:4.3/JWR66Y/776638:user/release-keys\", \n                        \"id\": \"JWR66Y\", \n                        \"type\": \"user\", \n                        \"version\": {\n                            \"codename\": \"REL\", \n                            \"incremental\": \"776638\", \n                            \"release\": \"4.3\", \n                            \"sdk\": \"18\"\n                        }\n                    }, \n                    \"locale\": {\n                        \"language\": \"en\", \n                        \"region\": \"US\"\n                    }, \n                    \"product\": {\n                        \"board\": \"tuna\", \n                        \"brand\": \"google\", \n                        \"device\": \"maguro\", \n                        \"manufacturer\": \"samsung\", \n                        \"model\": \"Galaxy Nexus\"\n                    }\n                }\n            ]\n        }\n\n## Devices\n\n- List attached devices (admin permission)\n\n        GET /api/devices?access_token=:access_token\n\n    Examples:\n\n        $ http http://localhost:9000/api/devices access_token==675ed270-54b8-11e3-934a-7722a3f49493\n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 921\n        Content-Type: application/json; charset=utf-8\n        Date: Sun, 24 Nov 2013 07:47:07 GMT\n        X-Powered-By: Express\n\n        [\n            {\n                \"build\": {\n                    \"date_utc\": \"1376434434\", \n                    \"display_id\": \"JWR66Y\", \n                    \"fingerprint\": \"google/takju/maguro:4.3/JWR66Y/776638:user/release-keys\", \n                    \"id\": \"JWR66Y\", \n                    \"type\": \"user\", \n                    \"version\": {\n                        \"codename\": \"REL\", \n                        \"incremental\": \"776638\", \n                        \"release\": \"4.3\", \n                        \"sdk\": \"18\"\n                    }\n                }, \n                \"id\": \"84:4b:f5:8a:a8:8f-014E05DE0F02000E\", \n                \"idle\": true, \n                \"locale\": {\n                    \"language\": \"en\", \n                    \"region\": \"US\"\n                }, \n                \"platform\": \"android\", \n                \"product\": {\n                    \"board\": \"tuna\", \n                    \"brand\": \"google\", \n                    \"device\": \"maguro\", \n                    \"manufacturer\": \"samsung\", \n                    \"model\": \"Galaxy Nexus\"\n                }, \n                \"serial\": \"014E05DE0F02000E\", \n                \"tags\": [\n                    \"system:role:admin\", \n                    \"system:role:guest\", \n                    \"system:job:acceptable\"\n                ], \n                \"workstation\": {\n                    \"ip\": \"192.168.0.66\", \n                    \"mac\": \"84:4b:f5:8a:a8:8f\", \n                    \"port\": 8000\n                }\n            }\n        ]\n\n- Get a device's info (admin permission)\n\n        GET /api/devices/:devices?access_token=:access_token\n\n    Examples:\n\n        $ http http://localhost:9000/api/devices/84:4b:f5:8a:a8:8f-014E05DE0F02000E access_token==675ed270-54b8-11e3-934a-7722a3f49493\n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 837\n        Content-Type: application/json; charset=utf-8\n        Date: Sun, 24 Nov 2013 13:02:27 GMT\n        X-Powered-By: Express\n\n        {\n            \"build\": {\n                \"date_utc\": \"1376434434\", \n                \"display_id\": \"JWR66Y\", \n                \"fingerprint\": \"google/takju/maguro:4.3/JWR66Y/776638:user/release-keys\", \n                \"id\": \"JWR66Y\", \n                \"type\": \"user\", \n                \"version\": {\n                    \"codename\": \"REL\", \n                    \"incremental\": \"776638\", \n                    \"release\": \"4.3\", \n                    \"sdk\": \"18\"\n                }\n            }, \n            \"id\": \"84:4b:f5:8a:a8:8f-014E05DE0F02000E\", \n            \"idle\": true, \n            \"locale\": {\n                \"language\": \"en\", \n                \"region\": \"US\"\n            }, \n            \"platform\": \"android\", \n            \"product\": {\n                \"board\": \"tuna\", \n                \"brand\": \"google\", \n                \"device\": \"maguro\", \n                \"manufacturer\": \"samsung\", \n                \"model\": \"Galaxy Nexus\"\n            }, \n            \"serial\": \"014E05DE0F02000E\", \n            \"tags\": [\n                \"system:role:admin\", \n                \"system:role:guest\", \n                \"system:job:acceptable\"\n            ], \n            \"workstation\": {\n                \"ip\": \"192.168.0.66\", \n                \"mac\": \"84:4b:f5:8a:a8:8f\", \n                \"port\": 8000\n            }\n        }\n\n- Add tag to device (admin permission)\n\n        POST /api/devices/:device/tag/:tag?access_token=:access_token\n\n    Examples:\n\n        $ http POST http://localhost:9000/api/devices/00:26:b9:e7:a2:3b-014E05DE0F02000E/tag/system:role:guest access_token==28d214c0-535c-11e3-bcde-ad2acffbc212 \n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 2\n        Content-Type: text/plain\n        Date: Fri, 22 Nov 2013 10:02:41 GMT\n        X-Powered-By: Express\n\n        OK\n\n- Remove tag from device (admin permission)\n\n        POST /api/devices/:device/untag/:tag?access_token=:access_token\n\n    Examples:\n\n        $ http POST http://localhost:9000/api/devices/00:26:b9:e7:a2:3b-CLV6ECA4D58/untag/system:role:guest access_token==162ac900-4cd3-11e3-ba42-1fb848ccf3b3\n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 2\n        Content-Type: text/plain\n        Date: Thu, 14 Nov 2013 03:01:56 GMT\n        X-Powered-By: Express\n\n        OK\n\n- Take screenshot of specified device (admin permission)\n\n        GET /api/devices/:device/screenshot?access_token=:access_token[\u0026width=:width\u0026height=:height]\n\n    Note:\n\n    - It returns a PNG image of the screenshot of the device.\n    - It's equal to:\n\n        GET /api/workstations/:workstations/api/0/devices/:serial/screenshot?access_token=:access_token\u0026width=:width\u0026height=:height\n\n## Jobs\n\n- List (admin permission)\n\n        GET /api/jobs?access_token=:access_token\n\n    **Note**: Only returns not finished jobs.\n\n    Examples:\n\n        $ http http://localhost:9000/api/jobs access_token==675ed270-54b8-11e3-934a-7722a3f49493\n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 4522\n        Content-Type: application/json; charset=utf-8\n        Date: Wed, 27 Nov 2013 03:32:53 GMT\n        ETag: \"-1280373730\"\n        X-Powered-By: Express\n\n        [\n            {\n                \"created_at\": \"2013-11-26T09:12:58.000Z\", \n                \"device_filter\": {\n                    \"tags\": [\n                        \"system:role:user\", \n                        \"system:job:acceptable\"\n                    ]\n                }, \n                \"device_id\": null, \n                \"environ\": {}, \n                \"exit_code\": null, \n                \"id\": 5, \n                \"modified_at\": \"2013-11-27T03:14:27.000Z\", \n                \"no\": 0, \n                \"priority\": 1, \n                \"r_job_nos\": [], \n                \"r_type\": \"none\", \n                \"repo_branch\": null, \n                \"repo_passowrd\": null, \n                \"repo_url\": \"https://github.com/xiaocong/demo_test.git\", \n                \"repo_username\": null, \n                \"status\": \"new\", \n                \"task\": {\n                    \"created_at\": \"2013-11-26T09:12:58.000Z\", \n                    \"creator_id\": 2, \n                    \"description\": \"Task created by test@example.com at Tue Nov 26 2013 17:12:58 GMT+0800 (CST) with 5 job(s).\", \n                    \"id\": 2, \n                    \"modified_at\": \"2013-11-27T03:14:28.000Z\", \n                    \"name\": \"Task - Tue Nov 26 2013 17:12:58 GMT+0800 (CST)\", \n                    \"project_id\": 1\n                }, \n                \"task_id\": 2\n            }, \n            ...\n        ]\n\n- Get one (admin permission)\n\n        GET /api/jobs/:job?access_token=:access_token\n\n    Examples:\n\n        $ http http://localhost:9000/api/jobs/7 access_token==675ed270-54b8-11e3-934a-7722a3f49493\n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 836\n        Content-Type: application/json; charset=utf-8\n        Date: Wed, 27 Nov 2013 03:35:45 GMT\n        X-Powered-By: Express\n\n        {\n            \"created_at\": \"2013-11-26T09:12:58.000Z\", \n            \"device_filter\": {\n                \"tags\": [\n                    \"system:role:user\", \n                    \"system:job:acceptable\"\n                ]\n            }, \n            \"device_id\": null, \n            \"environ\": {}, \n            \"exit_code\": null, \n            \"id\": 7, \n            \"modified_at\": \"2013-11-27T03:14:27.000Z\", \n            \"no\": 2, \n            \"priority\": 1, \n            \"r_job_nos\": [], \n            \"r_type\": \"none\", \n            \"repo_branch\": null, \n            \"repo_passowrd\": null, \n            \"repo_url\": \"https://github.com/xiaocong/demo_test.git\", \n            \"repo_username\": null, \n            \"status\": \"new\", \n            \"task\": {\n                \"created_at\": \"2013-11-26T09:12:58.000Z\", \n                \"creator_id\": 2, \n                \"description\": \"Task created by test@example.com at Tue Nov 26 2013 17:12:58 GMT+0800 (CST) with 5 job(s).\", \n                \"id\": 2, \n                \"modified_at\": \"2013-11-27T03:14:28.000Z\", \n                \"name\": \"Task - Tue Nov 26 2013 17:12:58 GMT+0800 (CST)\", \n                \"project_id\": 1\n            }, \n            \"task_id\": 2\n        }\n\n- Cancel job (admin permission)\n\n        POST /api/jobs/:job/cancel?access_token=:access_token\n\n    Examples:\n\n        $ http POST http://localhost:9000/api/jobs/7/cancel access_token==675ed270-54b8-11e3-934a-7722a3f49493\n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 842\n        Content-Type: application/json; charset=utf-8\n        Date: Wed, 27 Nov 2013 03:37:26 GMT\n        X-Powered-By: Express\n\n        {\n            \"created_at\": \"2013-11-26T09:12:58.000Z\", \n            \"device_filter\": {\n                \"tags\": [\n                    \"system:role:user\", \n                    \"system:job:acceptable\"\n                ]\n            }, \n            \"device_id\": null, \n            \"environ\": {}, \n            \"exit_code\": null, \n            \"id\": 7, \n            \"modified_at\": \"2013-11-27T03:37:26.788Z\", \n            \"no\": 2, \n            \"priority\": 1, \n            \"r_job_nos\": [], \n            \"r_type\": \"none\", \n            \"repo_branch\": null, \n            \"repo_passowrd\": null, \n            \"repo_url\": \"https://github.com/xiaocong/demo_test.git\", \n            \"repo_username\": null, \n            \"status\": \"cancelled\", \n            \"task\": {\n                \"created_at\": \"2013-11-26T09:12:58.000Z\", \n                \"creator_id\": 2, \n                \"description\": \"Task created by test@example.com at Tue Nov 26 2013 17:12:58 GMT+0800 (CST) with 5 job(s).\", \n                \"id\": 2, \n                \"modified_at\": \"2013-11-27T03:37:26.738Z\", \n                \"name\": \"Task - Tue Nov 26 2013 17:12:58 GMT+0800 (CST)\", \n                \"project_id\": 1\n            }, \n            \"task_id\": 2\n        }\n\n## Account\n\n- Get account information\n\n        GET /api/account?access_token=:access_token\n\n    Examples:\n\n        $ http http://localhost:9000/api/account access_token==03227250-54c0-11e3-ba49-7903e87f27a9\n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 208\n        Content-Type: application/json; charset=utf-8\n        Date: Sun, 24 Nov 2013 04:23:20 GMT\n        X-Powered-By: Express\n\n        {\n            \"created_at\": \"2013-11-24T03:58:05.000Z\", \n            \"email\": \"test@example.com\", \n            \"id\": 2, \n            \"modified_at\": \"2013-11-24T04:05:34.000Z\", \n            \"name\": \"John\", \n            \"priority\": 1, \n            \"tags\": [\n                \"system:role:user\"\n            ]\n        }\n\n- Update account information\n\n        POST /api/account?access_token=:access_token\n\n        {\"name\": \"Tom\", \"password\": \"test\"}\n\n    Examples:\n\n        $ http POST http://localhost:9000/api/account access_token==03227250-54c0-11e3-ba49-7903e87f27a9 name=Tom password=test\n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 207\n        Content-Type: application/json; charset=utf-8\n        Date: Sun, 24 Nov 2013 04:26:36 GMT\n        X-Powered-By: Express\n\n        {\n            \"created_at\": \"2013-11-24T03:58:05.000Z\", \n            \"email\": \"test@example.com\", \n            \"id\": 2, \n            \"modified_at\": \"2013-11-24T04:26:36.377Z\", \n            \"name\": \"Tom\", \n            \"priority\": 1, \n            \"tags\": [\n                \"system:role:user\"\n            ]\n        }\n\n## Project\n\n- Create new project\n\n        POST /api/projects?access_token=:access_token\n\n        {\"name\": \"project name\"}\n\n    Examples:\n\n        $ http POST http://localhost:9000/api/projects access_token=03227250-54c0-11e3-ba49-7903e87f27a9\n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 210\n        Content-Type: application/json; charset=utf-8\n        Date: Sun, 24 Nov 2013 06:39:58 GMT\n        X-Powered-By: Express\n\n        {\n            \"created_at\": \"2013-11-24T06:39:57.770Z\", \n            \"creator_id\": 2, \n            \"id\": 1, \n            \"modified_at\": \"2013-11-24T06:39:57.770Z\", \n            \"name\": \"Project created at Sun Nov 24 2013 14:39:57 GMT+0800 (CST)\", \n            \"priority\": 1\n        }\n\n- List all projects that you have permission to access\n\n        GET /api/projects?access_token=:access_token\n\n    Examples:\n\n        $ http http://localhost:9000/api/projects access_token==b0c86590-54d4-11e3-b654-b932b6c09042 \n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 1048\n        Content-Type: application/json; charset=utf-8\n        Date: Sun, 24 Nov 2013 06:53:58 GMT\n        ETag: \"1017038705\"\n        X-Powered-By: Express\n\n        [\n            {\n                \"created_at\": \"2013-11-24T06:50:54.000Z\", \n                \"creator\": {\n                    \"created_at\": \"2013-11-24T06:50:07.000Z\", \n                    \"email\": \"a@example.com\", \n                    \"id\": 3, \n                    \"modified_at\": \"2013-11-24T06:50:54.000Z\", \n                    \"name\": \"\", \n                    \"priority\": 1, \n                    \"tags\": [\n                        \"system:role:guest\"\n                    ]\n                }, \n                \"creator_id\": 3, \n                \"extra\": {\n                    \"owner\": true\n                }, \n                \"id\": 4, \n                \"modified_at\": \"2013-11-24T06:50:54.000Z\", \n                \"name\": \"test proj by a@example.com\", \n                \"owner\": true, \n                \"priority\": 1, \n                \"tags\": [\n                    {\n                        \"id\": 3, \n                        \"tag\": \"system:role:guest\"\n                    }, \n                    {\n                        \"id\": 5, \n                        \"tag\": \"system:job:acceptable\"\n                    }\n                ], \n                \"users\": [\n                    {\n                        \"created_at\": \"2013-11-24T06:50:07.000Z\", \n                        \"email\": \"a@example.com\", \n                        \"extra\": {\n                            \"owner\": true\n                        }, \n                        \"id\": 3, \n                        \"modified_at\": \"2013-11-24T06:50:54.000Z\", \n                        \"name\": \"\", \n                        \"owner\": true, \n                        \"priority\": 1, \n                        \"tags\": [\n                            \"system:role:guest\"\n                        ]\n                    }\n                ]\n            }\n        ]\n\n- Get one project\n\n        GET /api/projects/:project?access_token=:access_token\n\n    Examples:\n\n        $ http http://localhost:9000/api/projects/4 access_token==b0c86590-54d4-11e3-b654-b932b6c09042 \n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 944\n        Content-Type: application/json; charset=utf-8\n        Date: Sun, 24 Nov 2013 06:55:53 GMT\n        X-Powered-By: Express\n\n        {\n            \"created_at\": \"2013-11-24T06:50:54.000Z\", \n            \"creator\": {\n                \"created_at\": \"2013-11-24T06:50:07.000Z\", \n                \"email\": \"a@example.com\", \n                \"id\": 3, \n                \"modified_at\": \"2013-11-24T06:50:54.000Z\", \n                \"name\": \"\", \n                \"priority\": 1, \n                \"tags\": [\n                    \"system:role:guest\"\n                ]\n            }, \n            \"creator_id\": 3, \n            \"extra\": {\n                \"owner\": true\n            }, \n            \"id\": 4, \n            \"modified_at\": \"2013-11-24T06:50:54.000Z\", \n            \"name\": \"test proj by a@example.com\", \n            \"owner\": true, \n            \"priority\": 1, \n            \"tags\": [\n                {\n                    \"id\": 3, \n                    \"tag\": \"system:role:guest\"\n                }, \n                {\n                    \"id\": 5, \n                    \"tag\": \"system:job:acceptable\"\n                }\n            ], \n            \"users\": [\n                {\n                    \"created_at\": \"2013-11-24T06:50:07.000Z\", \n                    \"email\": \"a@example.com\", \n                    \"extra\": {\n                        \"owner\": true\n                    }, \n                    \"id\": 3, \n                    \"modified_at\": \"2013-11-24T06:50:54.000Z\", \n                    \"name\": \"\", \n                    \"owner\": true, \n                    \"priority\": 1, \n                    \"tags\": [\n                        \"system:role:guest\"\n                    ]\n                }\n            ]\n        }\n\n- Add user to project (only creator has the permission)\n\n        POST /api/projects/:project/add_user?access_token=:access_token\n\n        {\"email\": \"xxxx@test.com\"}\n\n    Examples:\n\n        $ http POST http://localhost:9000/api/projects/1/add_user access_token==f4c06700-533c-11e3-8508-a36192feacb2 email=a@test.com\n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 2\n        Content-Type: text/plain\n        Date: Fri, 22 Nov 2013 09:53:55 GMT\n        X-Powered-By: Express\n\n        OK\n\n- Remove user from project (only creator has the permission)\n\n        POST /api/projects/:project/remove_user?access_token=:access_token\n\n        {\"email\": \"xxxx@test.com\"}\n\n    Examples:\n\n        $ http POST http://localhost:9000/api/projects/1/remove_user access_token==f4c06700-533c-11e3-8508-a36192feacb2 email=a@test.com\n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 2\n        Content-Type: text/plain\n        Date: Sat, 23 Nov 2013 06:08:56 GMT\n        X-Powered-By: Express\n\n        OK\n\n- List devices the project has access permission\n\n        GET /api/projects/:project/devices?access_token=:access_token\n\n    Examples:\n\n        $ http http://localhost:9000/api/projects/4/devices access_token==03227250-54c0-11e3-ba49-7903e87f27a9\n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 921\n        Content-Type: application/json; charset=utf-8\n        Date: Sun, 24 Nov 2013 13:07:36 GMT\n        X-Powered-By: Express\n\n        [\n            {\n                \"build\": {\n                    \"date_utc\": \"1376434434\", \n                    \"display_id\": \"JWR66Y\", \n                    \"fingerprint\": \"google/takju/maguro:4.3/JWR66Y/776638:user/release-keys\", \n                    \"id\": \"JWR66Y\", \n                    \"type\": \"user\", \n                    \"version\": {\n                        \"codename\": \"REL\", \n                        \"incremental\": \"776638\", \n                        \"release\": \"4.3\", \n                        \"sdk\": \"18\"\n                    }\n                }, \n                \"id\": \"84:4b:f5:8a:a8:8f-014E05DE0F02000E\", \n                \"idle\": true, \n                \"locale\": {\n                    \"language\": \"en\", \n                    \"region\": \"US\"\n                }, \n                \"platform\": \"android\", \n                \"product\": {\n                    \"board\": \"tuna\", \n                    \"brand\": \"google\", \n                    \"device\": \"maguro\", \n                    \"manufacturer\": \"samsung\", \n                    \"model\": \"Galaxy Nexus\"\n                }, \n                \"serial\": \"014E05DE0F02000E\", \n                \"tags\": [\n                    \"system:role:admin\", \n                    \"system:role:guest\", \n                    \"system:job:acceptable\"\n                ], \n                \"workstation\": {\n                    \"ip\": \"192.168.0.66\", \n                    \"mac\": \"84:4b:f5:8a:a8:8f\", \n                    \"port\": 8000\n                }\n            }\n        ]\n\n## Repos\n\n- Get available repositories list\n\n        GET /api/repos\n\n    Examples:\n\n        $ http http://localhost:9000/api/repos\n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 17314\n        Content-Type: application/json; charset=utf-8\n        Date: Tue, 18 Mar 2014 09:10:27 GMT\n        ETag: \"-1370966815\"\n        Set-Cookie: connect.sess=s%3Aj%3A%7B%22passport%22%3A%7B%7D%7D.uDnQVi2orSN6V9TG3bFicsfJ7L2cyqxNxsiAqplvrrQ; Path=/; HttpOnly\n        X-Powered-By: Express\n\n        [\n            {\n                \"archive_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/{archive_format}{/ref}\",\n                \"assignees_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/assignees{/user}\",\n                \"blobs_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/git/blobs{/sha}\",\n                \"branches_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/branches{/branch}\",\n                \"clone_url\": \"https://github.com/xiaocong/opentest.task-demo-test.git\",\n                \"collaborators_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/collaborators{/collaborator}\",\n                \"comments_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/comments{/number}\",\n                \"commits_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/commits{/sha}\",\n                \"compare_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/compare/{base}...{head}\",\n                \"contents_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/contents/{+path}\",\n                \"contributors_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/contributors\",\n                \"created_at\": \"2013-10-22T04:08:59Z\",\n                \"default_branch\": \"master\",\n                \"description\": \"\",\n                \"downloads_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/downloads\",\n                \"events_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/events\",\n                \"fork\": false,\n                \"forks\": 0,\n                \"forks_count\": 0,\n                \"forks_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/forks\",\n                \"full_name\": \"xiaocong/opentest.task-demo-test\",\n                \"git_commits_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/git/commits{/sha}\",\n                \"git_refs_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/git/refs{/sha}\",\n                \"git_tags_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/git/tags{/sha}\",\n                \"git_url\": \"git://github.com/xiaocong/opentest.task-demo-test.git\",\n                \"has_downloads\": true,\n                \"has_issues\": true,\n                \"has_wiki\": true,\n                \"homepage\": null,\n                \"hooks_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/hooks\",\n                \"html_url\": \"https://github.com/xiaocong/opentest.task-demo-test\",\n                \"id\": 13762768,\n                \"issue_comment_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/issues/comments/{number}\",\n                \"issue_events_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/issues/events{/number}\",\n                \"issues_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/issues{/number}\",\n                \"keys_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/keys{/key_id}\",\n                \"labels_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/labels{/name}\",\n                \"language\": \"Python\",\n                \"languages_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/languages\",\n                \"master_branch\": \"master\",\n                \"merges_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/merges\",\n                \"milestones_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/milestones{/number}\",\n                \"mirror_url\": null,\n                \"name\": \"opentest.task-demo-test\",\n                \"notifications_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/notifications{?since,all,participating}\",\n                \"open_issues\": 0,\n                \"open_issues_count\": 0,\n                \"owner\":\n                    \"avatar_url\": \"https://avatars.githubusercontent.com/u/1559756\",\n                    \"events_url\": \"https://api.github.com/users/xiaocong/events{/privacy}\",\n                    \"followers_url\": \"https://api.github.com/users/xiaocong/followers\",\n                    \"following_url\": \"https://api.github.com/users/xiaocong/following{/other_user}\",\n                    \"gists_url\": \"https://api.github.com/users/xiaocong/gists{/gist_id}\",\n                    \"gravatar_id\": \"5c95e08c562a7162e678ef88fbcb9201\",\n                    \"html_url\": \"https://github.com/xiaocong\",\n                    \"id\": 1559756,\n                    \"login\": \"xiaocong\",\n                    \"organizations_url\": \"https://api.github.com/users/xiaocong/orgs\",\n                    \"received_events_url\": \"https://api.github.com/users/xiaocong/received_events\",\n                    \"repos_url\": \"https://api.github.com/users/xiaocong/repos\",\n                    \"site_admin\": false,\n                    \"starred_url\": \"https://api.github.com/users/xiaocong/starred{/owner}{/repo}\",\n                    \"subscriptions_url\": \"https://api.github.com/users/xiaocong/subscriptions\",\n                    \"type\": \"User\",\n                    \"url\": \"https://api.github.com/users/xiaocong\n                },\n                \"private\": false,\n                \"pulls_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/pulls{/number}\",\n                \"pushed_at\": \"2014-02-20T03:06:21Z\",\n                \"releases_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/releases{/id}\",\n                \"score\": 12.465622,\n                \"size\": 216,\n                \"ssh_url\": \"git@github.com:xiaocong/opentest.task-demo-test.git\",\n                \"stargazers_count\": 0,\n                \"stargazers_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/stargazers\",\n                \"statuses_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/statuses/{sha}\",\n                \"subscribers_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/subscribers\",\n                \"subscription_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/subscription\",\n                \"svn_url\": \"https://github.com/xiaocong/opentest.task-demo-test\",\n                \"tags_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/tags\",\n                \"teams_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/teams\",\n                \"trees_url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test/git/trees{/sha}\",\n                \"updated_at\": \"2014-03-03T13:15:07Z\",\n                \"url\": \"https://api.github.com/repos/xiaocong/opentest.task-demo-test\",\n                \"watchers\": 0,\n                \"watchers_count\": 0\n            },\n            ...\n        ]\n\n- Get task repository's evnironment variables, which is required during task creation.\n\n        GET /api/repos/:user/:repo/env\n\n    Examples:\n\n        $ http localhost:9000/api/repos/xiaocong/opentest.task-demo-test/env\n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 333\n        Content-Type: application/json; charset=utf-8\n        Date: Tue, 18 Mar 2014 09:16:15 GMT\n        ETag: \"-1205959222\"\n        Set-Cookie: connect.sess=s%3Aj%3A%7B%22passport%22%3A%7B%7D%7D.uDnQVi2orSN6V9TG3bFicsfJ7L2cyqxNxsiAqplvrrQ; Path=/; HttpOnly\n        X-Powered-By: Express\n\n        {\n            \"exclusive\": {\n                \"exclusive\": true,\n                \"fix\": false,\n                \"options\": []\n            },\n            \"fix-field\": {\n                \"exclusive\": false,\n                \"fix\": true,\n                \"options\": [\n                    \"a\",\n                    \"b\",\n                    \"c\"\n                ]\n            },\n            \"list-field\": {\n                \"exclusive\": false,\n                \"fix\": false,\n                \"options\": [\n                    1,\n                    2,\n                    3,\n                    4,\n                    5\n                ]\n            }\n        }\n\n## Tasks\n\n- Add task\n\n        POST /api/tasks?access_token=:access_token\u0026project=:project\n\n        {\n            \"name\": \"task name\", \n            \"jobs\": [\n                {\n                    \"no\": 0,\n                    \"r_type\": \"exclusive\",\n                    \"r_job_nos\": [0, 1, 2],\n                    \"repo_url\": \"https://github.com/xiaocong/demo_test.git\",\n                    \"repo_branch\": \"master\",\n                    \"device_filter\": {\n                        \"mac\": \"00:26:b9:e7:a2:3b\",\n                        \"serial\": \"014E05DE0F02000E\",\n                        \"platform\": \"android\",\n                        \"product\": {\n                            \"board\": \"tuna\", \n                            \"brand\": \"google\", \n                            \"device\": \"maguro\", \n                            \"manufacturer\": \"samsung\", \n                            \"model\": \"Galaxy Nexus\"\n                        }, \n                        \"build\": {\n                            \"date_utc\": \"1376434434\", \n                            \"display_id\": \"JWR66Y\", \n                            \"fingerprint\": \"google/takju/maguro:4.3/JWR66Y/776638:user/release-keys\", \n                            \"id\": \"JWR66Y\", \n                            \"type\": \"user\", \n                            \"version\": {\n                                \"codename\": \"REL\", \n                                \"incremental\": \"776638\", \n                                \"release\": \"4.3\", \n                                \"sdk\": \"18\"\n                            }\n                        }, \n                        \"locale\": {\n                            \"language\": \"en\", \n                            \"region\": \"US\"\n                        }, \n                        \"tags\": [\n                            \"device\"\n                        ]\n                    }, \n                    \"environ\": {\n                        \"VARIABLE\": \"any thing passed to job via shell environment variables.\"\n                    }\n                },\n                ...\n            ], \n        }\n\n    Notes:\n    - `jobs[].repo_url` are mandatory.\n    - `name` is a human readable string for the task.\n    - 'jobs' is a job array of the task. One job will be created in case the parameter is not set.\n    - `jobs[].no` is internal job identifier in the task, it should be bwtween 0 and `jobs.length-1`, used in `r_job_nos`. If not assigned, it will be set as the index in the jobs array.\n    - `jobs[].r_type` can be one of `none`, `exclusive` and `dependency`.\n        - `none`, default value, means all jobs in the task are independent.\n        - `exclusive`, means the job should not be run when any one in `r_job_nos` is running.\n        - `dependency`, means the job should not be run if any one in `r_job_nos` is not finished.\n    - `jobs[].r_job_nos` is an array of `jobs[].no`.\n    - `jobs[].repo_url` is the repo url of the job. It's mandatory.\n    - `jobs[].device_filter` is the filter condition for the job. When its all fields have the same value as a device, it means the device can run the job.\n    - `jobs[].device_filter.tags` contains all required tags. Matched device must has all tags in it.\n    - `jobs[].environ` contains all variables that will be passed to job shell environment.\n    - `environ`, `device_filter`, `repo_url`, `repo_branch` can be set once at the same level of `jobs`, if you want not to set it at every job.\n\n    Examples:\n\n        $ http POST http://localhost:9000/api/tasks project=1 access_token=f4c06700-533c-11e3-8508-a36192feacb2 repo_url=https://github.com/xiaocong/demo_test.git jobs:='[{},{},{}]'\n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 2115\n        Content-Type: application/json; charset=utf-8\n        Date: Sat, 23 Nov 2013 07:04:23 GMT\n        X-Powered-By: Express\n\n        {\n            \"created_at\": \"2013-11-23T07:04:23.569Z\", \n            \"creator_id\": 2, \n            \"description\": \"Task created by test@example.com at Sat Nov 23 2013 15:04:23 GMT+0800 (CST) with 3 job(s).\", \n            \"id\": 1, \n            \"jobs\": [\n                {\n                    \"created_at\": \"2013-11-23T07:04:23.690Z\", \n                    \"device_filter\": {\n                        \"tags\": [\n                            \"system:role:guest\", \n                            \"system:job:acceptable\"\n                        ]\n                    }, \n                    \"device_id\": null, \n                    \"environ\": {}, \n                    \"exit_code\": null, \n                    \"id\": 1, \n                    \"modified_at\": \"2013-11-23T07:04:23.690Z\", \n                    \"no\": 0, \n                    \"priority\": 1, \n                    \"r_job_nos\": [], \n                    \"r_type\": \"none\", \n                    \"repo_branch\": null, \n                    \"repo_passowrd\": null, \n                    \"repo_url\": \"https://github.com/xiaocong/demo_test.git\", \n                    \"repo_username\": null, \n                    \"status\": \"new\", \n                    \"task_id\": 1\n                }, \n                {\n                    \"created_at\": \"2013-11-23T07:04:23.754Z\", \n                    \"device_filter\": {\n                        \"tags\": [\n                            \"system:role:guest\", \n                            \"system:job:acceptable\"\n                        ]\n                    }, \n                    \"device_id\": null, \n                    \"environ\": {}, \n                    \"exit_code\": null, \n                    \"id\": 2, \n                    \"modified_at\": \"2013-11-23T07:04:23.754Z\", \n                    \"no\": 1, \n                    \"priority\": 1, \n                    \"r_job_nos\": [], \n                    \"r_type\": \"none\", \n                    \"repo_branch\": null, \n                    \"repo_passowrd\": null, \n                    \"repo_url\": \"https://github.com/xiaocong/demo_test.git\", \n                    \"repo_username\": null, \n                    \"status\": \"new\", \n                    \"task_id\": 1\n                }, \n                {\n                    \"created_at\": \"2013-11-23T07:04:23.830Z\", \n                    \"device_filter\": {\n                        \"tags\": [\n                            \"system:role:guest\", \n                            \"system:job:acceptable\"\n                        ]\n                    }, \n                    \"device_id\": null, \n                    \"environ\": {}, \n                    \"exit_code\": null, \n                    \"id\": 3, \n                    \"modified_at\": \"2013-11-23T07:04:23.830Z\", \n                    \"no\": 2, \n                    \"priority\": 1, \n                    \"r_job_nos\": [], \n                    \"r_type\": \"none\", \n                    \"repo_branch\": null, \n                    \"repo_passowrd\": null, \n                    \"repo_url\": \"https://github.com/xiaocong/demo_test.git\", \n                    \"repo_username\": null, \n                    \"status\": \"new\", \n                    \"task_id\": 1\n                }\n            ], \n            \"modified_at\": \"2013-11-23T07:04:23.569Z\", \n            \"name\": \"Task - Sat Nov 23 2013 15:04:23 GMT+0800 (CST)\", \n            \"project_id\": 1\n        }\n\n- Get a list of tasks\n\n        GET /api/tasks?access_token=:access_token[\u0026project=:project][\u0026status=:status][\u0026page=:page][\u0026page_count=:page_count]\n\n    Note:\n\n    - Returns tasks in projects that the user has permission to access.\n    - If project is specified, only tasks in the project will return.\n    - `status` parameter can be `all`, `finished` or `living`, default is `all`\n\n    Examples:\n\n        $ http http://localhost:9000/api/tasks access_token==f4c06700-533c-11e3-8508-a36192feacb2 project==1\n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 4461\n        Content-Type: application/json; charset=utf-8\n        Date: Sat, 23 Nov 2013 07:26:14 GMT\n        ETag: \"240551036\"\n        X-Powered-By: Express\n\n        {\n            \"page\": 0, \n            \"page_count\": 16, \n            \"pages\": 1, \n            \"status\": \"all\", \n            \"tasks\": [\n                {\n                    \"created_at\": \"2013-11-23T07:05:53.000Z\", \n                    \"creator\": {\n                        \"created_at\": \"2013-11-22T06:07:42.000Z\", \n                        \"email\": \"test@example.com\", \n                        \"id\": 2, \n                        \"modified_at\": \"2013-11-23T06:11:29.000Z\", \n                        \"name\": \"\"\n                    }, \n                    \"creator_id\": 2, \n                    \"description\": \"Task created by test@example.com at Sat Nov 23 2013 15:05:53 GMT+0800 (CST) with 1 job(s).\", \n                    \"id\": 2, \n                    \"jobs\": [\n                        {\n                            \"created_at\": \"2013-11-23T07:05:53.000Z\", \n                            \"device_filter\": {\n                                \"tags\": [\n                                    \"system:role:guest\", \n                                    \"system:job:acceptable\"\n                                ]\n                            }, \n                            \"device_id\": 2, \n                            \"environ\": {}, \n                            \"exit_code\": 0, \n                            \"id\": 4, \n                            \"modified_at\": \"2013-11-23T07:21:35.000Z\", \n                            \"no\": 0, \n                            \"priority\": 1, \n                            \"r_job_nos\": [], \n                            \"r_type\": \"none\", \n                            \"repo_branch\": null, \n                            \"repo_passowrd\": null, \n                            \"repo_url\": \"https://github.com/xiaocong/demo_test.git\", \n                            \"repo_username\": null, \n                            \"status\": \"finished\", \n                            \"task_id\": 2\n                        }\n                    ], \n                    \"modified_at\": \"2013-11-23T07:21:35.000Z\", \n                    \"name\": \"Task - Sat Nov 23 2013 15:05:53 GMT+0800 (CST)\", \n                    \"project\": {\n                        \"created_at\": \"2013-11-22T06:12:26.000Z\", \n                        \"creator_id\": 2, \n                        \"id\": 1, \n                        \"modified_at\": \"2013-11-22T06:12:26.000Z\", \n                        \"name\": \"my demo project\", \n                        \"priority\": 1\n                    }, \n                    \"project_id\": 1\n                }, \n                {\n                    \"created_at\": \"2013-11-23T07:04:23.000Z\", \n                    \"creator\": {\n                        \"created_at\": \"2013-11-22T06:07:42.000Z\", \n                        \"email\": \"test@example.com\", \n                        \"id\": 2, \n                        \"modified_at\": \"2013-11-23T06:11:29.000Z\", \n                        \"name\": \"\"\n                    }, \n                    \"creator_id\": 2, \n                    \"description\": \"Task created by test@example.com at Sat Nov 23 2013 15:04:23 GMT+0800 (CST) with 3 job(s).\", \n                    \"id\": 1, \n                    \"jobs\": [\n                        {\n                            \"created_at\": \"2013-11-23T07:04:23.000Z\", \n                            \"device_filter\": {\n                                \"tags\": [\n                                    \"system:role:guest\", \n                                    \"system:job:acceptable\"\n                                ]\n                            }, \n                            \"device_id\": 2, \n                            \"environ\": {}, \n                            \"exit_code\": 0, \n                            \"id\": 1, \n                            \"modified_at\": \"2013-11-23T07:15:30.000Z\", \n                            \"no\": 0, \n                            \"priority\": 1, \n                            \"r_job_nos\": [], \n                            \"r_type\": \"none\", \n                            \"repo_branch\": null, \n                            \"repo_passowrd\": null, \n                            \"repo_url\": \"https://github.com/xiaocong/demo_test.git\", \n                            \"repo_username\": null, \n                            \"status\": \"finished\", \n                            \"task_id\": 1\n                        }, \n                        {\n                            \"created_at\": \"2013-11-23T07:04:23.000Z\", \n                            \"device_filter\": {\n                                \"tags\": [\n                                    \"system:role:guest\", \n                                    \"system:job:acceptable\"\n                                ]\n                            }, \n                            \"device_id\": 2, \n                            \"environ\": {}, \n                            \"exit_code\": 0, \n                            \"id\": 2, \n                            \"modified_at\": \"2013-11-23T07:18:02.000Z\", \n                            \"no\": 1, \n                            \"priority\": 1, \n                            \"r_job_nos\": [], \n                            \"r_type\": \"none\", \n                            \"repo_branch\": null, \n                            \"repo_passowrd\": null, \n                            \"repo_url\": \"https://github.com/xiaocong/demo_test.git\", \n                            \"repo_username\": null, \n                            \"status\": \"finished\", \n                            \"task_id\": 1\n                        }, \n                        {\n                            \"created_at\": \"2013-11-23T07:04:23.000Z\", \n                            \"device_filter\": {\n                                \"tags\": [\n                                    \"system:role:guest\", \n                                    \"system:job:acceptable\"\n                                ]\n                            }, \n                            \"device_id\": 2, \n                            \"environ\": {}, \n                            \"exit_code\": 0, \n                            \"id\": 3, \n                            \"modified_at\": \"2013-11-23T07:20:04.000Z\", \n                            \"no\": 2, \n                            \"priority\": 1, \n                            \"r_job_nos\": [], \n                            \"r_type\": \"none\", \n                            \"repo_branch\": null, \n                            \"repo_passowrd\": null, \n                            \"repo_url\": \"https://github.com/xiaocong/demo_test.git\", \n                            \"repo_username\": null, \n                            \"status\": \"finished\", \n                            \"task_id\": 1\n                        }\n                    ], \n                    \"modified_at\": \"2013-11-23T07:20:04.000Z\", \n                    \"name\": \"Task - Sat Nov 23 2013 15:04:23 GMT+0800 (CST)\", \n                    \"project\": {\n                        \"created_at\": \"2013-11-22T06:12:26.000Z\", \n                        \"creator_id\": 2, \n                        \"id\": 1, \n                        \"modified_at\": \"2013-11-22T06:12:26.000Z\", \n                        \"name\": \"my demo project\", \n                        \"priority\": 1\n                    }, \n                    \"project_id\": 1\n                }\n            ]\n        }\n\n- Get a task\n\n        GET /api/tasks/:task?access_token=:access_token\n\n    Examples:\n\n        $ http http://localhost:9000/api/tasks/1 access_token==f4c06700-533c-11e3-8508-a36192feacb2\n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 2482\n        Content-Type: application/json; charset=utf-8\n        Date: Sat, 23 Nov 2013 07:28:15 GMT\n        ETag: \"-27096222\"\n        X-Powered-By: Express\n\n        {\n            \"created_at\": \"2013-11-23T07:04:23.000Z\", \n            \"creator\": {\n                \"created_at\": \"2013-11-22T06:07:42.000Z\", \n                \"email\": \"test@example.com\", \n                \"id\": 2, \n                \"modified_at\": \"2013-11-23T06:11:29.000Z\", \n                \"name\": \"\"\n            }, \n            \"creator_id\": 2, \n            \"description\": \"Task created by test@example.com at Sat Nov 23 2013 15:04:23 GMT+0800 (CST) with 3 job(s).\", \n            \"id\": 1, \n            \"jobs\": [\n                {\n                    \"created_at\": \"2013-11-23T07:04:23.000Z\", \n                    \"device_filter\": {\n                        \"tags\": [\n                            \"system:role:guest\", \n                            \"system:job:acceptable\"\n                        ]\n                    }, \n                    \"device_id\": 2, \n                    \"environ\": {}, \n                    \"exit_code\": 0, \n                    \"id\": 1, \n                    \"modified_at\": \"2013-11-23T07:15:30.000Z\", \n                    \"no\": 0, \n                    \"priority\": 1, \n                    \"r_job_nos\": [], \n                    \"r_type\": \"none\", \n                    \"repo_branch\": null, \n                    \"repo_passowrd\": null, \n                    \"repo_url\": \"https://github.com/xiaocong/demo_test.git\", \n                    \"repo_username\": null, \n                    \"status\": \"finished\", \n                    \"task_id\": 1\n                }, \n                {\n                    \"created_at\": \"2013-11-23T07:04:23.000Z\", \n                    \"device_filter\": {\n                        \"tags\": [\n                            \"system:role:guest\", \n                            \"system:job:acceptable\"\n                        ]\n                    }, \n                    \"device_id\": 2, \n                    \"environ\": {}, \n                    \"exit_code\": 0, \n                    \"id\": 2, \n                    \"modified_at\": \"2013-11-23T07:18:02.000Z\", \n                    \"no\": 1, \n                    \"priority\": 1, \n                    \"r_job_nos\": [], \n                    \"r_type\": \"none\", \n                    \"repo_branch\": null, \n                    \"repo_passowrd\": null, \n                    \"repo_url\": \"https://github.com/xiaocong/demo_test.git\", \n                    \"repo_username\": null, \n                    \"status\": \"finished\", \n                    \"task_id\": 1\n                }, \n                {\n                    \"created_at\": \"2013-11-23T07:04:23.000Z\", \n                    \"device_filter\": {\n                        \"tags\": [\n                            \"system:role:guest\", \n                            \"system:job:acceptable\"\n                        ]\n                    }, \n                    \"device_id\": 2, \n                    \"environ\": {}, \n                    \"exit_code\": 0, \n                    \"id\": 3, \n                    \"modified_at\": \"2013-11-23T07:20:04.000Z\", \n                    \"no\": 2, \n                    \"priority\": 1, \n                    \"r_job_nos\": [], \n                    \"r_type\": \"none\", \n                    \"repo_branch\": null, \n                    \"repo_passowrd\": null, \n                    \"repo_url\": \"https://github.com/xiaocong/demo_test.git\", \n                    \"repo_username\": null, \n                    \"status\": \"finished\", \n                    \"task_id\": 1\n                }\n            ], \n            \"modified_at\": \"2013-11-23T07:20:04.000Z\", \n            \"name\": \"Task - Sat Nov 23 2013 15:04:23 GMT+0800 (CST)\", \n            \"project\": {\n                \"created_at\": \"2013-11-22T06:12:26.000Z\", \n                \"creator_id\": 2, \n                \"id\": 1, \n                \"modified_at\": \"2013-11-22T06:12:26.000Z\", \n                \"name\": \"my demo project\", \n                \"priority\": 1\n            }, \n            \"project_id\": 1\n        }\n\n- Cancel task\n\n        POST /api/tasks/:task/cancel?access_token=:access_token\n\n    Examples:\n\n        $ http POST http://localhost:9000/api/tasks/1/cancel access_token==f4c06700-533c-11e3-8508-a36192feacb2\n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 2\n        Content-Type: text/plain\n        Date: Sat, 23 Nov 2013 07:33:47 GMT\n        X-Powered-By: Express\n\n        OK\n\n- Restart task\n\n        POST /api/tasks/:task/restart?access_token=:access_token\n\n    Examples:\n\n        $ http POST http://localhost:9000/api/tasks/1/restart access_token==f4c06700-533c-11e3-8508-a36192feacb2\n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 2\n        Content-Type: text/plain\n        Date: Sat, 23 Nov 2013 07:34:31 GMT\n        X-Powered-By: Express\n\n        OK\n\n- Add a job to task\n\n        POST /api/tasks/:task/jobs?access_token=:access_token\n\n        {...}\n\n    Note: See add task API for detailed parameters.\n\n    Examples:\n\n        $ POST http://localhost:9000/api/tasks/1/jobs access_token==f4c06700-533c-11e3-8508-a36192feacb2 repo_url=https://github.com/xiaocong/demo_test.git\n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 498\n        Content-Type: application/json; charset=utf-8\n        Date: Sat, 23 Nov 2013 07:41:07 GMT\n        X-Powered-By: Express\n\n        {\n            \"created_at\": \"2013-11-23T07:41:07.224Z\", \n            \"device_filter\": {\n                \"tags\": [\n                    \"system:role:guest\", \n                    \"system:job:acceptable\"\n                ]\n            }, \n            \"device_id\": null, \n            \"environ\": {}, \n            \"exit_code\": null, \n            \"id\": 5, \n            \"modified_at\": \"2013-11-23T07:41:07.224Z\", \n            \"no\": 3, \n            \"priority\": 1, \n            \"r_job_nos\": [], \n            \"r_type\": \"none\", \n            \"repo_branch\": null, \n            \"repo_passowrd\": null, \n            \"repo_url\": \"https://github.com/xiaocong/demo_test.git\", \n            \"repo_username\": null, \n            \"status\": \"new\", \n            \"task_id\": 1\n        }\n\n- Update a job\n\n        POST /api/tasks/:task/jobs/:no?access_token=:access_token\n\n        {...}\n\n    Note:\n\n    - See add task API for detailed parameters. \n    - Started job can not be updated.\n    - Job status can not be changed.\n    - Job No. starts from 0\n\n    Examples:\n\n        $ http POST http://localhost:9000/api/tasks/1/jobs/0 access_token==f4c06700-533c-11e3-8508-a36192feacb2 repo_url=https://github.com/xiaocong/demo_test.git environ:='{\"ENV\":\"will be set to job shell environments.\"}'\n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 552\n        Content-Type: application/json; charset=utf-8\n        Date: Sat, 23 Nov 2013 08:03:17 GMT\n        X-Powered-By: Express\n\n        {\n            \"created_at\": \"2013-11-23T07:04:23.000Z\", \n            \"device_filter\": {\n                \"tags\": [\n                    \"system:role:guest\", \n                    \"system:job:acceptable\"\n                ]\n            }, \n            \"device_id\": 2, \n            \"environ\": {\n                \"ENV\": \"will be set to job shell environments.\"\n            }, \n            \"exit_code\": 0, \n            \"id\": 1, \n            \"modified_at\": \"2013-11-23T08:03:17.470Z\", \n            \"no\": 0, \n            \"priority\": 1, \n            \"r_job_nos\": [], \n            \"r_type\": \"none\", \n            \"repo_branch\": null, \n            \"repo_passowrd\": null, \n            \"repo_url\": \"https://github.com/xiaocong/demo_test.git\", \n            \"repo_username\": null, \n            \"status\": \"finished\", \n            \"task_id\": 1\n        }\n\n- Cancel a job\n\n        POST /api/tasks/:task/jobs/:no/cancel?access_token=:access_token\n\n    Examples:\n\n        $ http POST http://localhost:9000/api/tasks/1/jobs/0/cancel access_token==f4c06700-533c-11e3-8508-a36192feacb2 \n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 553\n        Content-Type: application/json; charset=utf-8\n        Date: Sat, 23 Nov 2013 08:05:21 GMT\n        X-Powered-By: Express\n\n        {\n            \"created_at\": \"2013-11-23T07:04:23.000Z\", \n            \"device_filter\": {\n                \"tags\": [\n                    \"system:role:guest\", \n                    \"system:job:acceptable\"\n                ]\n            }, \n            \"device_id\": 2, \n            \"environ\": {\n                \"ENV\": \"will be set to job shell environments.\"\n            }, \n            \"exit_code\": 0, \n            \"id\": 1, \n            \"modified_at\": \"2013-11-23T08:05:21.398Z\", \n            \"no\": 0, \n            \"priority\": 1, \n            \"r_job_nos\": [], \n            \"r_type\": \"none\", \n            \"repo_branch\": null, \n            \"repo_passowrd\": null, \n            \"repo_url\": \"https://github.com/xiaocong/demo_test.git\", \n            \"repo_username\": null, \n            \"status\": \"cancelled\", \n            \"task_id\": 1\n        }\n\n- Restart a job\n\n        POST /api/tasks/:task/jobs/:no/restart?access_token=:access_token\n\n    Examples:\n\n        $ http POST http://localhost:9000/api/tasks/1/jobs/0/restart access_token==f4c06700-533c-11e3-8508-a36192feacb2 \n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 547\n        Content-Type: application/json; charset=utf-8\n        Date: Sat, 23 Nov 2013 08:05:15 GMT\n        X-Powered-By: Express\n\n        {\n            \"created_at\": \"2013-11-23T07:04:23.000Z\", \n            \"device_filter\": {\n                \"tags\": [\n                    \"system:role:guest\", \n                    \"system:job:acceptable\"\n                ]\n            }, \n            \"device_id\": 2, \n            \"environ\": {\n                \"ENV\": \"will be set to job shell environments.\"\n            }, \n            \"exit_code\": 0, \n            \"id\": 1, \n            \"modified_at\": \"2013-11-23T08:05:15.553Z\", \n            \"no\": 0, \n            \"priority\": 1, \n            \"r_job_nos\": [], \n            \"r_type\": \"none\", \n            \"repo_branch\": null, \n            \"repo_passowrd\": null, \n            \"repo_url\": \"https://github.com/xiaocong/demo_test.git\", \n            \"repo_username\": null, \n            \"status\": \"new\", \n            \"task_id\": 1\n        }\n\n- Get job stream output\n\n        GET /api/tasks/:task/jobs/:no/stream?access_token=:access_token\n\n    Note: It will return http chunked console output of the jobs.\n\n    Examples:\n\n        $ http http://localhost:9000/api/tasks/1/jobs/0/stream access_token==f4c06700-533c-11e3-8508-a36192feacb2 lines==1000\n        HTTP/1.1 200 OK\n        X-Powered-By: Express\n        connection: keep-alive\n        content-type: text/html; charset=UTF-8\n        date: Sat, 23 Nov 2013 08:24:07 GMT\n        server: gunicorn/18.0\n        transfer-encoding: chunked\n\n        Cloning into '/home/pi/jobs/1/repo'...\n        Running virtualenv with interpreter /usr/bin/python2.7\n        New python executable in .venv/bin/python2.7\n        Also creating executable in .venv/bin/python\n        Installing setuptools............done.\n        Installing pip...............done.\n        Downloading/unpacking uiautomator\n          Downloading uiautomator-0.1.16.tar.gz\n          Running setup.py egg_info for package uiautomator\n            warning: no previously-included files matching '*.pyc' found anywhere in distribution\n\n- Get job's files\n\n        GET /api/tasks/:task/jobs/:no/files/:file_path?access_token=:access_token\n\n    Note:\n\n    - If the file_path is a directory, it will return an array of files under the directory.\n    - If the file_path is a file, it will return the content the file.\n\n    Examples:\n\n        $ http http://localhost:9000/api/tasks/1/jobs/0/stream access_token==f4c06700-533c-11e3-8508-a36192feacb2 lines==1000\n        HTTP/1.1 200 OK\n        X-Powered-By: Express\n        connection: keep-alive\n        content-type: text/html; charset=UTF-8\n        date: Sat, 23 Nov 2013 08:24:07 GMT\n        server: gunicorn/18.0\n        transfer-encoding: chunked\n\n        Cloning into '/home/pi/jobs/1/repo'...\n        Running virtualenv with interpreter /usr/bin/python2.7\n        New python executable in .venv/bin/python2.7\n        Also creating executable in .venv/bin/python\n        Installing setuptools............done.\n        Installing pip...............done.\n        Downloading/unpacking uiautomator\n          Downloading uiautomator-0.1.16.tar.gz\n          Running setup.py egg_info for package uiautomator\n            warning: no previously-included files matching '*.pyc' found anywhere in distribution       \n\n- Take screenshot of a device on which the job is running\n\n        GET /api/tasks/:task/jobs/:no/screenshot?access_token=:access_token[\u0026width=:width\u0026height=:height]\n\n    Notes:\n\n    - It's same as device screenshoot API, but this API doesn't need admin permission.\n    - It can only work on running job. For not running job, it returns 403 Forbidden.\n\n- Get test results of a job in case it has.\n\n        GET /api/tasks/:task/jobs/:no/result?access_token=:access_token\n\n    Notes\n\n    - It parses the content in file `$JOB_ID/$WORKSPACE/result.txt`. If the file doesn't exist, it returns an error.\n    - You can pass query parameter `r` e.g. `r=fail,error` to filter the specified results.\n    - You can pass query parameters `page` and `page_count` to only return the result of the specified page.\n\n    Examples:\n\n        $ http http://localhost:9000/api/tasks/4/jobs/0/result access_token==1177c620-694c-11e3-877d-013bcec48b5e\n        HTTP/1.1 200 OK\n        Connection: keep-alive\n        Content-Length: 1260\n        Content-Type: application/json; charset=utf-8\n        Date: Mon, 06 Jan 2014 05:33:30 GMT\n        ETag: \"-1664147239\"\n        Set-Cookie: connect.sess=s%3Aj%3A%7B%22passport%22%3A%7B%7D%7D.uDnQVi2orSN6V9TG3bFicsfJ7L2cyqxNxsiAqplvrrQ; Path=/; HttpOnly\n        X-Powered-By: Express\n\n        {\n            \"end_at\": \"2013-01-08T07:06:37.000Z\", \n            \"error\": 1, \n            \"fail\": 1, \n            \"pass\": 1, \n            \"results\": [\n                {\n                    \"end_at\": \"2013-01-08T06:05:36.000Z\", \n                    \"name\": \"class.method\", \n                    \"result\": \"pass\", \n                    \"start_at\": \"2013-01-08T06:05:36.000Z\"\n                }, \n                {\n                    \"end_at\": \"2013-01-08T07:06:37.000Z\", \n                    \"expect\": \"/api/tasks/4/jobs/0/files/workspace/path_to_expect/expect.png\", \n                    \"log\": \"/api/tasks/4/jobs/0/files/workspace/path_to_whenfailure/log.zip\", \n                    \"name\": \"class.method\", \n                    \"result\": \"fail\", \n                    \"screenshot_at_failure\": \"/api/tasks/4/jobs/0/files/workspace/path_to_whenfailure/failure.png\", \n                    \"start_at\": \"2013-01-08T06:05:36.000Z\", \n                    \"trace\": \"traceinfo\"\n                }, \n                {\n                    \"end_at\": \"2013-01-08T07:06:37.000Z\", \n                    \"expect\": \"/api/tasks/4/jobs/0/files/workspace/path_to_expect/expect.png\", \n                    \"log\": \"/api/tasks/4/jobs/0/files/workspace/path_to_log/log.zip\", \n                    \"name\": \"class.method\", \n                    \"result\": \"error\", \n                    \"screenshot_at_failure\": \"/api/tasks/4/jobs/0/files/workspace/path_to_error/failure.png\", \n                    \"start_at\": \"2013-01-08T06:05:36.000Z\", \n                    \"trace\": \"traceinfo\"\n                }\n            ], \n            \"start_at\": \"2013-01-08T06:05:36.000Z\", \n            \"total\": 3\n        }\n\n[httpie]: https://github.com/jkbr/httpie\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxiaocong%2Fremote-task-web-app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxiaocong%2Fremote-task-web-app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxiaocong%2Fremote-task-web-app/lists"}