GitHub PullRequestReviewCommentEvent at 2014-07-10 01:51:46
Repository: edx-platform
Actor: cahrens
Payload: {"action":"created","comment":{"url":"https://api.github.com/repos/edx/edx-platform/pulls/comments/14746562","id":14746562,"diff_hunk":"@@ -0,0 +1,382 @@\n+define([\"jquery\", \"js/spec_helpers/create_sinon\", \"js/spec_helpers/view_helpers\", \"js/views/utils/view_utils\",\n+        \"js/views/pages/course_outline\",\n+        \"js/models/xblock_outline_info\", \"jquery.simulate\"],\n+    function ($, create_sinon, view_helpers, ViewUtils, CourseOutlinePage, XBlockOutlineInfo) {\n+\n+        describe(\"CourseOutlinePage\", function() {\n+            var createCourseOutlinePage, displayNameInput, model, outlinePage, requests, expandSubsection,\n+                createMockCourseJSON, createMockSectionJSON, createMockSubsectionJSON,\n+                mockCourseJSON, mockEmptyCourseJSON, mockSingleSectionCourseJSON,\n+                mockOutlinePage = readFixtures('mock/mock-course-outline-page.underscore');\n+\n+            beforeEach(function () {\n+                createMockCourseJSON = function(displayName, children) {\n+                    return {\n+                        id: \"mock-course\",\n+                        display_name: displayName,\n+                        category: \"course\",\n+                        studio_url: \"/course/slashes:MockCourse\",\n+                        is_container: true,\n+                        has_changes: false,\n+                        published: true,\n+                        edited_on: \"Jul 02, 2014 at 20:56 UTC\",\n+                        edited_by: \"MockUser\",\n+                        child_info: {\n+                            display_name: \"Section\",\n+                            category: \"chapter\",\n+                            children: children\n+                        }\n+                    };\n+                };\n+                createMockSectionJSON = function(displayName, children) {\n+                    return {\n+                        id: \"mock-section\",\n+                        category: \"chapter\",\n+                        display_name: displayName,\n+                        studio_url: \"/course/slashes:MockCourse\",\n+                        is_container: true,\n+                        has_changes: false,\n+                        published: true,\n+                        edited_on: \"Jul 02, 2014 at 20:56 UTC\",\n+                        edited_by: \"MockUser\",\n+                        child_info: {\n+                            category: \"sequential\",\n+                            display_name: \"Subsection\",\n+                            children: children\n+                        }\n+                    };\n+                };\n+                createMockSubsectionJSON = function(displayName, children) {\n+                    return {\n+                        id: \"mock-subsection\",\n+                        display_name: displayName,\n+                        category: \"sequential\",\n+                        studio_url: \"/course/slashes:MockCourse\",\n+                        is_container: true,\n+                        has_changes: false,\n+                        published: true,\n+                        edited_on: \"Jul 02, 2014 at 20:56 UTC\",\n+                        edited_by: \"MockUser\",\n+                        child_info: {\n+                            category: \"vertical\",\n+                            display_name: \"Unit\",\n+                            children: children\n+                        }\n+                    };\n+                };\n+                mockCourseJSON = createMockCourseJSON(\"Mock Course\", [\n+                    createMockSectionJSON(\"Mock Section\", [\n+                        createMockSubsectionJSON(\"Mock Subsection\", [{\n+                                id: \"mock-unit\",\n+                                display_name: \"Mock Unit\",\n+                                category: \"vertical\",\n+                                studio_url: \"/container/mock-unit\",\n+                                is_container: true,\n+                                has_changes: true,\n+                                published: false,\n+                                edited_on: \"Jul 02, 2014 at 20:56 UTC\",\n+                                edited_by: \"MockUser\"\n+                            }\n+                        ])\n+                    ])\n+                ]);\n+                mockEmptyCourseJSON = createMockCourseJSON(\"Mock Course\", []);\n+                mockSingleSectionCourseJSON = createMockCourseJSON(\"Mock Course\", [\n+                    createMockSectionJSON(\"Mock Section\", [])\n+                ]);\n+\n+                view_helpers.installMockAnalytics();\n+                view_helpers.installViewTemplates();\n+                view_helpers.installTemplate('course-outline');\n+                view_helpers.installTemplate('xblock-string-field-editor');\n+                appendSetFixtures(mockOutlinePage);\n+            });\n+\n+            afterEach(function () {\n+                view_helpers.removeMockAnalytics();\n+            });\n+\n+            expandSubsection = function() {\n+                var subsectionElement = outlinePage.$('.outline-item-subsection');\n+                subsectionElement.find('> .wrapper-xblock-header .ui-toggle-expansion').click();\n+            };\n+\n+            createCourseOutlinePage = function(test, courseJSON, createOnly) {\n+                requests = create_sinon.requests(test);\n+                model = new XBlockOutlineInfo(courseJSON, { parse: true });\n+                outlinePage = new CourseOutlinePage({\n+                    model: model,\n+                    el: $('#content')\n+                });\n+                if (!createOnly) {\n+                    outlinePage.render();\n+                }\n+                return outlinePage;\n+            };\n+\n+            describe(\"Initial display\", function() {\n+                it('can render itself', function() {\n+                    createCourseOutlinePage(this, mockCourseJSON);\n+                    expect(outlinePage.$('.sortable-course-list')).toExist();\n+                    expect(outlinePage.$('.sortable-section-list')).toExist();\n+                    expect(outlinePage.$('.sortable-subsection-list')).toExist();\n+                });\n+\n+                it('shows a loading indicator', function() {\n+                    createCourseOutlinePage(this, mockCourseJSON, true);\n+                    expect(outlinePage.$('.ui-loading')).not.toHaveClass('is-hidden');\n+                    outlinePage.render();\n+                    expect(outlinePage.$('.ui-loading')).toHaveClass('is-hidden');\n+                });\n+\n+                it('shows subsections initially collapsed', function() {\n+                    var subsectionElement;\n+                    createCourseOutlinePage(this, mockCourseJSON);\n+                    subsectionElement = outlinePage.$('.outline-item-subsection');\n+                    expect(subsectionElement).toHaveClass('collapsed');\n+                    expect(outlinePage.$('.outline-item-unit')).not.toExist();\n+                });\n+            });\n+\n+            describe(\"Button bar\", function() {\n+                it('can add a section', function() {\n+                    createCourseOutlinePage(this, mockEmptyCourseJSON);\n+                    outlinePage.$('.nav-actions .add-button').click();\n+                    create_sinon.expectJsonRequest(requests, 'POST', '/xblock/', {\n+                        'category': 'chapter',\n+                        'display_name': 'New Section',\n+                        'parent_locator': 'mock-course'\n+                    });\n+                    create_sinon.respondWithJson(requests, {\n+                        \"locator\": \"mock-section\",\n+                        \"courseKey\": \"slashes:MockCourse\"\n+                    });\n+                    create_sinon.expectJsonRequest(requests, 'GET', '/xblock/outline/mock-course');\n+                    create_sinon.respondWithJson(requests, mockSingleSectionCourseJSON);\n+                    expect(outlinePage.$('.no-content')).not.toExist();\n+                    expect(outlinePage.$('.sortable-course-list li').data('locator')).toEqual('mock-section');\n+                });\n+\n+                it('can expand and collapse all sections', function() {\n+                    createCourseOutlinePage(this, mockCourseJSON, false);\n+                    outlinePage.$('.nav-actions .toggle-button-expand-collapse').click();\n+                    expect(outlinePage.$('.outline-item-section')).toHaveClass('collapsed');\n+                    outlinePage.$('.nav-actions .toggle-button-expand-collapse').click();\n+                    expect(outlinePage.$('.outline-item-section')).not.toHaveClass('collapsed');\n+                });\n+            });\n+\n+            describe(\"Empty course\", function() {\n+                it('shows an empty course message initially', function() {\n+                    createCourseOutlinePage(this, mockEmptyCourseJSON);\n+                    expect(outlinePage.$('.no-content')).not.toHaveClass('is-hidden');\n+                    expect(outlinePage.$('.no-content .add-button')).toExist();\n+                });\n+\n+                it('can add a section', function() {\n+                    createCourseOutlinePage(this, mockEmptyCourseJSON);\n+                    $('.no-content .add-button').click();\n+                    create_sinon.expectJsonRequest(requests, 'POST', '/xblock/', {\n+                        'category': 'chapter',\n+                        'display_name': 'New Section',\n+                        'parent_locator': 'mock-course'\n+                    });\n+                    create_sinon.respondWithJson(requests, {\n+                        \"locator\": \"mock-section\",\n+                        \"courseKey\": \"slashes:MockCourse\"\n+                    });\n+                    create_sinon.expectJsonRequest(requests, 'GET', '/xblock/outline/mock-course');\n+                    create_sinon.respondWithJson(requests, mockSingleSectionCourseJSON);\n+                    expect(outlinePage.$('.no-content')).not.toExist();\n+                    expect(outlinePage.$('.sortable-course-list li').data('locator')).toEqual('mock-section');\n+                });\n+\n+                it('remains empty if an add fails', function() {\n+                    var requestCount;\n+                    createCourseOutlinePage(this, mockEmptyCourseJSON);\n+                    $('.no-content .add-button').click();\n+                    create_sinon.expectJsonRequest(requests, 'POST', '/xblock/', {\n+                        'category': 'chapter',\n+                        'display_name': 'New Section',\n+                        'parent_locator': 'mock-course'\n+                    });\n+                    requestCount = requests.length;\n+                    create_sinon.respondWithError(requests);\n+                    expect(requests.length).toBe(requestCount); // No additional requests should be made\n+                    expect(outlinePage.$('.no-content')).not.toHaveClass('is-hidden');\n+                    expect(outlinePage.$('.no-content .add-button')).toExist();\n+                });\n+            });\n+\n+            describe(\"Section\", function() {\n+                it('can be deleted', function() {\n+                    var promptSpy = view_helpers.createPromptSpy();\n+                    createCourseOutlinePage(this, mockSingleSectionCourseJSON);\n+                    outlinePage.$('.outline-item-section .delete-button').click();\n+                    view_helpers.confirmPrompt(promptSpy);\n+                    create_sinon.expectJsonRequest(requests, 'DELETE',\n+                        '/xblock/mock-section?recurse=true&all_versions=false');\n+                    create_sinon.respondWithJson(requests, {});\n+                    create_sinon.expectJsonRequest(requests, 'GET', '/xblock/outline/mock-course');\n+                    create_sinon.respondWithJson(requests, mockEmptyCourseJSON);\n+                    expect(outlinePage.$('.no-content')).not.toHaveClass('is-hidden');\n+                    expect(outlinePage.$('.no-content .add-button')).toExist();\n+                });\n+\n+                it('remains visible if its deletion fails', function() {\n+                    var promptSpy = view_helpers.createPromptSpy(),\n+                        requestCount;\n+                    createCourseOutlinePage(this, mockSingleSectionCourseJSON);\n+                    outlinePage.$('.outline-item-section .delete-button').click();\n+                    view_helpers.confirmPrompt(promptSpy);\n+                    create_sinon.expectJsonRequest(requests, 'DELETE',\n+                        '/xblock/mock-section?recurse=true&all_versions=false');\n+                    requestCount = requests.length;\n+                    create_sinon.respondWithError(requests);\n+                    expect(requests.length).toBe(requestCount); // No additional requests should be made\n+                    expect(outlinePage.$('.sortable-course-list li').data('locator')).toEqual('mock-section');\n+                });\n+\n+                it('can add a subsection', function() {\n+                    createCourseOutlinePage(this, mockCourseJSON);\n+                    outlinePage.$('.outline-item-section > .add-xblock-component .add-button').click();\n+                    create_sinon.expectJsonRequest(requests, 'POST', '/xblock/', {\n+                        'category': 'sequential',\n+                        'display_name': 'New Subsection',\n+                        'parent_locator': 'mock-section'\n+                    });\n+                    create_sinon.respondWithJson(requests, {\n+                        \"locator\": \"new-mock-subsection\",\n+                        \"courseKey\": \"slashes:MockCourse\"\n+                    });\n+                    // Note: verification of the server response and the UI's handling of it\n+                    // is handled in the acceptance tests.\n+                    create_sinon.expectJsonRequest(requests, 'GET', '/xblock/outline/mock-section');\n+\n+                });\n+\n+                it('can be renamed inline', function() {\n+                    var updatedDisplayName = 'Updated Section Name',\n+                        displayNameElement,\n+                        sectionHeaderElement,\n+                        sectionModel;\n+                    createCourseOutlinePage(this, mockCourseJSON);\n+                    sectionHeaderElement = outlinePage.$('.outline-item-section > .wrapper-xblock-header');\n+                    displayNameElement = sectionHeaderElement.find('.xblock-field-value');\n+                    displayNameInput = view_helpers.inlineEdit(displayNameElement, updatedDisplayName);\n+                    displayNameInput.change();\n+                    // This is the response for the change operation.\n+                    create_sinon.respondWithJson(requests, { });\n+                    // This is the response for the subsequent fetch operation.\n+                    create_sinon.respondWithJson(requests, {\"display_name\":  updatedDisplayName});\n+                    expect(displayNameInput).toHaveClass('is-hidden');\n+                    expect(displayNameElement).not.toHaveClass('is-hidden');\n+                    expect(displayNameElement.text().trim()).toBe(updatedDisplayName);\n+                    sectionModel = outlinePage.model.get('child_info').children[0];\n+                    expect(sectionModel.get('display_name')).toBe(updatedDisplayName);\n+                });\n+\n+                it('can be expanded and collapsed', function() {\n+                    var sectionElement;\n+                    createCourseOutlinePage(this, mockCourseJSON);\n+                    sectionElement = outlinePage.$('.outline-item-section');\n+                    sectionElement.find('> .wrapper-xblock-header .ui-toggle-expansion').click();\n+                    expect(sectionElement).toHaveClass('collapsed');\n+                    sectionElement.find('> .wrapper-xblock-header .ui-toggle-expansion').click();\n+                    expect(sectionElement).not.toHaveClass('collapsed');\n+                });\n+            });\n+\n+            describe(\"Subsection\", function() {\n+                it('can be deleted', function() {\n+                    var promptSpy = view_helpers.createPromptSpy();\n+                    createCourseOutlinePage(this, mockCourseJSON);\n+                    outlinePage.$('.outline-item-subsection > .wrapper-xblock-header .delete-button').click();\n+                    view_helpers.confirmPrompt(promptSpy);\n+                    create_sinon.expectJsonRequest(requests, 'DELETE',\n+                        '/xblock/mock-subsection?recurse=true&all_versions=false');\n+                    create_sinon.respondWithJson(requests, {});\n+                    // Note: verification of the server response and the UI's handling of it\n+                    // is handled in the acceptance tests.\n+                    create_sinon.expectJsonRequest(requests, 'GET', '/xblock/outline/mock-section');\n+                });\n+\n+                it('can add a unit', function() {\n+                    var redirectSpy;\n+                    createCourseOutlinePage(this, mockCourseJSON);\n+                    redirectSpy = spyOn(ViewUtils, 'redirect');\n+                    outlinePage.$('.outline-item-subsection > .add-xblock-component .add-button').click();\n+                    create_sinon.expectJsonRequest(requests, 'POST', '/xblock/', {\n+                        'category': 'vertical',\n+                        'display_name': 'New Unit',\n+                        'parent_locator': 'mock-subsection'\n+                    });\n+                    create_sinon.respondWithJson(requests, {\n+                        \"locator\": \"new-mock-unit\",\n+                        \"courseKey\": \"slashes:MockCourse\"\n+                    });\n+                    expect(redirectSpy).toHaveBeenCalledWith('/container/new-mock-unit');\n+                });\n+\n+                it('can be renamed inline', function() {\n+                    var updatedDisplayName = 'Updated Subsection Name',\n+                        displayNameElement,\n+                        subsectionHeaderElement,\n+                        subsectionModel;\n+                    createCourseOutlinePage(this, mockCourseJSON);\n+                    subsectionHeaderElement = outlinePage.$('.outline-item-subsection > .wrapper-xblock-header');\n+                    displayNameElement = subsectionHeaderElement.find('.xblock-field-value');\n+                    displayNameInput = view_helpers.inlineEdit(displayNameElement, updatedDisplayName);\n+                    displayNameInput.change();\n+                    // This is the response for the change operation.\n+                    create_sinon.respondWithJson(requests, { });\n+                    // This is the response for the subsequent fetch operation for the section.\n+                    create_sinon.respondWithJson(requests,\n+                        createMockSectionJSON('Mock Section', [\n+                            createMockSubsectionJSON(updatedDisplayName, [])\n+                        ]));\n+                    subsectionHeaderElement = outlinePage.$('.outline-item-subsection > .wrapper-xblock-header');\n+                    displayNameElement = subsectionHeaderElement.find('.xblock-field-value');","path":"cms/static/js/spec/views/pages/course_outline_spec.js","position":339,"original_position":339,"commit_id":"c3badcc23f8e476c967903d1e653c83b8f78600e","original_commit_id":"c3badcc23f8e476c967903d1e653c83b8f78600e","user":{"login":"cahrens","id":484484,"avatar_url":"https://avatars.githubusercontent.com/u/484484?","gravatar_id":"c61f992b89d30875e4626db835a07b77","url":"https://api.github.com/users/cahrens","html_url":"https://github.com/cahrens","followers_url":"https://api.github.com/users/cahrens/followers","following_url":"https://api.github.com/users/cahrens/following{/other_user}","gists_url":"https://api.github.com/users/cahrens/gists{/gist_id}","starred_url":"https://api.github.com/users/cahrens/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cahrens/subscriptions","organizations_url":"https://api.github.com/users/cahrens/orgs","repos_url":"https://api.github.com/users/cahrens/repos","events_url":"https://api.github.com/users/cahrens/events{/privacy}","received_events_url":"https://api.github.com/users/cahrens/received_events","type":"User","site_admin":false},"body":"Why is this test changing the display name twice? ","created_at":"2014-07-10T01:51:46Z","updated_at":"2014-07-10T01:51:46Z","html_url":"https://github.com/edx/edx-platform/pull/4227#discussion_r14746562","pull_request_url":"https://api.github.com/repos/edx/edx-platform/pulls/4227","_links":{"self":{"href":"https://api.github.com/repos/edx/edx-platform/pulls/comments/14746562"},"html":{"href":"https://github.com/edx/edx-platform/pull/4227#discussion_r14746562"},"pull_request":{"href":"https://api.github.com/repos/edx/edx-platform/pulls/4227"}}},"pull_request":{"url":"https://api.github.com/repos/edx/edx-platform/pulls/4227","id":17683077,"html_url":"https://github.com/edx/edx-platform/pull/4227","diff_url":"https://github.com/edx/edx-platform/pull/4227.diff","patch_url":"https://github.com/edx/edx-platform/pull/4227.patch","issue_url":"https://api.github.com/repos/edx/edx-platform/issues/4227","number":4227,"state":"open","title":"Backbone version of the course outline page","user":{"login":"andy-armstrong","id":5985072,"avatar_url":"https://avatars.githubusercontent.com/u/5985072?","gravatar_id":"a5118171dcd348c5fcebab8708b64dad","url":"https://api.github.com/users/andy-armstrong","html_url":"https://github.com/andy-armstrong","followers_url":"https://api.github.com/users/andy-armstrong/followers","following_url":"https://api.github.com/users/andy-armstrong/following{/other_user}","gists_url":"https://api.github.com/users/andy-armstrong/gists{/gist_id}","starred_url":"https://api.github.com/users/andy-armstrong/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andy-armstrong/subscriptions","organizations_url":"https://api.github.com/users/andy-armstrong/orgs","repos_url":"https://api.github.com/users/andy-armstrong/repos","events_url":"https://api.github.com/users/andy-armstrong/events{/privacy}","received_events_url":"https://api.github.com/users/andy-armstrong/received_events","type":"User","site_admin":false},"body":"STUD-1726\r\n\r\nConverted the course outline page to Backbone so as to support dynamic client-side updating.","created_at":"2014-06-27T02:01:48Z","updated_at":"2014-07-10T01:51:46Z","closed_at":null,"merged_at":null,"merge_commit_sha":"220c841b99fe47c447acade35fbf530333b92fc8","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/edx/edx-platform/pulls/4227/commits","review_comments_url":"https://api.github.com/repos/edx/edx-platform/pulls/4227/comments","review_comment_url":"https://api.github.com/repos/edx/edx-platform/pulls/comments/{number}","comments_url":"https://api.github.com/repos/edx/edx-platform/issues/4227/comments","statuses_url":"https://api.github.com/repos/edx/edx-platform/statuses/c3badcc23f8e476c967903d1e653c83b8f78600e","head":{"label":"edx:andya/backbonify-course-outline","ref":"andya/backbonify-course-outline","sha":"c3badcc23f8e476c967903d1e653c83b8f78600e","user":{"login":"edx","id":3179841,"avatar_url":"https://avatars.githubusercontent.com/u/3179841?","gravatar_id":"e1f6c6dc8772c47c0261cd5df2ed2814","url":"https://api.github.com/users/edx","html_url":"https://github.com/edx","followers_url":"https://api.github.com/users/edx/followers","following_url":"https://api.github.com/users/edx/following{/other_user}","gists_url":"https://api.github.com/users/edx/gists{/gist_id}","starred_url":"https://api.github.com/users/edx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/edx/subscriptions","organizations_url":"https://api.github.com/users/edx/orgs","repos_url":"https://api.github.com/users/edx/repos","events_url":"https://api.github.com/users/edx/events{/privacy}","received_events_url":"https://api.github.com/users/edx/received_events","type":"Organization","site_admin":false},"repo":{"id":10391073,"name":"edx-platform","full_name":"edx/edx-platform","owner":{"login":"edx","id":3179841,"avatar_url":"https://avatars.githubusercontent.com/u/3179841?","gravatar_id":"e1f6c6dc8772c47c0261cd5df2ed2814","url":"https://api.github.com/users/edx","html_url":"https://github.com/edx","followers_url":"https://api.github.com/users/edx/followers","following_url":"https://api.github.com/users/edx/following{/other_user}","gists_url":"https://api.github.com/users/edx/gists{/gist_id}","starred_url":"https://api.github.com/users/edx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/edx/subscriptions","organizations_url":"https://api.github.com/users/edx/orgs","repos_url":"https://api.github.com/users/edx/repos","events_url":"https://api.github.com/users/edx/events{/privacy}","received_events_url":"https://api.github.com/users/edx/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/edx/edx-platform","description":"Open edX, the edX platform that powers http://www.edx.org","fork":false,"url":"https://api.github.com/repos/edx/edx-platform","forks_url":"https://api.github.com/repos/edx/edx-platform/forks","keys_url":"https://api.github.com/repos/edx/edx-platform/keys{/key_id}","collaborators_url":"https://api.github.com/repos/edx/edx-platform/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/edx/edx-platform/teams","hooks_url":"https://api.github.com/repos/edx/edx-platform/hooks","issue_events_url":"https://api.github.com/repos/edx/edx-platform/issues/events{/number}","events_url":"https://api.github.com/repos/edx/edx-platform/events","assignees_url":"https://api.github.com/repos/edx/edx-platform/assignees{/user}","branches_url":"https://api.github.com/repos/edx/edx-platform/branches{/branch}","tags_url":"https://api.github.com/repos/edx/edx-platform/tags","blobs_url":"https://api.github.com/repos/edx/edx-platform/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/edx/edx-platform/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/edx/edx-platform/git/refs{/sha}","trees_url":"https://api.github.com/repos/edx/edx-platform/git/trees{/sha}","statuses_url":"https://api.github.com/repos/edx/edx-platform/statuses/{sha}","languages_url":"https://api.github.com/repos/edx/edx-platform/languages","stargazers_url":"https://api.github.com/repos/edx/edx-platform/stargazers","contributors_url":"https://api.github.com/repos/edx/edx-platform/contributors","subscribers_url":"https://api.github.com/repos/edx/edx-platform/subscribers","subscription_url":"https://api.github.com/repos/edx/edx-platform/subscription","commits_url":"https://api.github.com/repos/edx/edx-platform/commits{/sha}","git_commits_url":"https://api.github.com/repos/edx/edx-platform/git/commits{/sha}","comments_url":"https://api.github.com/repos/edx/edx-platform/comments{/number}","issue_comment_url":"https://api.github.com/repos/edx/edx-platform/issues/comments/{number}","contents_url":"https://api.github.com/repos/edx/edx-platform/contents/{+path}","compare_url":"https://api.github.com/repos/edx/edx-platform/compare/{base}...{head}","merges_url":"https://api.github.com/repos/edx/edx-platform/merges","archive_url":"https://api.github.com/repos/edx/edx-platform/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/edx/edx-platform/downloads","issues_url":"https://api.github.com/repos/edx/edx-platform/issues{/number}","pulls_url":"https://api.github.com/repos/edx/edx-platform/pulls{/number}","milestones_url":"https://api.github.com/repos/edx/edx-platform/milestones{/number}","notifications_url":"https://api.github.com/repos/edx/edx-platform/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/edx/edx-platform/labels{/name}","releases_url":"https://api.github.com/repos/edx/edx-platform/releases{/id}","created_at":"2013-05-30T20:20:38Z","updated_at":"2014-07-09T12:15:54Z","pushed_at":"2014-07-10T01:47:13Z","git_url":"git://github.com/edx/edx-platform.git","ssh_url":"git@github.com:edx/edx-platform.git","clone_url":"https://github.com/edx/edx-platform.git","svn_url":"https://github.com/edx/edx-platform","homepage":"http://code.edx.org/","size":1177520,"stargazers_count":1299,"watchers_count":1299,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"forks_count":705,"mirror_url":null,"open_issues_count":151,"forks":705,"open_issues":151,"watchers":1299,"default_branch":"master"}},"base":{"label":"edx:bulk-publishing","ref":"bulk-publishing","sha":"9a7c7fd77d97760a2685f14db95cd430de5a3296","user":{"login":"edx","id":3179841,"avatar_url":"https://avatars.githubusercontent.com/u/3179841?","gravatar_id":"e1f6c6dc8772c47c0261cd5df2ed2814","url":"https://api.github.com/users/edx","html_url":"https://github.com/edx","followers_url":"https://api.github.com/users/edx/followers","following_url":"https://api.github.com/users/edx/following{/other_user}","gists_url":"https://api.github.com/users/edx/gists{/gist_id}","starred_url":"https://api.github.com/users/edx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/edx/subscriptions","organizations_url":"https://api.github.com/users/edx/orgs","repos_url":"https://api.github.com/users/edx/repos","events_url":"https://api.github.com/users/edx/events{/privacy}","received_events_url":"https://api.github.com/users/edx/received_events","type":"Organization","site_admin":false},"repo":{"id":10391073,"name":"edx-platform","full_name":"edx/edx-platform","owner":{"login":"edx","id":3179841,"avatar_url":"https://avatars.githubusercontent.com/u/3179841?","gravatar_id":"e1f6c6dc8772c47c0261cd5df2ed2814","url":"https://api.github.com/users/edx","html_url":"https://github.com/edx","followers_url":"https://api.github.com/users/edx/followers","following_url":"https://api.github.com/users/edx/following{/other_user}","gists_url":"https://api.github.com/users/edx/gists{/gist_id}","starred_url":"https://api.github.com/users/edx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/edx/subscriptions","organizations_url":"https://api.github.com/users/edx/orgs","repos_url":"https://api.github.com/users/edx/repos","events_url":"https://api.github.com/users/edx/events{/privacy}","received_events_url":"https://api.github.com/users/edx/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/edx/edx-platform","description":"Open edX, the edX platform that powers http://www.edx.org","fork":false,"url":"https://api.github.com/repos/edx/edx-platform","forks_url":"https://api.github.com/repos/edx/edx-platform/forks","keys_url":"https://api.github.com/repos/edx/edx-platform/keys{/key_id}","collaborators_url":"https://api.github.com/repos/edx/edx-platform/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/edx/edx-platform/teams","hooks_url":"https://api.github.com/repos/edx/edx-platform/hooks","issue_events_url":"https://api.github.com/repos/edx/edx-platform/issues/events{/number}","events_url":"https://api.github.com/repos/edx/edx-platform/events","assignees_url":"https://api.github.com/repos/edx/edx-platform/assignees{/user}","branches_url":"https://api.github.com/repos/edx/edx-platform/branches{/branch}","tags_url":"https://api.github.com/repos/edx/edx-platform/tags","blobs_url":"https://api.github.com/repos/edx/edx-platform/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/edx/edx-platform/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/edx/edx-platform/git/refs{/sha}","trees_url":"https://api.github.com/repos/edx/edx-platform/git/trees{/sha}","statuses_url":"https://api.github.com/repos/edx/edx-platform/statuses/{sha}","languages_url":"https://api.github.com/repos/edx/edx-platform/languages","stargazers_url":"https://api.github.com/repos/edx/edx-platform/stargazers","contributors_url":"https://api.github.com/repos/edx/edx-platform/contributors","subscribers_url":"https://api.github.com/repos/edx/edx-platform/subscribers","subscription_url":"https://api.github.com/repos/edx/edx-platform/subscription","commits_url":"https://api.github.com/repos/edx/edx-platform/commits{/sha}","git_commits_url":"https://api.github.com/repos/edx/edx-platform/git/commits{/sha}","comments_url":"https://api.github.com/repos/edx/edx-platform/comments{/number}","issue_comment_url":"https://api.github.com/repos/edx/edx-platform/issues/comments/{number}","contents_url":"https://api.github.com/repos/edx/edx-platform/contents/{+path}","compare_url":"https://api.github.com/repos/edx/edx-platform/compare/{base}...{head}","merges_url":"https://api.github.com/repos/edx/edx-platform/merges","archive_url":"https://api.github.com/repos/edx/edx-platform/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/edx/edx-platform/downloads","issues_url":"https://api.github.com/repos/edx/edx-platform/issues{/number}","pulls_url":"https://api.github.com/repos/edx/edx-platform/pulls{/number}","milestones_url":"https://api.github.com/repos/edx/edx-platform/milestones{/number}","notifications_url":"https://api.github.com/repos/edx/edx-platform/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/edx/edx-platform/labels{/name}","releases_url":"https://api.github.com/repos/edx/edx-platform/releases{/id}","created_at":"2013-05-30T20:20:38Z","updated_at":"2014-07-09T12:15:54Z","pushed_at":"2014-07-10T01:47:13Z","git_url":"git://github.com/edx/edx-platform.git","ssh_url":"git@github.com:edx/edx-platform.git","clone_url":"https://github.com/edx/edx-platform.git","svn_url":"https://github.com/edx/edx-platform","homepage":"http://code.edx.org/","size":1177520,"stargazers_count":1299,"watchers_count":1299,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"forks_count":705,"mirror_url":null,"open_issues_count":151,"forks":705,"open_issues":151,"watchers":1299,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/edx/edx-platform/pulls/4227"},"html":{"href":"https://github.com/edx/edx-platform/pull/4227"},"issue":{"href":"https://api.github.com/repos/edx/edx-platform/issues/4227"},"comments":{"href":"https://api.github.com/repos/edx/edx-platform/issues/4227/comments"},"review_comments":{"href":"https://api.github.com/repos/edx/edx-platform/pulls/4227/comments"},"review_comment":{"href":"https://api.github.com/repos/edx/edx-platform/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/edx/edx-platform/pulls/4227/commits"},"statuses":{"href":"https://api.github.com/repos/edx/edx-platform/statuses/c3badcc23f8e476c967903d1e653c83b8f78600e"}}}}