{"action":"created","comment":{"url":"https://api.github.com/repos/palantir/plottable/pulls/comments/38028117","id":38028117,"diff_hunk":"@@ -1,134 +1,267 @@\n ///<reference path=\"../testReference.ts\" />\n \n describe(\"Scales\", () => {\n-  describe(\"Linear Scales\", () => {\n-    it(\"extentOfValues() filters out invalid numbers\", () => {\n-      let scale = new Plottable.Scales.Linear();\n-      let expectedExtent = [0, 1];\n-      let arrayWithBadValues: any[] = [null, NaN, undefined, Infinity, -Infinity, \"a string\", 0, 1];\n-      let extent = scale.extentOfValues(arrayWithBadValues);\n-      assert.deepEqual(extent, expectedExtent, \"invalid values were filtered out\");\n-    });\n+  describe(\"Linear Scale\", () => {\n \n-    it(\"autoDomain() defaults to [0, 1]\", () => {\n-      let scale = new Plottable.Scales.Linear();\n-      scale.autoDomain();\n-      let d = scale.domain();\n-      assert.strictEqual(d[0], 0);\n-      assert.strictEqual(d[1], 1);\n-    });\n+    describe(\"Basic usage\", () => {\n+      let scale: Plottable.Scales.Linear;\n \n-    it(\"autoDomain() expands single value to [value - 1, value + 1]\", () => {\n-      let scale = new Plottable.Scales.Linear();\n-      let singleValue = 15;\n-      scale.addIncludedValuesProvider((scale: Plottable.Scales.Linear) => [singleValue, singleValue]);\n-      assert.deepEqual(scale.domain(), [singleValue - 1, singleValue + 1], \"single-value extent was expanded\");\n-    });\n+      beforeEach(() => {\n+        scale = new Plottable.Scales.Linear();\n+      });\n \n-    it(\"domainMin()\", () => {\n-      let scale = new Plottable.Scales.Linear();\n-      scale.padProportion(0);\n-      let requestedDomain = [-5, 5];\n-      scale.addIncludedValuesProvider((scale: Plottable.Scales.Linear) => requestedDomain);\n-\n-      let minBelowBottom = -10;\n-      scale.domainMin(minBelowBottom);\n-      assert.deepEqual(scale.domain(), [minBelowBottom, requestedDomain[1]], \"lower end of domain was set by domainMin()\");\n-      assert.strictEqual(scale.domainMin(), minBelowBottom, \"returns the set minimum value\");\n-\n-      let minInMiddle = 0;\n-      scale.domainMin(minInMiddle);\n-      assert.deepEqual(scale.domain(), [minInMiddle, requestedDomain[1]], \"lower end was set even if requested value cuts off some data\");\n-\n-      scale.autoDomain();\n-      assert.deepEqual(scale.domain(), requestedDomain, \"calling autoDomain() overrides domainMin()\");\n-      assert.strictEqual(scale.domainMin(), scale.domain()[0], \"returns autoDomain()-ed min value after autoDomain()-ing\");\n-\n-      let minEqualTop = scale.domain()[1];\n-      scale.domainMin(minEqualTop);\n-      assert.deepEqual(scale.domain(), [minEqualTop, minEqualTop + 1],\n-        \"domain is set to [min, min + 1] if the requested value is >= to autoDomain()-ed max value\");\n-\n-      scale.domainMin(minInMiddle);\n-      let requestedDomain2 = [-10, 10];\n-      scale.addIncludedValuesProvider((scale: Plottable.Scales.Linear) => requestedDomain2);\n-      assert.deepEqual(scale.domain(), [minInMiddle, requestedDomain2[1]], \"adding another ExtentsProvider doesn't change domainMin()\");\n-    });\n+      it(\"can set domain and range\", () => {\n+        assert.deepEqual(scale.domain(), [0, 1], \"the domain defaults to [0, 1]\");\n+        assert.deepEqual(scale.range(), [0, 1], \"the range defaults to [0, 1]\");\n \n-    it(\"domainMax()\", () => {\n-      let scale = new Plottable.Scales.Linear();\n-      scale.padProportion(0);\n-      let requestedDomain = [-5, 5];\n-      scale.addIncludedValuesProvider((scale: Plottable.Scales.Linear) => requestedDomain);\n-\n-      let maxAboveTop = 10;\n-      scale.domainMax(maxAboveTop);\n-      assert.deepEqual(scale.domain(), [requestedDomain[0], maxAboveTop], \"upper end of domain was set by domainMax()\");\n-      assert.strictEqual(scale.domainMax(), maxAboveTop, \"returns the set maximum value\");\n-\n-      let maxInMiddle = 0;\n-      scale.domainMax(maxInMiddle);\n-      assert.deepEqual(scale.domain(), [requestedDomain[0], maxInMiddle], \"upper end was set even if requested value cuts off some data\");\n-\n-      scale.autoDomain();\n-      assert.deepEqual(scale.domain(), requestedDomain, \"calling autoDomain() overrides domainMax()\");\n-      assert.strictEqual(scale.domainMax(), scale.domain()[1], \"returns autoDomain()-ed max value after autoDomain()-ing\");\n-\n-      let maxEqualBottom = scale.domain()[0];\n-      scale.domainMax(maxEqualBottom);\n-      assert.deepEqual(scale.domain(), [maxEqualBottom - 1, maxEqualBottom],\n-        \"domain is set to [max - 1, max] if the requested value is <= to autoDomain()-ed min value\");\n-\n-      scale.domainMax(maxInMiddle);\n-      let requestedDomain2 = [-10, 10];\n-      scale.addIncludedValuesProvider((scale: Plottable.Scales.Linear) => requestedDomain2);\n-      assert.deepEqual(scale.domain(), [requestedDomain2[0], maxInMiddle], \"adding another ExtentsProvider doesn't change domainMax()\");\n-    });\n+        assert.strictEqual(scale.domain([5, 6]), scale, \"setting the domain returns the scale\");\n+        assert.strictEqual(scale.range([6, 7]), scale, \"setting the range returns the scale\");\n+\n+        assert.deepEqual(scale.domain(), [5, 6], \"the domain has been set\");\n+        assert.deepEqual(scale.range(), [6, 7], \"the range has been set\");\n+\n+        scale.domain([6, 5]);\n+        scale.range([7, 6]);\n+        assert.deepEqual(scale.domain(), [6, 5], \"the domain can be unordered\");\n+        assert.deepEqual(scale.range(), [7, 6], \"the range can be unordered\");\n+      });\n+\n+      it(\"maps domain to range in a linear fashion\", () => {\n+        scale.domain([10, 20]);\n+        scale.range([400, 500]);\n+        assert.strictEqual(scale.scale(10), 400, \"first value in domain maps to first value in range\");\n+        assert.strictEqual(scale.scale(20), 500, \"last value in domain maps to last value in range\");\n+        assert.strictEqual(scale.scale(15), 450, \"middle value in domain maps to middle value in range\");\n+\n+        assert.strictEqual(scale.invert(400), 10, \"first value in range maps to first value in domain\");\n+        assert.strictEqual(scale.invert(500), 20, \"last value in range maps to last value in domain\");\n+        assert.strictEqual(scale.invert(450), 15, \"middle value in range maps to middle value in domain\");\n+\n+        scale.domain([20, 10]);\n+        assert.strictEqual(scale.scale(10), 500, \"first value in flipped domain maps to first value in range\");\n+        assert.strictEqual(scale.scale(20), 400, \"last value in flipped domain maps to last value in range\");\n+        assert.strictEqual(scale.scale(15), 450, \"middle value in flipped domain maps to middle value in range\");\n+\n+        assert.strictEqual(scale.invert(400), 20, \"first value in range maps to first value in flipped domain\");\n+        assert.strictEqual(scale.invert(500), 10, \"last value in range maps to last value in flipped domain\");\n+        assert.strictEqual(scale.invert(450), 15, \"middle value in range maps to middle value in flipped domain\");\n+      });\n \n-    it(\"domainMin() and domainMax() together\", () => {\n-      let scale = new Plottable.Scales.Linear();\n-      scale.padProportion(0);\n-      let requestedDomain = [-5, 5];\n-      scale.addIncludedValuesProvider((scale: Plottable.Scales.Linear) => requestedDomain);\n-\n-      let desiredMin = -10;\n-      let desiredMax = 10;\n-      scale.domainMin(desiredMin);\n-      scale.domainMax(desiredMax);\n-      assert.deepEqual(scale.domain(), [desiredMin, desiredMax], \"setting domainMin() and domainMax() sets the domain\");\n-\n-      scale.autoDomain();\n-      let bigMin = 10;\n-      let smallMax = -10;\n-      scale.domainMin(bigMin);\n-      scale.domainMax(smallMax);\n-      assert.deepEqual(scale.domain(), [bigMin, smallMax], \"setting both is allowed even if it reverse the domain\");\n+      it(\"filters out invalid numbers when using extentOfValues()\", () => {\n+        let arrayWithBadValues: any[] = [null, NaN, undefined, Infinity, -Infinity, \"a string\", 1, 1.2];\n+        let expectedExtent = [1, 1.2];\n+        let extent = scale.extentOfValues(arrayWithBadValues);\n+        assert.deepEqual(extent, expectedExtent, \"invalid values were filtered out\");\n+      });\n+\n+      it(\"does not accept NaN or Infinity as domain\", () => {\n+        let warningCalled = false;\n+        let oldWarn = Plottable.Utils.Window.warn;\n+        Plottable.Utils.Window.warn = (msg: string) => {\n+          if (msg.indexOf(\"NaN or Infinity\") > -1) {\n+            warningCalled = true;\n+          }\n+        };\n+\n+        scale.domain([1, 2]);\n+        assert.deepEqual(scale.domain(), [1, 2], \"initial domain is set\");\n+\n+        warningCalled = false;\n+        scale.domain([5, Infinity]);\n+        assert.deepEqual(scale.domain(), [1, 2], \"Infinity containing domain was ignored\");\n+        assert.isTrue(warningCalled, \"a warning was thrown for setting domain to Infinity\");\n+\n+        warningCalled = false;\n+        scale.domain([-Infinity, 5]);\n+        assert.deepEqual(scale.domain(), [1, 2], \"-Infinity containing domain was ignored\");\n+        assert.isTrue(warningCalled, \"a warning was thrown for setting domain to -Infinity\");\n+\n+        warningCalled = false;\n+        scale.domain([NaN, 7]);\n+        assert.deepEqual(scale.domain(), [1, 2], \"NaN containing domain was ignored\");\n+        assert.isTrue(warningCalled, \"a warning was thrown for setting domain to NaN\");\n+\n+        warningCalled = false;\n+        scale.domain([-1, 5]);\n+        assert.deepEqual(scale.domain(), [-1, 5], \"Regular domains still accepted\");\n+        assert.isFalse(warningCalled, \"a warning is not thrown when correct domains are given\");\n+\n+        Plottable.Utils.Window.warn = oldWarn;\n+      });\n+\n+      it(\"accepts NaN or Infinity as range\", () => {\n+        scale.range([5, Infinity]);\n+        assert.deepEqual(scale.range(), [5, Infinity], \"Infinity accepted as part of range\");\n+        scale.range([-Infinity, 5]);\n+        assert.deepEqual(scale.range(), [-Infinity, 5], \"-Infinity accepted as part of range\");\n+        scale.range([NaN, 7]);\n+        assert.deepEqual(scale.range(), [NaN, 7], \"NaN accepted as part of range\");\n+      });\n+\n+      it(\"can receive custom tick generator\", () => {\n+        scale.domain([0, 10]);\n+        let defaultTicks = scale.ticks();\n+        assert.strictEqual(defaultTicks.length, 11, \"ticks were generated correctly with default generator\");\n+        scale.tickGenerator((scale) => scale.defaultTicks().filter(tick => tick % 3 === 0));\n+        let customTicks = scale.ticks();\n+        assert.deepEqual(customTicks, [0, 3, 6, 9], \"ticks were generated correctly with custom generator\");\n+      });\n     });\n \n-    it(\"domain can't include NaN or Infinity\", () => {\n-      let scale = new Plottable.Scales.Linear();\n-      scale.domain([0, 1]);\n-      scale.domain([5, Infinity]);\n-      assert.deepEqual(scale.domain(), [0, 1], \"Infinity containing domain was ignored\");\n-      scale.domain([5, -Infinity]);\n-      assert.deepEqual(scale.domain(), [0, 1], \"-Infinity containing domain was ignored\");\n-      scale.domain([NaN, 7]);\n-      assert.deepEqual(scale.domain(), [0, 1], \"NaN containing domain was ignored\");\n-      scale.domain([-1, 5]);\n-      assert.deepEqual(scale.domain(), [-1, 5], \"Regular domains still accepted\");\n+    describe(\"Auto Domaining\", () => {\n+      let scale: Plottable.Scales.Linear;\n+\n+      beforeEach(() => {\n+        scale = new Plottable.Scales.Linear();\n+      });\n+\n+      it(\"auto domains by default\", () => {\n+        assert.deepEqual(scale.domain(), [0, 1], \"the default domain is [0, 1]\");\n+\n+        scale.autoDomain();\n+        assert.deepEqual(scale.domain(), [0, 1], \"the domain is still [0, 1]\");\n+      });\n+\n+      it(\"modififes the autodomain flag accordingly\", () => {\n+        scale.addIncludedValuesProvider((scale) => [0, 5]);\n+        assert.isTrue((<any> scale)._autoDomainAutomatically,","path":"test/scales/linearScaleTests.ts","position":235,"original_position":235,"commit_id":"9cf3b14bb609ff852b9a99b04cb15bbb02764e0a","original_commit_id":"9cf3b14bb609ff852b9a99b04cb15bbb02764e0a","user":{"login":"jtlan","id":1440449,"avatar_url":"https://avatars.githubusercontent.com/u/1440449?v=3","gravatar_id":"","url":"https://api.github.com/users/jtlan","html_url":"https://github.com/jtlan","followers_url":"https://api.github.com/users/jtlan/followers","following_url":"https://api.github.com/users/jtlan/following{/other_user}","gists_url":"https://api.github.com/users/jtlan/gists{/gist_id}","starred_url":"https://api.github.com/users/jtlan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jtlan/subscriptions","organizations_url":"https://api.github.com/users/jtlan/orgs","repos_url":"https://api.github.com/users/jtlan/repos","events_url":"https://api.github.com/users/jtlan/events{/privacy}","received_events_url":"https://api.github.com/users/jtlan/received_events","type":"User","site_admin":false},"body":"I'm not really comfortable with `<any>`-casting in to check a flag, since really we want to check that the behavior is correct, but that flag's state isn't a guarantee of that. Can we create a test that adds/removes `IncludedValueProvider`s when the scale is in either mode, and uses that to infer if the autodomaining is working correctly?\r\n\r\nAn analogous case is the value/pixel mode on `GuideLineLayer`, which is tested via behavior instead of checking the flag.","created_at":"2015-08-26T20:04:14Z","updated_at":"2015-08-26T20:04:14Z","html_url":"https://github.com/palantir/plottable/pull/2679#discussion_r38028117","pull_request_url":"https://api.github.com/repos/palantir/plottable/pulls/2679","_links":{"self":{"href":"https://api.github.com/repos/palantir/plottable/pulls/comments/38028117"},"html":{"href":"https://github.com/palantir/plottable/pull/2679#discussion_r38028117"},"pull_request":{"href":"https://api.github.com/repos/palantir/plottable/pulls/2679"}}},"pull_request":{"url":"https://api.github.com/repos/palantir/plottable/pulls/2679","id":43438268,"html_url":"https://github.com/palantir/plottable/pull/2679","diff_url":"https://github.com/palantir/plottable/pull/2679.diff","patch_url":"https://github.com/palantir/plottable/pull/2679.patch","issue_url":"https://api.github.com/repos/palantir/plottable/issues/2679","number":2679,"state":"open","locked":false,"title":"Refactor linear scale tests - Pass 1","user":{"login":"aicioara","id":3248682,"avatar_url":"https://avatars.githubusercontent.com/u/3248682?v=3","gravatar_id":"","url":"https://api.github.com/users/aicioara","html_url":"https://github.com/aicioara","followers_url":"https://api.github.com/users/aicioara/followers","following_url":"https://api.github.com/users/aicioara/following{/other_user}","gists_url":"https://api.github.com/users/aicioara/gists{/gist_id}","starred_url":"https://api.github.com/users/aicioara/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aicioara/subscriptions","organizations_url":"https://api.github.com/users/aicioara/orgs","repos_url":"https://api.github.com/users/aicioara/repos","events_url":"https://api.github.com/users/aicioara/events{/privacy}","received_events_url":"https://api.github.com/users/aicioara/received_events","type":"User","site_admin":false},"body":"Part of #2640 \r\n\r\nI will be doing 2 passes because I will get more context (and better sense of best practices) by refactoring other files. However, please flag anything that seems unusual.\r\n\r\nAs part of this: \r\n- **Test semantics: hierarchy, naming, testing, but no coverage check**\r\n- Applied best practices from the wiki page\r\n- Factored out common code into `beforeEach()` clauses\r\n- No nested `beforeEach()`es\r\n- Removed annoying console warnings\r\n- Remade hierarchy as shown bellow\r\n![screen shot 2015-08-26 at 11 56 41 am](https://cloud.githubusercontent.com/assets/3248682/9503041/8cd3f20e-4be9-11e5-9332-2e1e1a35d476.png)\r\n","created_at":"2015-08-26T18:57:07Z","updated_at":"2015-08-26T20:04:14Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e1c2cb1e264a7228b1bcbf28145646bf5d3b3c9a","assignee":{"login":"jtlan","id":1440449,"avatar_url":"https://avatars.githubusercontent.com/u/1440449?v=3","gravatar_id":"","url":"https://api.github.com/users/jtlan","html_url":"https://github.com/jtlan","followers_url":"https://api.github.com/users/jtlan/followers","following_url":"https://api.github.com/users/jtlan/following{/other_user}","gists_url":"https://api.github.com/users/jtlan/gists{/gist_id}","starred_url":"https://api.github.com/users/jtlan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jtlan/subscriptions","organizations_url":"https://api.github.com/users/jtlan/orgs","repos_url":"https://api.github.com/users/jtlan/repos","events_url":"https://api.github.com/users/jtlan/events{/privacy}","received_events_url":"https://api.github.com/users/jtlan/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/palantir/plottable/pulls/2679/commits","review_comments_url":"https://api.github.com/repos/palantir/plottable/pulls/2679/comments","review_comment_url":"https://api.github.com/repos/palantir/plottable/pulls/comments{/number}","comments_url":"https://api.github.com/repos/palantir/plottable/issues/2679/comments","statuses_url":"https://api.github.com/repos/palantir/plottable/statuses/9cf3b14bb609ff852b9a99b04cb15bbb02764e0a","head":{"label":"palantir:refactorLinearScale","ref":"refactorLinearScale","sha":"9cf3b14bb609ff852b9a99b04cb15bbb02764e0a","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-08-26T18:34:52Z","pushed_at":"2015-08-26T19:45:54Z","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":133250,"stargazers_count":681,"watchers_count":681,"language":"TypeScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":69,"mirror_url":null,"open_issues_count":176,"forks":69,"open_issues":176,"watchers":681,"default_branch":"develop"}},"base":{"label":"palantir:develop","ref":"develop","sha":"73548ede82c89457bf55bd4702d5ce5dcfaf317e","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-08-26T18:34:52Z","pushed_at":"2015-08-26T19:45:54Z","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":133250,"stargazers_count":681,"watchers_count":681,"language":"TypeScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":69,"mirror_url":null,"open_issues_count":176,"forks":69,"open_issues":176,"watchers":681,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/palantir/plottable/pulls/2679"},"html":{"href":"https://github.com/palantir/plottable/pull/2679"},"issue":{"href":"https://api.github.com/repos/palantir/plottable/issues/2679"},"comments":{"href":"https://api.github.com/repos/palantir/plottable/issues/2679/comments"},"review_comments":{"href":"https://api.github.com/repos/palantir/plottable/pulls/2679/comments"},"review_comment":{"href":"https://api.github.com/repos/palantir/plottable/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/palantir/plottable/pulls/2679/commits"},"statuses":{"href":"https://api.github.com/repos/palantir/plottable/statuses/9cf3b14bb609ff852b9a99b04cb15bbb02764e0a"}}}}