{"action":"created","comment":{"url":"https://api.github.com/repos/plotly/plotly.js/pulls/comments/80078874","id":80078874,"diff_hunk":"@@ -0,0 +1,523 @@\n+var Plotly = require('@lib/index');\n+var Lib = require('@src/lib');\n+\n+var createGraphDiv = require('../assets/create_graph_div');\n+var destroyGraphDiv = require('../assets/destroy_graph_div');\n+var assertDims = require('../assets/assert_dims');\n+var assertStyle = require('../assets/assert_style');\n+\n+Plotly.register([\n+    require('@src/transforms/groupby')\n+]);\n+\n+describe('groupby', function() {\n+\n+    describe('one-to-many transforms:', function() {\n+        'use strict';\n+\n+        var mockData0 = [{\n+            mode: 'markers',\n+            x: [1, -1, -2, 0, 1, 2, 3],\n+            y: [1, 2, 3, 1, 2, 3, 1],\n+            transforms: [{\n+                type: 'groupby',\n+                groups: ['a', 'a', 'b', 'a', 'b', 'b', 'a'],\n+                style: { a: {marker: {color: 'red'}}, b: {marker: {color: 'blue'}} }\n+            }]\n+        }];\n+\n+        var mockData1 = [Lib.extendDeep({}, mockData0[0]), {\n+            mode: 'markers',\n+            x: [20, 11, 12, 0, 1, 2, 3],\n+            y: [1, 2, 3, 2, 5, 2, 0],\n+            transforms: [{\n+                type: 'groupby',\n+                groups: ['b', 'a', 'b', 'b', 'b', 'a', 'a'],\n+                style: { a: {marker: {color: 'green'}}, b: {marker: {color: 'black'}} }\n+            }]\n+        }];\n+\n+        afterEach(destroyGraphDiv);\n+\n+        it('Plotly.plot should plot the transform traces', function(done) {\n+            var data = Lib.extendDeep([], mockData0);\n+\n+            var gd = createGraphDiv();\n+\n+            Plotly.plot(gd, data).then(function() {\n+                expect(gd.data.length).toEqual(1);\n+                expect(gd.data[0].x).toEqual([1, -1, -2, 0, 1, 2, 3]);\n+                expect(gd.data[0].y).toEqual([1, 2, 3, 1, 2, 3, 1]);\n+\n+                expect(gd._fullData.length).toEqual(2);\n+                expect(gd._fullData[0].x).toEqual([1, -1, 0, 3]);\n+                expect(gd._fullData[0].y).toEqual([1, 2, 1, 1]);\n+                expect(gd._fullData[1].x).toEqual([-2, 1, 2]);\n+                expect(gd._fullData[1].y).toEqual([3, 2, 3]);\n+\n+                assertDims([4, 3]);\n+\n+                done();\n+            });\n+        });\n+\n+        it('Plotly.restyle should work', function(done) {\n+            var data = Lib.extendDeep([], mockData0);\n+            data[0].marker = { size: 20 };\n+\n+            var gd = createGraphDiv();\n+            var dims = [4, 3];\n+\n+            Plotly.plot(gd, data).then(function() {\n+                assertStyle(dims,\n+                    ['rgb(255, 0, 0)', 'rgb(0, 0, 255)'],\n+                    [1, 1]\n+                );\n+\n+                return Plotly.restyle(gd, 'marker.opacity', 0.4);\n+            }).then(function() {\n+                assertStyle(dims,\n+                    ['rgb(255, 0, 0)', 'rgb(0, 0, 255)'],\n+                    [0.4, 0.4]\n+                );\n+\n+                expect(gd._fullData[0].marker.opacity).toEqual(0.4);\n+                expect(gd._fullData[1].marker.opacity).toEqual(0.4);\n+\n+                return Plotly.restyle(gd, 'marker.opacity', 1);\n+            }).then(function() {\n+                assertStyle(dims,\n+                    ['rgb(255, 0, 0)', 'rgb(0, 0, 255)'],\n+                    [1, 1]\n+                );\n+\n+                expect(gd._fullData[0].marker.opacity).toEqual(1);\n+                expect(gd._fullData[1].marker.opacity).toEqual(1);\n+\n+                return Plotly.restyle(gd, {\n+                    'transforms[0].style': { a: {marker: {color: 'green'}}, b: {marker: {color: 'red'}} },\n+                    'marker.opacity': 0.4\n+                });\n+            }).then(function() {\n+                assertStyle(dims,\n+                    ['rgb(0, 128, 0)', 'rgb(255, 0, 0)'],\n+                    [0.4, 0.4]\n+                );\n+\n+                done();\n+            });\n+        });\n+\n+        it('Plotly.extendTraces should work', function(done) {\n+            var data = Lib.extendDeep([], mockData0);\n+\n+            var gd = createGraphDiv();\n+\n+            Plotly.plot(gd, data).then(function() {\n+                expect(gd.data[0].x.length).toEqual(7);\n+                expect(gd._fullData[0].x.length).toEqual(4);\n+                expect(gd._fullData[1].x.length).toEqual(3);\n+\n+                assertDims([4, 3]);\n+\n+                return Plotly.extendTraces(gd, {\n+                    x: [ [-3, 4, 5] ],\n+                    y: [ [1, -2, 3] ],\n+                    'transforms[0].groups': [ ['b', 'a', 'b'] ]\n+                }, [0]);\n+            }).then(function() {\n+                expect(gd.data[0].x.length).toEqual(10);\n+                expect(gd._fullData[0].x.length).toEqual(5);\n+                expect(gd._fullData[1].x.length).toEqual(5);\n+\n+                assertDims([5, 5]);\n+\n+                done();\n+            });\n+        });\n+\n+        it('Plotly.deleteTraces should work', function(done) {\n+            var data = Lib.extendDeep([], mockData1);\n+\n+            var gd = createGraphDiv();\n+\n+            Plotly.plot(gd, data).then(function() {\n+                assertDims([4, 3, 4, 3]);\n+\n+                return Plotly.deleteTraces(gd, [1]);\n+            }).then(function() {\n+                assertDims([4, 3]);\n+\n+                return Plotly.deleteTraces(gd, [0]);\n+            }).then(function() {\n+                assertDims([]);\n+\n+                done();\n+            });\n+        });\n+\n+        it('toggling trace visibility should work', function(done) {\n+            var data = Lib.extendDeep([], mockData1);\n+\n+            var gd = createGraphDiv();\n+\n+            Plotly.plot(gd, data).then(function() {\n+                assertDims([4, 3, 4, 3]);\n+\n+                return Plotly.restyle(gd, 'visible', 'legendonly', [1]);\n+            }).then(function() {\n+                assertDims([4, 3]);\n+\n+                return Plotly.restyle(gd, 'visible', false, [0]);\n+            }).then(function() {\n+                assertDims([]);\n+\n+                return Plotly.restyle(gd, 'visible', [true, true], [0, 1]);\n+            }).then(function() {\n+                assertDims([4, 3, 4, 3]);\n+\n+                done();\n+            });\n+        });\n+\n+    });\n+\n+    // these tests can be shortened, once the meaning of edge cases gets clarified\n+    describe('symmetry/degeneracy testing of one-to-many transforms on arbitrary arrays where there is no grouping (implicit 1):', function() {\n+        'use strict';\n+\n+        var mockData = [{\n+            mode: 'markers',\n+            x: [1, -1, -2, 0, 1, 2, 3],\n+            y: [1, 2, 3, 1, 2, 3, 1],\n+\n+            // everything is present:\n+            transforms: [{\n+                type: 'groupby',\n+                groups: ['a', 'a', 'b', 'a', 'b', 'b', 'a'],\n+                style: { a: {marker: {color: 'red'}}, b: {marker: {color: 'blue'}} }\n+            }]\n+        }];\n+\n+        var mockData0 = [{\n+            mode: 'markers',\n+            x: [1, -1, -2, 0, 1, 2, 3],\n+            y: [1, 2, 3, 1, 2, 3, 1],\n+\n+            // groups, styles not present\n+            transforms: [{\n+                type: 'groupby'\n+                // groups not present\n+                // styles not present\n+            }]\n+        }];\n+\n+        // transform attribute with empty list\n+        var mockData1 = [{\n+            mode: 'markers',\n+            x: [1, -1, -2, 0, 1, 2, 3],\n+            y: [1, 2, 3, 1, 2, 3, 1],\n+\n+            // transforms is present but there are no items in it\n+            transforms: [ /* list is empty */ ]\n+        }];\n+\n+        // transform attribute with null value\n+        var mockData2 = [{\n+            mode: 'markers',\n+            x: [1, -1, -2, 0, 1, 2, 3],\n+            y: [1, 2, 3, 1, 2, 3, 1],\n+            transforms: null\n+        }];\n+\n+        // no transform is present at all\n+        var mockData3 = [{\n+            mode: 'markers',\n+            x: [1, -1, -2, 0, 1, 2, 3],\n+            y: [1, 2, 3, 1, 2, 3, 1]\n+        }];\n+\n+        afterEach(destroyGraphDiv);\n+\n+        it('Plotly.plot should plot the transform traces', function(done) {\n+            var data = Lib.extendDeep([], mockData);\n+\n+            var gd = createGraphDiv();\n+\n+            Plotly.plot(gd, data).then(function() {\n+                expect(gd.data.length).toEqual(1);\n+                expect(gd.data[0].x).toEqual([1, -1, -2, 0, 1, 2, 3]);\n+                expect(gd.data[0].y).toEqual([1, 2, 3, 1, 2, 3, 1]);\n+\n+                expect(gd._fullData.length).toEqual(2); // two groups\n+                expect(gd._fullData[0].x).toEqual([1, -1, 0, 3]);\n+                expect(gd._fullData[0].y).toEqual([1, 2, 1, 1]);\n+                expect(gd._fullData[1].x).toEqual([-2, 1, 2]);\n+                expect(gd._fullData[1].y).toEqual([3, 2, 3]);\n+\n+                assertDims([4, 3]);\n+\n+                done();\n+            });\n+        });\n+\n+        // passes; maybe not for the good reasons (see fixme comments)\n+        it('Plotly.plot should plot the transform traces', function(done) {\n+            var data = Lib.extendDeep([], mockData0);\n+\n+            var gd = createGraphDiv();\n+\n+            Plotly.plot(gd, data).then(function() {\n+                expect(gd.data.length).toEqual(1);\n+                expect(gd.data[0].x).toEqual([1, -1, -2, 0, 1, 2, 3]);\n+                expect(gd.data[0].y).toEqual([1, 2, 3, 1, 2, 3, 1]);\n+\n+                expect(gd._fullData.length).toEqual(0); // fixme: it passes with 0; shouldn't it be 1? (one implied group)\n+\n+                /* since the array is of zero length, the below items are obv. meaningless to test\n+                 expect(gd._fullData[0].x).toEqual([1, -1, -2, 0, 1, 2, 3]);\n+                 expect(gd._fullData[0].y).toEqual([1, 2, 3, 1, 2, 3, 1]);\n+                 */\n+\n+                assertDims([]); // fixme: same thing, looks like zero dimensionality\n+\n+                done();\n+            });\n+        });\n+\n+        // passes; looks OK\n+        it('Plotly.plot should plot the transform traces', function(done) {\n+            var data = Lib.extendDeep([], mockData1);\n+\n+            var gd = createGraphDiv();\n+\n+            Plotly.plot(gd, data).then(function() {\n+                expect(gd.data.length).toEqual(1);\n+                expect(gd.data[0].x).toEqual([1, -1, -2, 0, 1, 2, 3]);\n+                expect(gd.data[0].y).toEqual([1, 2, 3, 1, 2, 3, 1]);\n+\n+                expect(gd._fullData.length).toEqual(1); // fixme not: good, okay it's 1 here (one implied group / thing)\n+                expect(gd._fullData[0].x).toEqual([ 1, -1, -2, 0, 1, 2, 3 ]);\n+                expect(gd._fullData[0].y).toEqual([1, 2, 3, 1, 2, 3, 1]);\n+\n+                assertDims([7]);\n+\n+                done();\n+            });\n+        });\n+\n+        // passes OK; see todo comments\n+        it('Plotly.plot should plot the transform traces', function(done) {\n+            var data = Lib.extendDeep([], mockData2);\n+\n+            var gd = createGraphDiv();\n+\n+            Plotly.plot(gd, data).then(function() {\n+                expect(gd.data.length).toEqual(1);\n+                expect(gd.data[0].x).toEqual([1, -1, -2, 0, 1, 2, 3]);\n+                expect(gd.data[0].y).toEqual([1, 2, 3, 1, 2, 3, 1]);\n+\n+                expect(gd._fullData.length).toEqual(1); // todo: confirm this result is OK\n+\n+                expect(gd._fullData[0].x).toEqual([1, -1, -2, 0, 1, 2, 3]);\n+                expect(gd._fullData[0].y).toEqual([1, 2, 3, 1, 2, 3, 1]);\n+\n+                assertDims([7]); // todo: confirm this result is OK\n+\n+                done();\n+            });\n+        });\n+\n+        // passes OK; see todo comments\n+        it('Plotly.plot should plot the transform traces', function(done) {\n+            var data = Lib.extendDeep([], mockData3);\n+\n+            var gd = createGraphDiv();\n+\n+            Plotly.plot(gd, data).then(function() {\n+                expect(gd.data.length).toEqual(1);\n+                expect(gd.data[0].x).toEqual([1, -1, -2, 0, 1, 2, 3]);\n+                expect(gd.data[0].y).toEqual([1, 2, 3, 1, 2, 3, 1]);\n+\n+                expect(gd._fullData.length).toEqual(1); // todo: confirm this result is OK\n+\n+                expect(gd._fullData[0].x).toEqual([1, -1, -2, 0, 1, 2, 3]);\n+                expect(gd._fullData[0].y).toEqual([1, 2, 3, 1, 2, 3, 1]);\n+\n+                assertDims([7]); // todo: confirm this result is OK\n+\n+                done();\n+            });\n+        });\n+    });\n+\n+    describe('grouping with basic, heterogenous and overridden attributes', function() {\n+        'use strict';\n+\n+        afterEach(destroyGraphDiv);\n+\n+        function test(mockData) {\n+\n+            return function(done) {\n+                var data = Lib.extendDeep([], mockData);\n+\n+                var gd = createGraphDiv();\n+\n+                Plotly.plot(gd, data).then(function() {\n+\n+                    expect(gd.data.length).toEqual(1);\n+                    expect(gd.data[0].ids).toEqual(['q', 'w', 'r', 't', 'y', 'u', 'i']);\n+                    expect(gd.data[0].x).toEqual([1, -1, -2, 0, 1, 2, 3]);\n+                    expect(gd.data[0].y).toEqual([0, 1, 2, 3, 5, 4, 6]);\n+                    expect(gd.data[0].marker.line.width).toEqual([4, 2, 4, 2, 2, 3, 3]);\n+\n+                    expect(gd._fullData.length).toEqual(2);\n+\n+                    expect(gd._fullData[0].ids).toEqual(['q', 'w', 't', 'i']);\n+                    expect(gd._fullData[0].x).toEqual([1, -1, 0, 3]);\n+                    expect(gd._fullData[0].y).toEqual([0, 1, 3, 6]);\n+                    expect(gd._fullData[0].marker.line.width).toEqual([4, 2, 2, 3]);\n+\n+                    expect(gd._fullData[1].ids).toEqual(['r', 'y', 'u']);\n+                    expect(gd._fullData[1].x).toEqual([-2, 1, 2]);\n+                    expect(gd._fullData[1].y).toEqual([2, 5, 4]);\n+                    expect(gd._fullData[1].marker.line.width).toEqual([4, 2, 3]);\n+\n+                    assertDims([4, 3]);\n+\n+                    done();\n+                });\n+            };\n+        }\n+\n+        // basic test\n+        var mockData1 = [{\n+            mode: 'markers',\n+            ids: ['q', 'w', 'r', 't', 'y', 'u', 'i'],\n+            x: [1, -1, -2, 0, 1, 2, 3],\n+            y: [0, 1, 2, 3, 5, 4, 6],\n+            marker: {line: {width: [4, 2, 4, 2, 2, 3, 3]}},\n+            transforms: [{\n+                type: 'groupby',\n+                groups: ['a', 'a', 'b', 'a', 'b', 'b', 'a'],\n+                style: { a: {marker: {color: 'red'}}, b: {marker: {color: 'blue'}} }\n+            }]\n+        }];\n+\n+        // heterogenously present attributes\n+        var mockData2 = [{\n+            mode: 'markers',\n+            ids: ['q', 'w', 'r', 't', 'y', 'u', 'i'],\n+            x: [1, -1, -2, 0, 1, 2, 3],\n+            y: [0, 1, 2, 3, 5, 4, 6],\n+            marker: {line: {width: [4, 2, 4, 2, 2, 3, 3]}},\n+            transforms: [{\n+                type: 'groupby',\n+                groups: ['a', 'a', 'b', 'a', 'b', 'b', 'a'],\n+                style: {\n+                    a: {\n+                        marker: {\n+                            color: 'orange',\n+                            size: 20,\n+                            line: {\n+                                color: 'red'\n+                            }\n+                        }\n+                    },\n+                    b: {\n+                        mode: 'markers+lines', // heterogeonos attributes are OK: group 'a' doesn't need to define this\n+                        marker: {\n+                            color: 'cyan',\n+                            size: 15,\n+                            line: {\n+                                color: 'purple'\n+                            },\n+                            opacity: 0.5,\n+                            symbol: 'triangle-up'\n+                        },\n+                        line: {\n+                            color: 'purple'\n+                        }\n+                    }\n+                }\n+            }]\n+        }];\n+\n+        // attributes set at top level and partially overridden in the group item level\n+        var mockData3 = [{\n+            mode: 'markers+lines',\n+            ids: ['q', 'w', 'r', 't', 'y', 'u', 'i'],\n+            x: [1, -1, -2, 0, 1, 2, 3],\n+            y: [0, 1, 2, 3, 5, 4, 6],\n+            marker: {\n+                color: 'darkred', // general 'default' color\n+                line: {\n+                    width: [4, 2, 4, 2, 2, 3, 3],\n+                    // a general, not overridden array will be interpreted per group\n+                    color: ['orange', 'red', 'green', 'cyan']","path":"test/jasmine/tests/transform_groupby_test.js","position":457,"original_position":457,"commit_id":"392844d74861cef1cc3fbb0436f88391b68fc86c","original_commit_id":"392844d74861cef1cc3fbb0436f88391b68fc86c","user":{"login":"etpinard","id":6675409,"avatar_url":"https://avatars.githubusercontent.com/u/6675409?v=3","gravatar_id":"","url":"https://api.github.com/users/etpinard","html_url":"https://github.com/etpinard","followers_url":"https://api.github.com/users/etpinard/followers","following_url":"https://api.github.com/users/etpinard/following{/other_user}","gists_url":"https://api.github.com/users/etpinard/gists{/gist_id}","starred_url":"https://api.github.com/users/etpinard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/etpinard/subscriptions","organizations_url":"https://api.github.com/users/etpinard/orgs","repos_url":"https://api.github.com/users/etpinard/repos","events_url":"https://api.github.com/users/etpinard/events{/privacy}","received_events_url":"https://api.github.com/users/etpinard/received_events","type":"User","site_admin":false},"body":"so what's the output here?","created_at":"2016-09-22T16:16:31Z","updated_at":"2016-09-22T16:16:31Z","html_url":"https://github.com/plotly/plotly.js/pull/936#discussion_r80078874","pull_request_url":"https://api.github.com/repos/plotly/plotly.js/pulls/936","_links":{"self":{"href":"https://api.github.com/repos/plotly/plotly.js/pulls/comments/80078874"},"html":{"href":"https://github.com/plotly/plotly.js/pull/936#discussion_r80078874"},"pull_request":{"href":"https://api.github.com/repos/plotly/plotly.js/pulls/936"}}},"pull_request":{"url":"https://api.github.com/repos/plotly/plotly.js/pulls/936","id":85184841,"html_url":"https://github.com/plotly/plotly.js/pull/936","diff_url":"https://github.com/plotly/plotly.js/pull/936.diff","patch_url":"https://github.com/plotly/plotly.js/pull/936.patch","issue_url":"https://api.github.com/repos/plotly/plotly.js/issues/936","number":936,"state":"open","locked":false,"title":"[WIP] Transforms [rebase of timelyportfolio's work]","user":{"login":"monfera","id":1548516,"avatar_url":"https://avatars.githubusercontent.com/u/1548516?v=3","gravatar_id":"","url":"https://api.github.com/users/monfera","html_url":"https://github.com/monfera","followers_url":"https://api.github.com/users/monfera/followers","following_url":"https://api.github.com/users/monfera/following{/other_user}","gists_url":"https://api.github.com/users/monfera/gists{/gist_id}","starred_url":"https://api.github.com/users/monfera/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/monfera/subscriptions","organizations_url":"https://api.github.com/users/monfera/orgs","repos_url":"https://api.github.com/users/monfera/repos","events_url":"https://api.github.com/users/monfera/events{/privacy}","received_events_url":"https://api.github.com/users/monfera/received_events","type":"User","site_admin":false},"body":"Rebase and lint of @timelyportfolio's PR https://github.com/plotly/plotly.js/pull/859\r\nIssue https://github.com/plotly/plotly.js/issues/917","created_at":"2016-09-14T08:20:48Z","updated_at":"2016-09-22T16:16:31Z","closed_at":null,"merged_at":null,"merge_commit_sha":"85e59f3979fa83a82e52333c8835d5d80150efa7","assignee":null,"assignees":[],"milestone":{"url":"https://api.github.com/repos/plotly/plotly.js/milestones/11","html_url":"https://github.com/plotly/plotly.js/milestones/v1.18.0","labels_url":"https://api.github.com/repos/plotly/plotly.js/milestones/11/labels","id":1991895,"number":11,"title":"v1.18.0","description":"","creator":{"login":"etpinard","id":6675409,"avatar_url":"https://avatars.githubusercontent.com/u/6675409?v=3","gravatar_id":"","url":"https://api.github.com/users/etpinard","html_url":"https://github.com/etpinard","followers_url":"https://api.github.com/users/etpinard/followers","following_url":"https://api.github.com/users/etpinard/following{/other_user}","gists_url":"https://api.github.com/users/etpinard/gists{/gist_id}","starred_url":"https://api.github.com/users/etpinard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/etpinard/subscriptions","organizations_url":"https://api.github.com/users/etpinard/orgs","repos_url":"https://api.github.com/users/etpinard/repos","events_url":"https://api.github.com/users/etpinard/events{/privacy}","received_events_url":"https://api.github.com/users/etpinard/received_events","type":"User","site_admin":false},"open_issues":6,"closed_issues":1,"state":"open","created_at":"2016-09-08T19:27:12Z","updated_at":"2016-09-21T22:42:23Z","due_on":"2016-10-04T00:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/plotly/plotly.js/pulls/936/commits","review_comments_url":"https://api.github.com/repos/plotly/plotly.js/pulls/936/comments","review_comment_url":"https://api.github.com/repos/plotly/plotly.js/pulls/comments{/number}","comments_url":"https://api.github.com/repos/plotly/plotly.js/issues/936/comments","statuses_url":"https://api.github.com/repos/plotly/plotly.js/statuses/392844d74861cef1cc3fbb0436f88391b68fc86c","head":{"label":"monfera:transforms","ref":"transforms","sha":"392844d74861cef1cc3fbb0436f88391b68fc86c","user":{"login":"monfera","id":1548516,"avatar_url":"https://avatars.githubusercontent.com/u/1548516?v=3","gravatar_id":"","url":"https://api.github.com/users/monfera","html_url":"https://github.com/monfera","followers_url":"https://api.github.com/users/monfera/followers","following_url":"https://api.github.com/users/monfera/following{/other_user}","gists_url":"https://api.github.com/users/monfera/gists{/gist_id}","starred_url":"https://api.github.com/users/monfera/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/monfera/subscriptions","organizations_url":"https://api.github.com/users/monfera/orgs","repos_url":"https://api.github.com/users/monfera/repos","events_url":"https://api.github.com/users/monfera/events{/privacy}","received_events_url":"https://api.github.com/users/monfera/received_events","type":"User","site_admin":false},"repo":{"id":54498444,"name":"plotly.js","full_name":"monfera/plotly.js","owner":{"login":"monfera","id":1548516,"avatar_url":"https://avatars.githubusercontent.com/u/1548516?v=3","gravatar_id":"","url":"https://api.github.com/users/monfera","html_url":"https://github.com/monfera","followers_url":"https://api.github.com/users/monfera/followers","following_url":"https://api.github.com/users/monfera/following{/other_user}","gists_url":"https://api.github.com/users/monfera/gists{/gist_id}","starred_url":"https://api.github.com/users/monfera/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/monfera/subscriptions","organizations_url":"https://api.github.com/users/monfera/orgs","repos_url":"https://api.github.com/users/monfera/repos","events_url":"https://api.github.com/users/monfera/events{/privacy}","received_events_url":"https://api.github.com/users/monfera/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/monfera/plotly.js","description":"The open source javascript graphing library that powers plotly","fork":true,"url":"https://api.github.com/repos/monfera/plotly.js","forks_url":"https://api.github.com/repos/monfera/plotly.js/forks","keys_url":"https://api.github.com/repos/monfera/plotly.js/keys{/key_id}","collaborators_url":"https://api.github.com/repos/monfera/plotly.js/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/monfera/plotly.js/teams","hooks_url":"https://api.github.com/repos/monfera/plotly.js/hooks","issue_events_url":"https://api.github.com/repos/monfera/plotly.js/issues/events{/number}","events_url":"https://api.github.com/repos/monfera/plotly.js/events","assignees_url":"https://api.github.com/repos/monfera/plotly.js/assignees{/user}","branches_url":"https://api.github.com/repos/monfera/plotly.js/branches{/branch}","tags_url":"https://api.github.com/repos/monfera/plotly.js/tags","blobs_url":"https://api.github.com/repos/monfera/plotly.js/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/monfera/plotly.js/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/monfera/plotly.js/git/refs{/sha}","trees_url":"https://api.github.com/repos/monfera/plotly.js/git/trees{/sha}","statuses_url":"https://api.github.com/repos/monfera/plotly.js/statuses/{sha}","languages_url":"https://api.github.com/repos/monfera/plotly.js/languages","stargazers_url":"https://api.github.com/repos/monfera/plotly.js/stargazers","contributors_url":"https://api.github.com/repos/monfera/plotly.js/contributors","subscribers_url":"https://api.github.com/repos/monfera/plotly.js/subscribers","subscription_url":"https://api.github.com/repos/monfera/plotly.js/subscription","commits_url":"https://api.github.com/repos/monfera/plotly.js/commits{/sha}","git_commits_url":"https://api.github.com/repos/monfera/plotly.js/git/commits{/sha}","comments_url":"https://api.github.com/repos/monfera/plotly.js/comments{/number}","issue_comment_url":"https://api.github.com/repos/monfera/plotly.js/issues/comments{/number}","contents_url":"https://api.github.com/repos/monfera/plotly.js/contents/{+path}","compare_url":"https://api.github.com/repos/monfera/plotly.js/compare/{base}...{head}","merges_url":"https://api.github.com/repos/monfera/plotly.js/merges","archive_url":"https://api.github.com/repos/monfera/plotly.js/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/monfera/plotly.js/downloads","issues_url":"https://api.github.com/repos/monfera/plotly.js/issues{/number}","pulls_url":"https://api.github.com/repos/monfera/plotly.js/pulls{/number}","milestones_url":"https://api.github.com/repos/monfera/plotly.js/milestones{/number}","notifications_url":"https://api.github.com/repos/monfera/plotly.js/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/monfera/plotly.js/labels{/name}","releases_url":"https://api.github.com/repos/monfera/plotly.js/releases{/id}","deployments_url":"https://api.github.com/repos/monfera/plotly.js/deployments","created_at":"2016-03-22T18:16:35Z","updated_at":"2016-03-22T18:16:38Z","pushed_at":"2016-09-22T14:52:45Z","git_url":"git://github.com/monfera/plotly.js.git","ssh_url":"git@github.com:monfera/plotly.js.git","clone_url":"https://github.com/monfera/plotly.js.git","svn_url":"https://github.com/monfera/plotly.js","homepage":"https://plot.ly/javascript/","size":131999,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":2,"forks":0,"open_issues":2,"watchers":0,"default_branch":"master"}},"base":{"label":"plotly:master","ref":"master","sha":"920a333283b1ad9506e804a2e872eaa7f77c3f2e","user":{"login":"plotly","id":5997976,"avatar_url":"https://avatars.githubusercontent.com/u/5997976?v=3","gravatar_id":"","url":"https://api.github.com/users/plotly","html_url":"https://github.com/plotly","followers_url":"https://api.github.com/users/plotly/followers","following_url":"https://api.github.com/users/plotly/following{/other_user}","gists_url":"https://api.github.com/users/plotly/gists{/gist_id}","starred_url":"https://api.github.com/users/plotly/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/plotly/subscriptions","organizations_url":"https://api.github.com/users/plotly/orgs","repos_url":"https://api.github.com/users/plotly/repos","events_url":"https://api.github.com/users/plotly/events{/privacy}","received_events_url":"https://api.github.com/users/plotly/received_events","type":"Organization","site_admin":false},"repo":{"id":45646037,"name":"plotly.js","full_name":"plotly/plotly.js","owner":{"login":"plotly","id":5997976,"avatar_url":"https://avatars.githubusercontent.com/u/5997976?v=3","gravatar_id":"","url":"https://api.github.com/users/plotly","html_url":"https://github.com/plotly","followers_url":"https://api.github.com/users/plotly/followers","following_url":"https://api.github.com/users/plotly/following{/other_user}","gists_url":"https://api.github.com/users/plotly/gists{/gist_id}","starred_url":"https://api.github.com/users/plotly/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/plotly/subscriptions","organizations_url":"https://api.github.com/users/plotly/orgs","repos_url":"https://api.github.com/users/plotly/repos","events_url":"https://api.github.com/users/plotly/events{/privacy}","received_events_url":"https://api.github.com/users/plotly/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/plotly/plotly.js","description":"The open source javascript graphing library that powers plotly","fork":false,"url":"https://api.github.com/repos/plotly/plotly.js","forks_url":"https://api.github.com/repos/plotly/plotly.js/forks","keys_url":"https://api.github.com/repos/plotly/plotly.js/keys{/key_id}","collaborators_url":"https://api.github.com/repos/plotly/plotly.js/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/plotly/plotly.js/teams","hooks_url":"https://api.github.com/repos/plotly/plotly.js/hooks","issue_events_url":"https://api.github.com/repos/plotly/plotly.js/issues/events{/number}","events_url":"https://api.github.com/repos/plotly/plotly.js/events","assignees_url":"https://api.github.com/repos/plotly/plotly.js/assignees{/user}","branches_url":"https://api.github.com/repos/plotly/plotly.js/branches{/branch}","tags_url":"https://api.github.com/repos/plotly/plotly.js/tags","blobs_url":"https://api.github.com/repos/plotly/plotly.js/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/plotly/plotly.js/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/plotly/plotly.js/git/refs{/sha}","trees_url":"https://api.github.com/repos/plotly/plotly.js/git/trees{/sha}","statuses_url":"https://api.github.com/repos/plotly/plotly.js/statuses/{sha}","languages_url":"https://api.github.com/repos/plotly/plotly.js/languages","stargazers_url":"https://api.github.com/repos/plotly/plotly.js/stargazers","contributors_url":"https://api.github.com/repos/plotly/plotly.js/contributors","subscribers_url":"https://api.github.com/repos/plotly/plotly.js/subscribers","subscription_url":"https://api.github.com/repos/plotly/plotly.js/subscription","commits_url":"https://api.github.com/repos/plotly/plotly.js/commits{/sha}","git_commits_url":"https://api.github.com/repos/plotly/plotly.js/git/commits{/sha}","comments_url":"https://api.github.com/repos/plotly/plotly.js/comments{/number}","issue_comment_url":"https://api.github.com/repos/plotly/plotly.js/issues/comments{/number}","contents_url":"https://api.github.com/repos/plotly/plotly.js/contents/{+path}","compare_url":"https://api.github.com/repos/plotly/plotly.js/compare/{base}...{head}","merges_url":"https://api.github.com/repos/plotly/plotly.js/merges","archive_url":"https://api.github.com/repos/plotly/plotly.js/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/plotly/plotly.js/downloads","issues_url":"https://api.github.com/repos/plotly/plotly.js/issues{/number}","pulls_url":"https://api.github.com/repos/plotly/plotly.js/pulls{/number}","milestones_url":"https://api.github.com/repos/plotly/plotly.js/milestones{/number}","notifications_url":"https://api.github.com/repos/plotly/plotly.js/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/plotly/plotly.js/labels{/name}","releases_url":"https://api.github.com/repos/plotly/plotly.js/releases{/id}","deployments_url":"https://api.github.com/repos/plotly/plotly.js/deployments","created_at":"2015-11-05T23:27:17Z","updated_at":"2016-09-22T13:45:30Z","pushed_at":"2016-09-22T15:13:11Z","git_url":"git://github.com/plotly/plotly.js.git","ssh_url":"git@github.com:plotly/plotly.js.git","clone_url":"https://github.com/plotly/plotly.js.git","svn_url":"https://github.com/plotly/plotly.js","homepage":"https://plot.ly/javascript/","size":146334,"stargazers_count":5348,"watchers_count":5348,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":492,"mirror_url":null,"open_issues_count":204,"forks":492,"open_issues":204,"watchers":5348,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/plotly/plotly.js/pulls/936"},"html":{"href":"https://github.com/plotly/plotly.js/pull/936"},"issue":{"href":"https://api.github.com/repos/plotly/plotly.js/issues/936"},"comments":{"href":"https://api.github.com/repos/plotly/plotly.js/issues/936/comments"},"review_comments":{"href":"https://api.github.com/repos/plotly/plotly.js/pulls/936/comments"},"review_comment":{"href":"https://api.github.com/repos/plotly/plotly.js/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/plotly/plotly.js/pulls/936/commits"},"statuses":{"href":"https://api.github.com/repos/plotly/plotly.js/statuses/392844d74861cef1cc3fbb0436f88391b68fc86c"}}}}
{"actor":{"display_login":"etpinard"}}