{"action":"created","comment":{"url":"https://api.github.com/repos/scalableminds/webknossos/pulls/comments/200408771","pull_request_review_id":134719778,"id":200408771,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwMDQwODc3MQ==","diff_hunk":"@@ -0,0 +1,124 @@\n+/* eslint import/no-extraneous-dependencies: [\"error\", {\"peerDependencies\": true}] */\n+const test = require(\"ava\");\n+const puppeteer = require(\"puppeteer\");\n+const pixelmatch = require(\"pixelmatch\");\n+const { PNG } = require(\"pngjs\");\n+const fs = require(\"fs\");\n+const path = require(\"path\");\n+const { screenshotDataset, DEV_AUTH_TOKEN } = require(\"./dataset_rendering_helpers\");\n+\n+process.on(\"unhandledRejection\", (err, promise) => {\n+  console.error(\"Unhandled rejection (promise: \", promise, \", reason: \", err, \").\");\n+});\n+\n+const BASE_PATH = path.join(__dirname, \"../screenshots\");\n+\n+let BRANCH = \"master\";\n+if (!process.env.BRANCH) {\n+  console.warn(\n+    \"[Warning] No branch specified, assuming branch master. If you want to specify a branch, prepend BRANCH=<branchname> to the command.\",\n+  );\n+} else {\n+  BRANCH = process.env.BRANCH;\n+  console.log(`[Info] Executing tests on branch ${BRANCH}.`);\n+}\n+\n+function compareScreenshot(screenshotBuffer, name, width, height) {\n+  return new Promise(resolve => {\n+    let readFiles = 0;\n+    const existingScreenshot = fs\n+      .createReadStream(`${BASE_PATH}/${name}.png`)\n+      // If there is no existing screenshot, save the current one\n+      .on(\"error\", saveScreenshot)\n+      .pipe(new PNG())\n+      .on(\"parsed\", doneReading);\n+\n+    const newScreenshot = new PNG({ width, height });\n+    newScreenshot.parse(screenshotBuffer, doneReading);\n+\n+    function doneReading() {\n+      if (++readFiles < 2) return;\n+      const diff = new PNG({ width, height });\n+\n+      const pixelErrors = pixelmatch(\n+        existingScreenshot.data,\n+        newScreenshot.data,\n+        diff.data,\n+        existingScreenshot.width,\n+        existingScreenshot.height,\n+        { threshold: 0.0 },\n+      );\n+\n+      if (pixelErrors > 0) {\n+        diff\n+          .pack()\n+          .pipe(fs.createWriteStream(`${BASE_PATH}/${name}-diff.png`))","path":"app/assets/javascripts/test/tracing-view-screenshot-tests/dataset_rendering.screenshot.js","position":null,"original_position":55,"commit_id":"516f8676f110de6dd8cd3ce0bede770c7d048c9c","original_commit_id":"de96ad8c75aa8ee16b0c618c0a26fb2ba3e85978","user":{"login":"daniel-wer","id":1702075,"node_id":"MDQ6VXNlcjE3MDIwNzU=","avatar_url":"https://avatars3.githubusercontent.com/u/1702075?v=4","gravatar_id":"","url":"https://api.github.com/users/daniel-wer","html_url":"https://github.com/daniel-wer","followers_url":"https://api.github.com/users/daniel-wer/followers","following_url":"https://api.github.com/users/daniel-wer/following{/other_user}","gists_url":"https://api.github.com/users/daniel-wer/gists{/gist_id}","starred_url":"https://api.github.com/users/daniel-wer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/daniel-wer/subscriptions","organizations_url":"https://api.github.com/users/daniel-wer/orgs","repos_url":"https://api.github.com/users/daniel-wer/repos","events_url":"https://api.github.com/users/daniel-wer/events{/privacy}","received_events_url":"https://api.github.com/users/daniel-wer/received_events","type":"User","site_admin":false},"body":"I opted to put them in the same directory and name them `<datasetName>.{diff|new}.png` to allow for fast switching between old and new screenshots. The `.{old|new}.png` files are then ignored by git.","created_at":"2018-07-05T16:08:18Z","updated_at":"2018-07-05T16:08:18Z","html_url":"https://github.com/scalableminds/webknossos/pull/2858#discussion_r200408771","pull_request_url":"https://api.github.com/repos/scalableminds/webknossos/pulls/2858","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/scalableminds/webknossos/pulls/comments/200408771"},"html":{"href":"https://github.com/scalableminds/webknossos/pull/2858#discussion_r200408771"},"pull_request":{"href":"https://api.github.com/repos/scalableminds/webknossos/pulls/2858"}},"in_reply_to_id":200332898},"pull_request":{"url":"https://api.github.com/repos/scalableminds/webknossos/pulls/2858","id":199443290,"node_id":"MDExOlB1bGxSZXF1ZXN0MTk5NDQzMjkw","html_url":"https://github.com/scalableminds/webknossos/pull/2858","diff_url":"https://github.com/scalableminds/webknossos/pull/2858.diff","patch_url":"https://github.com/scalableminds/webknossos/pull/2858.patch","issue_url":"https://api.github.com/repos/scalableminds/webknossos/issues/2858","number":2858,"state":"open","locked":false,"title":"Screenshot test tracing view","user":{"login":"daniel-wer","id":1702075,"node_id":"MDQ6VXNlcjE3MDIwNzU=","avatar_url":"https://avatars3.githubusercontent.com/u/1702075?v=4","gravatar_id":"","url":"https://api.github.com/users/daniel-wer","html_url":"https://github.com/daniel-wer","followers_url":"https://api.github.com/users/daniel-wer/followers","following_url":"https://api.github.com/users/daniel-wer/following{/other_user}","gists_url":"https://api.github.com/users/daniel-wer/gists{/gist_id}","starred_url":"https://api.github.com/users/daniel-wer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/daniel-wer/subscriptions","organizations_url":"https://api.github.com/users/daniel-wer/orgs","repos_url":"https://api.github.com/users/daniel-wer/repos","events_url":"https://api.github.com/users/daniel-wer/events{/privacy}","received_events_url":"https://api.github.com/users/daniel-wer/received_events","type":"User","site_admin":false},"body":"This PR adds screenshot tests using puppeteer. Since puppeteer can render webGL now, we're able to open the tracing view and screenshot the canvas. This allows us to do pixel perfect comparison tests of our rendering output.\r\nCurrently, I've added a first simple screenshot test. The 6 datasets that are available on our dev instances are opened at their default position/zoomstep, then screenshot and compared to the \"ground truth\" screenshots that are checked into the repository.\r\n\r\nThe tests are not ran as part of our CI, but instead can be triggered on demand by executing the `yarn test-screenshot` command. This will use the instance at `master.webknossos.xyz` by default. A specific dev instance can be used by specifying the branch name (without dashes) as follows: `BRANCH=colorsformappings yarn test-screenshot`. However, this fails currently due to a missing authentication token (see Missing section).\r\nTo renew the screenshots, simply delete them, they are then newly created when running the tests for the next time.\r\n\r\n#### Missing\r\n\r\n  - [ ] In order for puppeteer to authenticate itself, it would be helpful if on the dev instances a static authentication token could be inserted into the database (as is being done with the scmboy user). We could then hardcode this authentication token in the screenshot tests. @rschwanhold Do you think this is possible?\r\n  - [ ] I'm not sure whether the Dockerfile.puppeteer is in the correct place here, maybe it should go into our Dockerfile repository? @jstriebel (Could you also review the changes I made to the docker-compose.yml please :) )\r\n\r\n\r\n### Steps to test:\r\n- So far I've only tested this on my machine, so I'm not sure what the chances are that this works out-of-the-box for everyone, let's see :joy: \r\n- Checkout the branch and run `yarn test-screenshot`. Ideally the tests should be successful :pray:\r\n\r\n### Issues:\r\n- fixes #2822\r\n\r\n------\r\n- [x] Ready for review\r\n","created_at":"2018-07-05T11:42:27Z","updated_at":"2018-07-05T16:08:18Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4d40eeaed1976065cb28b9cc5b76a004b33867bc","assignee":{"login":"daniel-wer","id":1702075,"node_id":"MDQ6VXNlcjE3MDIwNzU=","avatar_url":"https://avatars3.githubusercontent.com/u/1702075?v=4","gravatar_id":"","url":"https://api.github.com/users/daniel-wer","html_url":"https://github.com/daniel-wer","followers_url":"https://api.github.com/users/daniel-wer/followers","following_url":"https://api.github.com/users/daniel-wer/following{/other_user}","gists_url":"https://api.github.com/users/daniel-wer/gists{/gist_id}","starred_url":"https://api.github.com/users/daniel-wer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/daniel-wer/subscriptions","organizations_url":"https://api.github.com/users/daniel-wer/orgs","repos_url":"https://api.github.com/users/daniel-wer/repos","events_url":"https://api.github.com/users/daniel-wer/events{/privacy}","received_events_url":"https://api.github.com/users/daniel-wer/received_events","type":"User","site_admin":false},"assignees":[{"login":"daniel-wer","id":1702075,"node_id":"MDQ6VXNlcjE3MDIwNzU=","avatar_url":"https://avatars3.githubusercontent.com/u/1702075?v=4","gravatar_id":"","url":"https://api.github.com/users/daniel-wer","html_url":"https://github.com/daniel-wer","followers_url":"https://api.github.com/users/daniel-wer/followers","following_url":"https://api.github.com/users/daniel-wer/following{/other_user}","gists_url":"https://api.github.com/users/daniel-wer/gists{/gist_id}","starred_url":"https://api.github.com/users/daniel-wer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/daniel-wer/subscriptions","organizations_url":"https://api.github.com/users/daniel-wer/orgs","repos_url":"https://api.github.com/users/daniel-wer/repos","events_url":"https://api.github.com/users/daniel-wer/events{/privacy}","received_events_url":"https://api.github.com/users/daniel-wer/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":60646770,"node_id":"MDU6TGFiZWw2MDY0Njc3MA==","url":"https://api.github.com/repos/scalableminds/webknossos/labels/frontend","name":"frontend","color":"207de5","default":false},{"id":318524318,"node_id":"MDU6TGFiZWwzMTg1MjQzMTg=","url":"https://api.github.com/repos/scalableminds/webknossos/labels/testing","name":"testing","color":"eb6420","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/scalableminds/webknossos/pulls/2858/commits","review_comments_url":"https://api.github.com/repos/scalableminds/webknossos/pulls/2858/comments","review_comment_url":"https://api.github.com/repos/scalableminds/webknossos/pulls/comments{/number}","comments_url":"https://api.github.com/repos/scalableminds/webknossos/issues/2858/comments","statuses_url":"https://api.github.com/repos/scalableminds/webknossos/statuses/516f8676f110de6dd8cd3ce0bede770c7d048c9c","head":{"label":"scalableminds:puppeteer-tracing-view","ref":"puppeteer-tracing-view","sha":"516f8676f110de6dd8cd3ce0bede770c7d048c9c","user":{"login":"scalableminds","id":1648557,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE2NDg1NTc=","avatar_url":"https://avatars1.githubusercontent.com/u/1648557?v=4","gravatar_id":"","url":"https://api.github.com/users/scalableminds","html_url":"https://github.com/scalableminds","followers_url":"https://api.github.com/users/scalableminds/followers","following_url":"https://api.github.com/users/scalableminds/following{/other_user}","gists_url":"https://api.github.com/users/scalableminds/gists{/gist_id}","starred_url":"https://api.github.com/users/scalableminds/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scalableminds/subscriptions","organizations_url":"https://api.github.com/users/scalableminds/orgs","repos_url":"https://api.github.com/users/scalableminds/repos","events_url":"https://api.github.com/users/scalableminds/events{/privacy}","received_events_url":"https://api.github.com/users/scalableminds/received_events","type":"Organization","site_admin":false},"repo":{"id":4326197,"node_id":"MDEwOlJlcG9zaXRvcnk0MzI2MTk3","name":"webknossos","full_name":"scalableminds/webknossos","owner":{"login":"scalableminds","id":1648557,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE2NDg1NTc=","avatar_url":"https://avatars1.githubusercontent.com/u/1648557?v=4","gravatar_id":"","url":"https://api.github.com/users/scalableminds","html_url":"https://github.com/scalableminds","followers_url":"https://api.github.com/users/scalableminds/followers","following_url":"https://api.github.com/users/scalableminds/following{/other_user}","gists_url":"https://api.github.com/users/scalableminds/gists{/gist_id}","starred_url":"https://api.github.com/users/scalableminds/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scalableminds/subscriptions","organizations_url":"https://api.github.com/users/scalableminds/orgs","repos_url":"https://api.github.com/users/scalableminds/repos","events_url":"https://api.github.com/users/scalableminds/events{/privacy}","received_events_url":"https://api.github.com/users/scalableminds/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/scalableminds/webknossos","description":"A fully cloud- and browser-based 3D annotation tool for distributed large-scale data analysis in light- and electron-microscopy based Connectomics","fork":false,"url":"https://api.github.com/repos/scalableminds/webknossos","forks_url":"https://api.github.com/repos/scalableminds/webknossos/forks","keys_url":"https://api.github.com/repos/scalableminds/webknossos/keys{/key_id}","collaborators_url":"https://api.github.com/repos/scalableminds/webknossos/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/scalableminds/webknossos/teams","hooks_url":"https://api.github.com/repos/scalableminds/webknossos/hooks","issue_events_url":"https://api.github.com/repos/scalableminds/webknossos/issues/events{/number}","events_url":"https://api.github.com/repos/scalableminds/webknossos/events","assignees_url":"https://api.github.com/repos/scalableminds/webknossos/assignees{/user}","branches_url":"https://api.github.com/repos/scalableminds/webknossos/branches{/branch}","tags_url":"https://api.github.com/repos/scalableminds/webknossos/tags","blobs_url":"https://api.github.com/repos/scalableminds/webknossos/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/scalableminds/webknossos/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/scalableminds/webknossos/git/refs{/sha}","trees_url":"https://api.github.com/repos/scalableminds/webknossos/git/trees{/sha}","statuses_url":"https://api.github.com/repos/scalableminds/webknossos/statuses/{sha}","languages_url":"https://api.github.com/repos/scalableminds/webknossos/languages","stargazers_url":"https://api.github.com/repos/scalableminds/webknossos/stargazers","contributors_url":"https://api.github.com/repos/scalableminds/webknossos/contributors","subscribers_url":"https://api.github.com/repos/scalableminds/webknossos/subscribers","subscription_url":"https://api.github.com/repos/scalableminds/webknossos/subscription","commits_url":"https://api.github.com/repos/scalableminds/webknossos/commits{/sha}","git_commits_url":"https://api.github.com/repos/scalableminds/webknossos/git/commits{/sha}","comments_url":"https://api.github.com/repos/scalableminds/webknossos/comments{/number}","issue_comment_url":"https://api.github.com/repos/scalableminds/webknossos/issues/comments{/number}","contents_url":"https://api.github.com/repos/scalableminds/webknossos/contents/{+path}","compare_url":"https://api.github.com/repos/scalableminds/webknossos/compare/{base}...{head}","merges_url":"https://api.github.com/repos/scalableminds/webknossos/merges","archive_url":"https://api.github.com/repos/scalableminds/webknossos/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/scalableminds/webknossos/downloads","issues_url":"https://api.github.com/repos/scalableminds/webknossos/issues{/number}","pulls_url":"https://api.github.com/repos/scalableminds/webknossos/pulls{/number}","milestones_url":"https://api.github.com/repos/scalableminds/webknossos/milestones{/number}","notifications_url":"https://api.github.com/repos/scalableminds/webknossos/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/scalableminds/webknossos/labels{/name}","releases_url":"https://api.github.com/repos/scalableminds/webknossos/releases{/id}","deployments_url":"https://api.github.com/repos/scalableminds/webknossos/deployments","created_at":"2012-05-14T16:26:17Z","updated_at":"2018-07-05T14:13:22Z","pushed_at":"2018-07-05T15:53:13Z","git_url":"git://github.com/scalableminds/webknossos.git","ssh_url":"git@github.com:scalableminds/webknossos.git","clone_url":"https://github.com/scalableminds/webknossos.git","svn_url":"https://github.com/scalableminds/webknossos","homepage":"https://webknossos.org/","size":99002,"stargazers_count":20,"watchers_count":20,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":4,"mirror_url":null,"archived":false,"open_issues_count":94,"license":{"key":"agpl-3.0","name":"GNU Affero General Public License v3.0","spdx_id":"AGPL-3.0","url":"https://api.github.com/licenses/agpl-3.0","node_id":"MDc6TGljZW5zZTE="},"forks":4,"open_issues":94,"watchers":20,"default_branch":"master"}},"base":{"label":"scalableminds:master","ref":"master","sha":"cac15bfcda0a61a0cedbfa377a09676b160f21ce","user":{"login":"scalableminds","id":1648557,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE2NDg1NTc=","avatar_url":"https://avatars1.githubusercontent.com/u/1648557?v=4","gravatar_id":"","url":"https://api.github.com/users/scalableminds","html_url":"https://github.com/scalableminds","followers_url":"https://api.github.com/users/scalableminds/followers","following_url":"https://api.github.com/users/scalableminds/following{/other_user}","gists_url":"https://api.github.com/users/scalableminds/gists{/gist_id}","starred_url":"https://api.github.com/users/scalableminds/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scalableminds/subscriptions","organizations_url":"https://api.github.com/users/scalableminds/orgs","repos_url":"https://api.github.com/users/scalableminds/repos","events_url":"https://api.github.com/users/scalableminds/events{/privacy}","received_events_url":"https://api.github.com/users/scalableminds/received_events","type":"Organization","site_admin":false},"repo":{"id":4326197,"node_id":"MDEwOlJlcG9zaXRvcnk0MzI2MTk3","name":"webknossos","full_name":"scalableminds/webknossos","owner":{"login":"scalableminds","id":1648557,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE2NDg1NTc=","avatar_url":"https://avatars1.githubusercontent.com/u/1648557?v=4","gravatar_id":"","url":"https://api.github.com/users/scalableminds","html_url":"https://github.com/scalableminds","followers_url":"https://api.github.com/users/scalableminds/followers","following_url":"https://api.github.com/users/scalableminds/following{/other_user}","gists_url":"https://api.github.com/users/scalableminds/gists{/gist_id}","starred_url":"https://api.github.com/users/scalableminds/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scalableminds/subscriptions","organizations_url":"https://api.github.com/users/scalableminds/orgs","repos_url":"https://api.github.com/users/scalableminds/repos","events_url":"https://api.github.com/users/scalableminds/events{/privacy}","received_events_url":"https://api.github.com/users/scalableminds/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/scalableminds/webknossos","description":"A fully cloud- and browser-based 3D annotation tool for distributed large-scale data analysis in light- and electron-microscopy based Connectomics","fork":false,"url":"https://api.github.com/repos/scalableminds/webknossos","forks_url":"https://api.github.com/repos/scalableminds/webknossos/forks","keys_url":"https://api.github.com/repos/scalableminds/webknossos/keys{/key_id}","collaborators_url":"https://api.github.com/repos/scalableminds/webknossos/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/scalableminds/webknossos/teams","hooks_url":"https://api.github.com/repos/scalableminds/webknossos/hooks","issue_events_url":"https://api.github.com/repos/scalableminds/webknossos/issues/events{/number}","events_url":"https://api.github.com/repos/scalableminds/webknossos/events","assignees_url":"https://api.github.com/repos/scalableminds/webknossos/assignees{/user}","branches_url":"https://api.github.com/repos/scalableminds/webknossos/branches{/branch}","tags_url":"https://api.github.com/repos/scalableminds/webknossos/tags","blobs_url":"https://api.github.com/repos/scalableminds/webknossos/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/scalableminds/webknossos/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/scalableminds/webknossos/git/refs{/sha}","trees_url":"https://api.github.com/repos/scalableminds/webknossos/git/trees{/sha}","statuses_url":"https://api.github.com/repos/scalableminds/webknossos/statuses/{sha}","languages_url":"https://api.github.com/repos/scalableminds/webknossos/languages","stargazers_url":"https://api.github.com/repos/scalableminds/webknossos/stargazers","contributors_url":"https://api.github.com/repos/scalableminds/webknossos/contributors","subscribers_url":"https://api.github.com/repos/scalableminds/webknossos/subscribers","subscription_url":"https://api.github.com/repos/scalableminds/webknossos/subscription","commits_url":"https://api.github.com/repos/scalableminds/webknossos/commits{/sha}","git_commits_url":"https://api.github.com/repos/scalableminds/webknossos/git/commits{/sha}","comments_url":"https://api.github.com/repos/scalableminds/webknossos/comments{/number}","issue_comment_url":"https://api.github.com/repos/scalableminds/webknossos/issues/comments{/number}","contents_url":"https://api.github.com/repos/scalableminds/webknossos/contents/{+path}","compare_url":"https://api.github.com/repos/scalableminds/webknossos/compare/{base}...{head}","merges_url":"https://api.github.com/repos/scalableminds/webknossos/merges","archive_url":"https://api.github.com/repos/scalableminds/webknossos/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/scalableminds/webknossos/downloads","issues_url":"https://api.github.com/repos/scalableminds/webknossos/issues{/number}","pulls_url":"https://api.github.com/repos/scalableminds/webknossos/pulls{/number}","milestones_url":"https://api.github.com/repos/scalableminds/webknossos/milestones{/number}","notifications_url":"https://api.github.com/repos/scalableminds/webknossos/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/scalableminds/webknossos/labels{/name}","releases_url":"https://api.github.com/repos/scalableminds/webknossos/releases{/id}","deployments_url":"https://api.github.com/repos/scalableminds/webknossos/deployments","created_at":"2012-05-14T16:26:17Z","updated_at":"2018-07-05T14:13:22Z","pushed_at":"2018-07-05T15:53:13Z","git_url":"git://github.com/scalableminds/webknossos.git","ssh_url":"git@github.com:scalableminds/webknossos.git","clone_url":"https://github.com/scalableminds/webknossos.git","svn_url":"https://github.com/scalableminds/webknossos","homepage":"https://webknossos.org/","size":99002,"stargazers_count":20,"watchers_count":20,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":4,"mirror_url":null,"archived":false,"open_issues_count":94,"license":{"key":"agpl-3.0","name":"GNU Affero General Public License v3.0","spdx_id":"AGPL-3.0","url":"https://api.github.com/licenses/agpl-3.0","node_id":"MDc6TGljZW5zZTE="},"forks":4,"open_issues":94,"watchers":20,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/scalableminds/webknossos/pulls/2858"},"html":{"href":"https://github.com/scalableminds/webknossos/pull/2858"},"issue":{"href":"https://api.github.com/repos/scalableminds/webknossos/issues/2858"},"comments":{"href":"https://api.github.com/repos/scalableminds/webknossos/issues/2858/comments"},"review_comments":{"href":"https://api.github.com/repos/scalableminds/webknossos/pulls/2858/comments"},"review_comment":{"href":"https://api.github.com/repos/scalableminds/webknossos/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/scalableminds/webknossos/pulls/2858/commits"},"statuses":{"href":"https://api.github.com/repos/scalableminds/webknossos/statuses/516f8676f110de6dd8cd3ce0bede770c7d048c9c"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"daniel-wer"}}