{"action":"created","comment":{"url":"https://api.github.com/repos/palantir/plottable/pulls/comments/44855357","id":44855357,"diff_hunk":"@@ -2,463 +2,457 @@\n \n describe(\"Interactions\", () => {\n   describe(\"Drag Interaction\", () => {\n-    describe(\"Basic Usage\", () => {\n-      let SVG_WIDTH = 400;\n-      let SVG_HEIGHT = 400;\n-\n-      let startPoint = {\n-        x: SVG_WIDTH / 4,\n-        y: SVG_HEIGHT / 4\n-      };\n-      let endPoint = {\n-        x: SVG_WIDTH / 2,\n-        y: SVG_HEIGHT / 2\n-      };\n-      let positiveOutsidePoint = {\n-        x: SVG_WIDTH * 1.5,\n-        y: SVG_HEIGHT * 1.5\n-      };\n-      let negativeOutsidePoint = {\n-        x: -SVG_WIDTH / 2,\n-        y: -SVG_HEIGHT / 2\n-      };\n-\n-      let svg: d3.Selection<void>;\n-      let component: Plottable.Component;\n-      let dragInteraction: Plottable.Interactions.Drag;\n-\n-      beforeEach(() => {\n-        svg = TestMethods.generateSVG(SVG_WIDTH, SVG_HEIGHT);\n-        component = new Plottable.Component();\n-        component.renderTo(svg);\n-\n-        dragInteraction = new Plottable.Interactions.Drag();\n-      });\n-\n-      it(\"calls the onDragStart() callback\", () => {\n-        let startCallbackCalled = false;\n-        let receivedStart: Plottable.Point;\n-        let startCallback = (point: Plottable.Point) => {\n-          startCallbackCalled = true;\n-          receivedStart = point;\n-        };\n-\n-        assert.strictEqual(dragInteraction.onDragStart(startCallback), dragInteraction,\n-          \"setting onDragStart callback returns the drag interaction\");\n-        dragInteraction.attachTo(component);\n-\n-        let target = component.background();\n-        TestMethods.triggerFakeMouseEvent(\"mousedown\", target, startPoint.x, startPoint.y);\n-        assert.isTrue(startCallbackCalled, \"callback was called on beginning drag (mousedown)\");\n-        assert.deepEqual(receivedStart, startPoint, \"was passed the correct point\");\n-\n-        startCallbackCalled = false;\n-        receivedStart = null;\n-        TestMethods.triggerFakeMouseEvent(\"mousedown\", target, startPoint.x, startPoint.y, 2);\n-        assert.isFalse(startCallbackCalled, \"callback is not called on right-click\");\n-\n-        startCallbackCalled = false;\n-        receivedStart = null;\n-        TestMethods.triggerFakeTouchEvent(\"touchstart\", target, [{x: startPoint.x, y: startPoint.y}]);\n-        assert.isTrue(startCallbackCalled, \"callback was called on beginning drag (touchstart)\");\n-        assert.deepEqual(receivedStart, startPoint, \"was passed the correct point\");\n-\n-        startCallbackCalled = false;\n-        TestMethods.triggerFakeMouseEvent(\"mousedown\", target, positiveOutsidePoint.x, positiveOutsidePoint.y);\n-        assert.isFalse(startCallbackCalled, \"does not trigger callback if drag starts outside the Component (positive) (mousedown)\");\n-        TestMethods.triggerFakeMouseEvent(\"mousedown\", target, negativeOutsidePoint.x, negativeOutsidePoint.y);\n-        assert.isFalse(startCallbackCalled, \"does not trigger callback if drag starts outside the Component (negative) (mousedown)\");\n-\n-        TestMethods.triggerFakeTouchEvent(\"touchstart\", target, [{x: positiveOutsidePoint.x, y: positiveOutsidePoint.y}]);\n-        assert.isFalse(startCallbackCalled, \"does not trigger callback if drag starts outside the Component (positive) (touchstart)\");\n-        TestMethods.triggerFakeTouchEvent(\"touchstart\", target, [{x: negativeOutsidePoint.x, y: negativeOutsidePoint.y}]);\n-        assert.isFalse(startCallbackCalled, \"does not trigger callback if drag starts outside the Component (negative) (touchstart)\");\n+    const SVG_WIDTH = 400;\n+    const SVG_HEIGHT = 400;\n+\n+    const startPoint = {\n+      x: SVG_WIDTH / 4,\n+      y: SVG_HEIGHT / 4\n+    };\n+    const endPoint = {\n+      x: SVG_WIDTH / 2,\n+      y: SVG_HEIGHT / 2\n+    };\n+    const positiveOutsidePoint = {\n+      x: SVG_WIDTH * 1.5,\n+      y: SVG_HEIGHT * 1.5\n+    };\n+    const negativeOutsidePoint = {\n+      x: -SVG_WIDTH / 2,\n+      y: -SVG_HEIGHT / 2\n+    };\n+\n+    let svg: d3.Selection<void>;\n+    let component: Plottable.Component;\n+    let dragInteraction: Plottable.Interactions.Drag;\n+\n+    class TestDragCallback {\n+      private called: boolean;\n+      private startPoint: Plottable.Point;\n+      private endPoint: Plottable.Point;\n+\n+      constructor() {\n+        this.called = false;\n+      }\n+\n+      public call(start: Plottable.Point, end: Plottable.Point) {\n+        this.called = true;\n+        this.startPoint = start;\n+        this.endPoint = end;\n+      }\n+\n+      public getCalled() {\n+        return this.called;\n+      }\n+\n+      public getStartPoint() {\n+        return this.startPoint;\n+      }\n+\n+      public getEndPoint() {\n+        return this.endPoint;\n+      }\n+    }\n+\n+    function dragStart(point: Plottable.Point,\n+                      mode: TestMethods.InteractionMode = TestMethods.InteractionMode.Mouse) {\n+      TestMethods.triggerFakeInteractionEvent(mode, TestMethods.InteractionType.Start, component.background(), point.x, point.y);\n+    }\n+\n+    function dragMove(startPoint: Plottable.Point,\n+                      endPoint: Plottable.Point,\n+                      mode: TestMethods.InteractionMode = TestMethods.InteractionMode.Mouse) {\n+      TestMethods.triggerFakeInteractionEvent(mode, TestMethods.InteractionType.Start, component.background(), startPoint.x, startPoint.y);\n+      TestMethods.triggerFakeInteractionEvent(mode, TestMethods.InteractionType.Move, component.background(), endPoint.x, endPoint.y);\n+    }\n+\n+    function dragEnd(startPoint: Plottable.Point,\n+                    endPoint: Plottable.Point,\n+                    mode: TestMethods.InteractionMode = TestMethods.InteractionMode.Mouse) {\n+      TestMethods.triggerFakeInteractionEvent(mode, TestMethods.InteractionType.Start, component.background(), startPoint.x, startPoint.y);\n+      TestMethods.triggerFakeInteractionEvent(mode, TestMethods.InteractionType.End, component.background(), endPoint.x, endPoint.y);\n+    }\n+\n+    beforeEach(() => {\n+      svg = TestMethods.generateSVG(SVG_WIDTH, SVG_HEIGHT);\n+      component = new Plottable.Component();\n+      component.renderTo(svg);\n+\n+      dragInteraction = new Plottable.Interactions.Drag();\n+      dragInteraction.attachTo(component);\n+    });\n \n+    afterEach(function() {\n+      if (this.currentTest.state === \"passed\") {\n         svg.remove();\n-      });\n+      }\n+    });\n \n-      it(\"can de-register the onDragStart() interaction\", () => {\n-        dragInteraction.attachTo(component);\n+    describe(\"onDragStart/offDragStart\", () => {\n+      describe(\"registration\", () => {\n+        it(\"registers callback using onDragStart\", () => {\n+          const callback = new TestDragCallback();\n+          const call = (start: Plottable.Point, end: Plottable.Point) => callback.call(start, end);\n \n-        let startCallbackCalled = false;\n-        let startCallback = () => startCallbackCalled = true;\n+          assert.strictEqual(dragInteraction.onDragStart(call), dragInteraction, \"registration returns the calling Interaction\");\n+          dragStart(startPoint);\n \n-        dragInteraction.onDragStart(startCallback);\n+          assert.isTrue(callback.getCalled(), \"Interaction should trigger the callback\");\n+        });\n \n-        let target = component.background();\n-        TestMethods.triggerFakeMouseEvent(\"mousedown\", target, startPoint.x, startPoint.y);\n-        assert.isTrue(startCallbackCalled, \"callback was called on beginning drag (mousedown)\");\n+        it(\"deregisters callback using offDragStart\", () => {\n+          const callback = new TestDragCallback();\n+          const call = (start: Plottable.Point, end: Plottable.Point) => callback.call(start, end);\n \n-        dragInteraction.offDragStart(startCallback);\n+          dragInteraction.onDragStart(call);\n+          assert.strictEqual(dragInteraction.offDragStart(call), dragInteraction, \"deregistration returns the calling Interaction\");\n+          dragStart(startPoint);\n \n-        startCallbackCalled = false;\n-        TestMethods.triggerFakeMouseEvent(\"mousedown\", target, startPoint.x, startPoint.y);\n-        assert.isFalse(startCallbackCalled, \"callback was decoupled from the interaction\");\n+          assert.isFalse(callback.getCalled(), \"Callback should be disconnected from the interaction\");\n+        });\n \n-        TestMethods.triggerFakeTouchEvent(\"touchstart\", target, [{x: startPoint.x, y: startPoint.y}]);\n-        assert.isFalse(startCallbackCalled, \"callback was decoupled from the interaction\");\n+        it(\"can register multiple onDragStart callbacks\", () => {\n+          const callback1 = new TestDragCallback();\n+          const call1 = (start: Plottable.Point, end: Plottable.Point) => callback1.call(start, end);\n \n-        svg.remove();\n-      });\n+          const callback2 = new TestDragCallback();\n+          const call2 = (start: Plottable.Point, end: Plottable.Point) => callback2.call(start, end);\n \n-      it(\"can register two onDragStart() callbacks\", () => {\n-        let startCallback1Called = false;\n-        let startCallback2Called = false;\n-        let startCallback1 = () => startCallback1Called = true;\n-        let startCallback2 = () => startCallback2Called = true;\n+          dragInteraction.onDragStart(call1);\n+          dragInteraction.onDragStart(call2);\n+          dragStart(startPoint);\n \n-        dragInteraction.onDragStart(startCallback1);\n-        dragInteraction.onDragStart(startCallback2);\n+          assert.isTrue(callback1.getCalled(), \"Interaction should trigger the first callback\");\n+          assert.isTrue(callback2.getCalled(), \"Interaction should trigger the second callback\");\n+        });\n \n-        dragInteraction.attachTo(component);\n+        it(\"can deregister an onDragStart callback without affecting the other ones\", () => {\n+          const callback1 = new TestDragCallback();\n+          const call1 = (start: Plottable.Point, end: Plottable.Point) => callback1.call(start, end);\n \n-        let target = component.background();\n-        TestMethods.triggerFakeMouseEvent(\"mousedown\", target, startPoint.x, startPoint.y);\n-        assert.isTrue(startCallback1Called, \"callback 1 was called on beginning drag (mousedown)\");\n-        assert.isTrue(startCallback2Called, \"callback 2 was called on beginning drag (mousedown)\");\n+          const callback2 = new TestDragCallback();\n+          const call2 = (start: Plottable.Point, end: Plottable.Point) => callback2.call(start, end);\n \n-        startCallback1Called = false;\n-        startCallback2Called = false;\n-        dragInteraction.offDragStart(startCallback1);\n-        TestMethods.triggerFakeMouseEvent(\"mousedown\", target, startPoint.x, startPoint.y);\n-        assert.isFalse(startCallback1Called, \"callback 1 was disconnected from drag start interaction\");\n-        assert.isTrue(startCallback2Called, \"callback 2 is still connected to the drag start interaction\");\n+          dragInteraction.onDragStart(call1);\n+          dragInteraction.onDragStart(call2);\n+          dragInteraction.offDragStart(call1);\n+          dragStart(startPoint);\n \n-        svg.remove();\n+          assert.isFalse(callback1.getCalled(), \"Callback1 should be disconnected from the click interaction\");\n+          assert.isTrue(callback2.getCalled(), \"Callback2 should still exist on the click interaction\");\n+        });\n       });\n \n-      it(\"calls the onDrag() callback\", () => {\n-        let moveCallbackCalled = false;\n-        let receivedStart: Plottable.Point;\n-        let receivedEnd: Plottable.Point;\n-        let moveCallback = (start: Plottable.Point, end: Plottable.Point) => {\n-          moveCallbackCalled = true;\n-          receivedStart = start;\n-          receivedEnd = end;\n-        };\n-\n-        assert.strictEqual(dragInteraction.onDrag(moveCallback), dragInteraction,\n-          \"setting onDrag callback returns the drag interaction\");\n-        dragInteraction.attachTo(component);\n-\n-        let target = component.background();\n-        TestMethods.triggerFakeMouseEvent(\"mousedown\", target, startPoint.x, startPoint.y);\n-        TestMethods.triggerFakeMouseEvent(\"mousemove\", target, endPoint.x, endPoint.y);\n-        assert.isTrue(moveCallbackCalled, \"callback was called on dragging (mousemove)\");\n-        assert.deepEqual(receivedStart, startPoint, \"was passed the correct starting point\");\n-        assert.deepEqual(receivedEnd, endPoint, \"was passed the correct current point\");\n-\n-        receivedStart = null;\n-        receivedEnd = null;\n-        TestMethods.triggerFakeTouchEvent(\"touchstart\", target, [{x: startPoint.x, y: startPoint.y}]);\n-        TestMethods.triggerFakeTouchEvent(\"touchmove\", target, [{x: endPoint.x, y: endPoint.y}]);\n-        assert.isTrue(moveCallbackCalled, \"callback was called on dragging (touchmove)\");\n-        assert.deepEqual(receivedStart, startPoint, \"was passed the correct starting point\");\n-        assert.deepEqual(receivedEnd, endPoint, \"was passed the correct current point\");\n-\n-        svg.remove();\n+      [TestMethods.InteractionMode.Mouse, TestMethods.InteractionMode.Touch].forEach((mode) => {\n+        describe(`invoking with ${TestMethods.InteractionMode[mode]} events`, () => {\n+          let callback: TestDragCallback;\n+\n+          beforeEach(() => {\n+            callback = new TestDragCallback();\n+            dragInteraction.onDragStart((start: Plottable.Point, end: Plottable.Point) => callback.call(start, end));\n+          });\n+\n+          it(\"invokes onDragStart callback on start event\", () => {\n+            dragStart(startPoint, mode);\n+            assert.isTrue(callback.getCalled(), \"callback was called on beginning drag\");\n+            assert.deepEqual(callback.getStartPoint(), startPoint, \"was passed the correct point\");\n+          });\n+\n+          it(\"does not invoke callback if drag starts outside Component\", () => {\n+            dragStart(positiveOutsidePoint, mode);\n+            assert.isFalse(callback.getCalled(), \"does not trigger callback if drag starts outside the Component (positive)\");\n+            dragStart(negativeOutsidePoint, mode);\n+            assert.isFalse(callback.getCalled(), \"does not trigger callback if drag starts outside the Component (negative)\");\n+          });\n+\n+          if (mode === TestMethods.InteractionMode.Mouse) {\n+            it(\"does not invoke onDragStart on right click\", () => {\n+              TestMethods.triggerFakeMouseEvent(\"mousedown\", component.background(), startPoint.x, startPoint.y, 2);\n+              assert.isFalse(callback.getCalled(), \"callback is not called on right-click\");\n+            });\n+          }\n+        });\n       });\n+    });\n \n-      it(\"can de-register the onDrag() interaction\", () => {\n-        dragInteraction.attachTo(component);\n-\n-        let moveCallbackCalled = false;\n-        let moveCallback = () => moveCallbackCalled = true;\n+    describe(\"onDrag/offDrag\", () => {\n+      describe(\"registration\", () => {","path":"test/interactions/dragInteractionTests.ts","position":320,"original_position":320,"commit_id":"227714592c624e30a439267385461b7b6b7e11c1","original_commit_id":"227714592c624e30a439267385461b7b6b7e11c1","user":{"login":"ztsai","id":1817638,"avatar_url":"https://avatars.githubusercontent.com/u/1817638?v=3","gravatar_id":"","url":"https://api.github.com/users/ztsai","html_url":"https://github.com/ztsai","followers_url":"https://api.github.com/users/ztsai/followers","following_url":"https://api.github.com/users/ztsai/following{/other_user}","gists_url":"https://api.github.com/users/ztsai/gists{/gist_id}","starred_url":"https://api.github.com/users/ztsai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ztsai/subscriptions","organizations_url":"https://api.github.com/users/ztsai/orgs","repos_url":"https://api.github.com/users/ztsai/repos","events_url":"https://api.github.com/users/ztsai/events{/privacy}","received_events_url":"https://api.github.com/users/ztsai/received_events","type":"User","site_admin":false},"body":"do you think it's possible to refactor this a bit since `onDrag/offDrag`, `onDragStart/offDragStart`, and `onDragEnd/offDragEnd` all share \"registration\", \"deregistration\", \"multiple registration\", \"deregistration isolation\" ","created_at":"2015-11-14T05:42:27Z","updated_at":"2015-11-14T05:42:27Z","html_url":"https://github.com/palantir/plottable/pull/2893#discussion_r44855357","pull_request_url":"https://api.github.com/repos/palantir/plottable/pulls/2893","_links":{"self":{"href":"https://api.github.com/repos/palantir/plottable/pulls/comments/44855357"},"html":{"href":"https://github.com/palantir/plottable/pull/2893#discussion_r44855357"},"pull_request":{"href":"https://api.github.com/repos/palantir/plottable/pulls/2893"}}},"pull_request":{"url":"https://api.github.com/repos/palantir/plottable/pulls/2893","id":47960281,"html_url":"https://github.com/palantir/plottable/pull/2893","diff_url":"https://github.com/palantir/plottable/pull/2893.diff","patch_url":"https://github.com/palantir/plottable/pull/2893.patch","issue_url":"https://api.github.com/repos/palantir/plottable/issues/2893","number":2893,"state":"open","locked":false,"title":"Issue #2628: refactor interaction unit tests","user":{"login":"nmiyake","id":4267425,"avatar_url":"https://avatars.githubusercontent.com/u/4267425?v=3","gravatar_id":"","url":"https://api.github.com/users/nmiyake","html_url":"https://github.com/nmiyake","followers_url":"https://api.github.com/users/nmiyake/followers","following_url":"https://api.github.com/users/nmiyake/following{/other_user}","gists_url":"https://api.github.com/users/nmiyake/gists{/gist_id}","starred_url":"https://api.github.com/users/nmiyake/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nmiyake/subscriptions","organizations_url":"https://api.github.com/users/nmiyake/orgs","repos_url":"https://api.github.com/users/nmiyake/repos","events_url":"https://api.github.com/users/nmiyake/events{/privacy}","received_events_url":"https://api.github.com/users/nmiyake/received_events","type":"User","site_admin":false},"body":"For click, double click and drag","created_at":"2015-10-16T21:07:17Z","updated_at":"2015-11-14T05:42:27Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3374ba3d24fe33302e0ff77d584819527ae896b3","assignee":{"login":"ztsai","id":1817638,"avatar_url":"https://avatars.githubusercontent.com/u/1817638?v=3","gravatar_id":"","url":"https://api.github.com/users/ztsai","html_url":"https://github.com/ztsai","followers_url":"https://api.github.com/users/ztsai/followers","following_url":"https://api.github.com/users/ztsai/following{/other_user}","gists_url":"https://api.github.com/users/ztsai/gists{/gist_id}","starred_url":"https://api.github.com/users/ztsai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ztsai/subscriptions","organizations_url":"https://api.github.com/users/ztsai/orgs","repos_url":"https://api.github.com/users/ztsai/repos","events_url":"https://api.github.com/users/ztsai/events{/privacy}","received_events_url":"https://api.github.com/users/ztsai/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/palantir/plottable/pulls/2893/commits","review_comments_url":"https://api.github.com/repos/palantir/plottable/pulls/2893/comments","review_comment_url":"https://api.github.com/repos/palantir/plottable/pulls/comments{/number}","comments_url":"https://api.github.com/repos/palantir/plottable/issues/2893/comments","statuses_url":"https://api.github.com/repos/palantir/plottable/statuses/227714592c624e30a439267385461b7b6b7e11c1","head":{"label":"palantir:interactionTestRefactor","ref":"interactionTestRefactor","sha":"227714592c624e30a439267385461b7b6b7e11c1","user":{"login":"palantir","id":303157,"avatar_url":"https://avatars.githubusercontent.com/u/303157?v=3","gravatar_id":"","url":"https://api.github.com/users/palantir","html_url":"https://github.com/palantir","followers_url":"https://api.github.com/users/palantir/followers","following_url":"https://api.github.com/users/palantir/following{/other_user}","gists_url":"https://api.github.com/users/palantir/gists{/gist_id}","starred_url":"https://api.github.com/users/palantir/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/palantir/subscriptions","organizations_url":"https://api.github.com/users/palantir/orgs","repos_url":"https://api.github.com/users/palantir/repos","events_url":"https://api.github.com/users/palantir/events{/privacy}","received_events_url":"https://api.github.com/users/palantir/received_events","type":"Organization","site_admin":false},"repo":{"id":16149854,"name":"plottable","full_name":"palantir/plottable","owner":{"login":"palantir","id":303157,"avatar_url":"https://avatars.githubusercontent.com/u/303157?v=3","gravatar_id":"","url":"https://api.github.com/users/palantir","html_url":"https://github.com/palantir","followers_url":"https://api.github.com/users/palantir/followers","following_url":"https://api.github.com/users/palantir/following{/other_user}","gists_url":"https://api.github.com/users/palantir/gists{/gist_id}","starred_url":"https://api.github.com/users/palantir/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/palantir/subscriptions","organizations_url":"https://api.github.com/users/palantir/orgs","repos_url":"https://api.github.com/users/palantir/repos","events_url":"https://api.github.com/users/palantir/events{/privacy}","received_events_url":"https://api.github.com/users/palantir/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/palantir/plottable","description":"A library of modular chart components, built on D3","fork":false,"url":"https://api.github.com/repos/palantir/plottable","forks_url":"https://api.github.com/repos/palantir/plottable/forks","keys_url":"https://api.github.com/repos/palantir/plottable/keys{/key_id}","collaborators_url":"https://api.github.com/repos/palantir/plottable/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/palantir/plottable/teams","hooks_url":"https://api.github.com/repos/palantir/plottable/hooks","issue_events_url":"https://api.github.com/repos/palantir/plottable/issues/events{/number}","events_url":"https://api.github.com/repos/palantir/plottable/events","assignees_url":"https://api.github.com/repos/palantir/plottable/assignees{/user}","branches_url":"https://api.github.com/repos/palantir/plottable/branches{/branch}","tags_url":"https://api.github.com/repos/palantir/plottable/tags","blobs_url":"https://api.github.com/repos/palantir/plottable/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/palantir/plottable/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/palantir/plottable/git/refs{/sha}","trees_url":"https://api.github.com/repos/palantir/plottable/git/trees{/sha}","statuses_url":"https://api.github.com/repos/palantir/plottable/statuses/{sha}","languages_url":"https://api.github.com/repos/palantir/plottable/languages","stargazers_url":"https://api.github.com/repos/palantir/plottable/stargazers","contributors_url":"https://api.github.com/repos/palantir/plottable/contributors","subscribers_url":"https://api.github.com/repos/palantir/plottable/subscribers","subscription_url":"https://api.github.com/repos/palantir/plottable/subscription","commits_url":"https://api.github.com/repos/palantir/plottable/commits{/sha}","git_commits_url":"https://api.github.com/repos/palantir/plottable/git/commits{/sha}","comments_url":"https://api.github.com/repos/palantir/plottable/comments{/number}","issue_comment_url":"https://api.github.com/repos/palantir/plottable/issues/comments{/number}","contents_url":"https://api.github.com/repos/palantir/plottable/contents/{+path}","compare_url":"https://api.github.com/repos/palantir/plottable/compare/{base}...{head}","merges_url":"https://api.github.com/repos/palantir/plottable/merges","archive_url":"https://api.github.com/repos/palantir/plottable/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/palantir/plottable/downloads","issues_url":"https://api.github.com/repos/palantir/plottable/issues{/number}","pulls_url":"https://api.github.com/repos/palantir/plottable/pulls{/number}","milestones_url":"https://api.github.com/repos/palantir/plottable/milestones{/number}","notifications_url":"https://api.github.com/repos/palantir/plottable/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/palantir/plottable/labels{/name}","releases_url":"https://api.github.com/repos/palantir/plottable/releases{/id}","created_at":"2014-01-22T19:29:19Z","updated_at":"2015-11-13T12:09:51Z","pushed_at":"2015-11-13T23:17:17Z","git_url":"git://github.com/palantir/plottable.git","ssh_url":"git@github.com:palantir/plottable.git","clone_url":"https://github.com/palantir/plottable.git","svn_url":"https://github.com/palantir/plottable","homepage":"plottablejs.org","size":140678,"stargazers_count":794,"watchers_count":794,"language":"TypeScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":85,"mirror_url":null,"open_issues_count":232,"forks":85,"open_issues":232,"watchers":794,"default_branch":"develop"}},"base":{"label":"palantir:develop","ref":"develop","sha":"e6df7f2988fe86e9b357ff09295916760d76ed2d","user":{"login":"palantir","id":303157,"avatar_url":"https://avatars.githubusercontent.com/u/303157?v=3","gravatar_id":"","url":"https://api.github.com/users/palantir","html_url":"https://github.com/palantir","followers_url":"https://api.github.com/users/palantir/followers","following_url":"https://api.github.com/users/palantir/following{/other_user}","gists_url":"https://api.github.com/users/palantir/gists{/gist_id}","starred_url":"https://api.github.com/users/palantir/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/palantir/subscriptions","organizations_url":"https://api.github.com/users/palantir/orgs","repos_url":"https://api.github.com/users/palantir/repos","events_url":"https://api.github.com/users/palantir/events{/privacy}","received_events_url":"https://api.github.com/users/palantir/received_events","type":"Organization","site_admin":false},"repo":{"id":16149854,"name":"plottable","full_name":"palantir/plottable","owner":{"login":"palantir","id":303157,"avatar_url":"https://avatars.githubusercontent.com/u/303157?v=3","gravatar_id":"","url":"https://api.github.com/users/palantir","html_url":"https://github.com/palantir","followers_url":"https://api.github.com/users/palantir/followers","following_url":"https://api.github.com/users/palantir/following{/other_user}","gists_url":"https://api.github.com/users/palantir/gists{/gist_id}","starred_url":"https://api.github.com/users/palantir/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/palantir/subscriptions","organizations_url":"https://api.github.com/users/palantir/orgs","repos_url":"https://api.github.com/users/palantir/repos","events_url":"https://api.github.com/users/palantir/events{/privacy}","received_events_url":"https://api.github.com/users/palantir/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/palantir/plottable","description":"A library of modular chart components, built on D3","fork":false,"url":"https://api.github.com/repos/palantir/plottable","forks_url":"https://api.github.com/repos/palantir/plottable/forks","keys_url":"https://api.github.com/repos/palantir/plottable/keys{/key_id}","collaborators_url":"https://api.github.com/repos/palantir/plottable/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/palantir/plottable/teams","hooks_url":"https://api.github.com/repos/palantir/plottable/hooks","issue_events_url":"https://api.github.com/repos/palantir/plottable/issues/events{/number}","events_url":"https://api.github.com/repos/palantir/plottable/events","assignees_url":"https://api.github.com/repos/palantir/plottable/assignees{/user}","branches_url":"https://api.github.com/repos/palantir/plottable/branches{/branch}","tags_url":"https://api.github.com/repos/palantir/plottable/tags","blobs_url":"https://api.github.com/repos/palantir/plottable/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/palantir/plottable/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/palantir/plottable/git/refs{/sha}","trees_url":"https://api.github.com/repos/palantir/plottable/git/trees{/sha}","statuses_url":"https://api.github.com/repos/palantir/plottable/statuses/{sha}","languages_url":"https://api.github.com/repos/palantir/plottable/languages","stargazers_url":"https://api.github.com/repos/palantir/plottable/stargazers","contributors_url":"https://api.github.com/repos/palantir/plottable/contributors","subscribers_url":"https://api.github.com/repos/palantir/plottable/subscribers","subscription_url":"https://api.github.com/repos/palantir/plottable/subscription","commits_url":"https://api.github.com/repos/palantir/plottable/commits{/sha}","git_commits_url":"https://api.github.com/repos/palantir/plottable/git/commits{/sha}","comments_url":"https://api.github.com/repos/palantir/plottable/comments{/number}","issue_comment_url":"https://api.github.com/repos/palantir/plottable/issues/comments{/number}","contents_url":"https://api.github.com/repos/palantir/plottable/contents/{+path}","compare_url":"https://api.github.com/repos/palantir/plottable/compare/{base}...{head}","merges_url":"https://api.github.com/repos/palantir/plottable/merges","archive_url":"https://api.github.com/repos/palantir/plottable/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/palantir/plottable/downloads","issues_url":"https://api.github.com/repos/palantir/plottable/issues{/number}","pulls_url":"https://api.github.com/repos/palantir/plottable/pulls{/number}","milestones_url":"https://api.github.com/repos/palantir/plottable/milestones{/number}","notifications_url":"https://api.github.com/repos/palantir/plottable/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/palantir/plottable/labels{/name}","releases_url":"https://api.github.com/repos/palantir/plottable/releases{/id}","created_at":"2014-01-22T19:29:19Z","updated_at":"2015-11-13T12:09:51Z","pushed_at":"2015-11-13T23:17:17Z","git_url":"git://github.com/palantir/plottable.git","ssh_url":"git@github.com:palantir/plottable.git","clone_url":"https://github.com/palantir/plottable.git","svn_url":"https://github.com/palantir/plottable","homepage":"plottablejs.org","size":140678,"stargazers_count":794,"watchers_count":794,"language":"TypeScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":85,"mirror_url":null,"open_issues_count":232,"forks":85,"open_issues":232,"watchers":794,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/palantir/plottable/pulls/2893"},"html":{"href":"https://github.com/palantir/plottable/pull/2893"},"issue":{"href":"https://api.github.com/repos/palantir/plottable/issues/2893"},"comments":{"href":"https://api.github.com/repos/palantir/plottable/issues/2893/comments"},"review_comments":{"href":"https://api.github.com/repos/palantir/plottable/pulls/2893/comments"},"review_comment":{"href":"https://api.github.com/repos/palantir/plottable/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/palantir/plottable/pulls/2893/commits"},"statuses":{"href":"https://api.github.com/repos/palantir/plottable/statuses/227714592c624e30a439267385461b7b6b7e11c1"}}}}