{"action":"created","comment":{"url":"https://api.github.com/repos/TEAMMATES/teammates/pulls/comments/183713792","pull_request_review_id":114762534,"id":183713792,"diff_hunk":"@@ -197,90 +216,165 @@ public boolean isPageUri(String uri) {\n         return currentPageUrl.getRelativeUrl().equals(uri);\n     }\n \n+    public <E> E waitFor(ExpectedCondition<E> expectedCondition) {\n+        WebDriverWait wait = new WebDriverWait(browser.driver, TestProperties.TEST_TIMEOUT);\n+        return wait.until(expectedCondition);\n+    }\n+\n     /**\n      * Waits until the page is fully loaded.\n      */\n     public void waitForPageToLoad() {\n-        WebDriverWait wait = new WebDriverWait(browser.driver, TestProperties.TEST_TIMEOUT);\n-        wait.until(new ExpectedCondition<Boolean>() {\n-            @Override\n-            public Boolean apply(WebDriver d) {\n-                // Check https://developer.mozilla.org/en/docs/web/api/document/readystate\n-                // to understand more on a web document's readyState\n-                return \"complete\".equals(((JavascriptExecutor) d).executeScript(\"return document.readyState\"));\n-            }\n+        waitFor(driver -> {\n+            // Check https://developer.mozilla.org/en/docs/web/api/document/readystate\n+            // to understand more on a web document's readyState\n+            final JavascriptExecutor javascriptExecutor = (JavascriptExecutor) Preconditions.checkNotNull(driver);\n+            return \"complete\".equals(javascriptExecutor.executeScript(\"return document.readyState\"));\n         });\n     }\n \n     /**\n      * Waits until TinyMCE editor is fully loaded.\n      */\n     public void waitForRichTextEditorToLoad(final String id) {\n-        WebDriverWait wait = new WebDriverWait(browser.driver, TestProperties.TEST_TIMEOUT);\n-        wait.until(new ExpectedCondition<Boolean>() {\n-            @Override\n-            public Boolean apply(WebDriver d) {\n-                String script = \"return tinymce.get('\" + id + \"') !== null\";\n-                return (Boolean) ((JavascriptExecutor) d).executeScript(script);\n-            }\n+        waitFor(driver -> {\n+            String script = \"return tinymce.get('\" + id + \"') !== null\";\n+            final JavascriptExecutor javascriptExecutor = (JavascriptExecutor) Preconditions.checkNotNull(driver);\n+            return (Boolean) javascriptExecutor.executeScript(script);\n         });\n     }\n \n     /**\n      * Waits until the element is not covered by any other element.\n      */\n     public void waitForElementNotCovered(final WebElement element) {\n-        WebDriverWait wait = new WebDriverWait(browser.driver, TestProperties.TEST_TIMEOUT);\n-        wait.until(new ExpectedCondition<Boolean>() {\n-            @Override\n-            public Boolean apply(WebDriver d) {\n-                return !isElementCovered(element);\n-            }\n-        });\n+        waitFor(d -> !isElementCovered(element));\n     }\n \n     public void waitForElementVisibility(WebElement element) {\n-        WebDriverWait wait = new WebDriverWait(browser.driver, TestProperties.TEST_TIMEOUT);\n-        wait.until(ExpectedConditions.visibilityOf(element));\n+        waitFor(ExpectedConditions.visibilityOf(element));\n     }\n \n     public void waitForElementVisibility(By by) {\n-        WebDriverWait wait = new WebDriverWait(browser.driver, TestProperties.TEST_TIMEOUT);\n-        wait.until(ExpectedConditions.visibilityOfElementLocated(by));\n+        waitFor(ExpectedConditions.visibilityOfElementLocated(by));\n     }\n \n     public void waitForElementToBeClickable(WebElement element) {\n-        WebDriverWait wait = new WebDriverWait(browser.driver, TestProperties.TEST_TIMEOUT);\n-        wait.until(ExpectedConditions.elementToBeClickable(element));\n+        waitFor(ExpectedConditions.elementToBeClickable(element));\n     }\n \n     public void waitForElementsVisibility(List<WebElement> elements) {\n-        WebDriverWait wait = new WebDriverWait(browser.driver, TestProperties.TEST_TIMEOUT);\n-        wait.until(ExpectedConditions.visibilityOfAllElements(elements));\n+        waitFor(ExpectedConditions.visibilityOfAllElements(elements));\n+    }\n+\n+    /**\n+     * {@code locator} is mapped to an actual {@link WebElement}.\n+     * @param locator used to find the element\n+     * @see AppPage#waitForElementStaleness(WebElement)\n+     */\n+    public void waitForElementStaleness(By locator) {\n+        waitForElementStaleness(browser.driver.findElement(locator));\n+    }\n+\n+    /**\n+     * Wait until an element is no longer attached to the DOM or the timeout expires.\n+     * @param element the WebElement\n+     * @throws org.openqa.selenium.TimeoutException if the timeout defined in\n+     * {@link TestProperties#TEST_TIMEOUT} expires\n+     * @see org.openqa.selenium.support.ui.FluentWait#until(com.google.common.base.Function)\n+     */\n+    public void waitForElementStaleness(WebElement element) {\n+        waitFor(ExpectedConditions.stalenessOf(element));\n+    }\n+\n+    /**\n+     * Wait until an element belongs to the class or the timeout expires.\n+     * @param element the WebElement\n+     * @param elementClass the class that the element must belong to\n+     * @throws org.openqa.selenium.TimeoutException if the timeout defined in\n+     * {@link TestProperties#TEST_TIMEOUT} expires\n+     * @see org.openqa.selenium.support.ui.FluentWait#until(com.google.common.base.Function)\n+     */\n+    void waitForElementToBeMemberOfClass(WebElement element, String elementClass) {\n+        waitFor(driver -> {\n+            String classAttribute = element.getAttribute(\"class\");\n+            List<String> classes = Arrays.asList(classAttribute.split(\" \"));\n+\n+            return classes.contains(elementClass);\n+        });\n     }\n \n     /**\n      * Waits for element to be invisible or not present, or timeout.\n      */\n     public void waitForElementToDisappear(By by) {\n-        WebDriverWait wait = new WebDriverWait(browser.driver, TestProperties.TEST_TIMEOUT);\n-        wait.until(ExpectedConditions.invisibilityOfElementLocated(by));\n+        waitFor(ExpectedConditions.invisibilityOfElementLocated(by));\n     }\n \n     /**\n      * Waits for a list of elements to be invisible or not present, or timeout.\n      */\n     public void waitForElementsToDisappear(List<WebElement> elements) {\n-        WebDriverWait wait = new WebDriverWait(browser.driver, TestProperties.TEST_TIMEOUT);\n-        wait.until(ExpectedConditions.invisibilityOfAllElements(elements));\n+        waitFor(ExpectedConditions.invisibilityOfAllElements(elements));\n     }\n \n     /**\n-     * Waits for an alert to appear on the page, up to the timeout specified.\n+     * Waits until there is no scrolling on the page. Note: The detection of whether the page is scrolling is coupled to our\n+     * own implementation of scrolling {@code (scrollTo.js)} and is not a true detection.\n+     * @throws org.openqa.selenium.TimeoutException if the timeout defined in {@link TestProperties#TEST_TIMEOUT} expires\n      */\n-    public void waitForAlertPresence() {\n-        WebDriverWait wait = new WebDriverWait(browser.driver, TestProperties.TEST_TIMEOUT);\n-        wait.until(ExpectedConditions.alertIsPresent());\n+    void waitForNoScrolling() {","path":"src/test/java/teammates/test/pageobjects/AppPage.java","position":228,"original_position":228,"commit_id":"ad97b2df3b1a93a0f36bc7f1649f11d37b4b7b97","original_commit_id":"c228a79d1d75e50964cebc829992e692b9beb1a8","user":{"login":"whipermr5","id":6811428,"avatar_url":"https://avatars0.githubusercontent.com/u/6811428?v=4","gravatar_id":"","url":"https://api.github.com/users/whipermr5","html_url":"https://github.com/whipermr5","followers_url":"https://api.github.com/users/whipermr5/followers","following_url":"https://api.github.com/users/whipermr5/following{/other_user}","gists_url":"https://api.github.com/users/whipermr5/gists{/gist_id}","starred_url":"https://api.github.com/users/whipermr5/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/whipermr5/subscriptions","organizations_url":"https://api.github.com/users/whipermr5/orgs","repos_url":"https://api.github.com/users/whipermr5/repos","events_url":"https://api.github.com/users/whipermr5/events{/privacy}","received_events_url":"https://api.github.com/users/whipermr5/received_events","type":"User","site_admin":false},"body":"If the page is not scrolling, it can be said that scrolling is complete.","created_at":"2018-04-24T12:43:07Z","updated_at":"2018-04-24T12:43:07Z","html_url":"https://github.com/TEAMMATES/teammates/pull/8296#discussion_r183713792","pull_request_url":"https://api.github.com/repos/TEAMMATES/teammates/pulls/8296","author_association":"OWNER","_links":{"self":{"href":"https://api.github.com/repos/TEAMMATES/teammates/pulls/comments/183713792"},"html":{"href":"https://github.com/TEAMMATES/teammates/pull/8296#discussion_r183713792"},"pull_request":{"href":"https://api.github.com/repos/TEAMMATES/teammates/pulls/8296"}},"in_reply_to_id":183616701},"pull_request":{"url":"https://api.github.com/repos/TEAMMATES/teammates/pulls/8296","id":162405939,"html_url":"https://github.com/TEAMMATES/teammates/pull/8296","diff_url":"https://github.com/TEAMMATES/teammates/pull/8296.diff","patch_url":"https://github.com/TEAMMATES/teammates/pull/8296.patch","issue_url":"https://api.github.com/repos/TEAMMATES/teammates/issues/8296","number":8296,"state":"open","locked":false,"title":"Improve general reliability of tests #8209","user":{"login":"LiHaoTan","id":13617389,"avatar_url":"https://avatars2.githubusercontent.com/u/13617389?v=4","gravatar_id":"","url":"https://api.github.com/users/LiHaoTan","html_url":"https://github.com/LiHaoTan","followers_url":"https://api.github.com/users/LiHaoTan/followers","following_url":"https://api.github.com/users/LiHaoTan/following{/other_user}","gists_url":"https://api.github.com/users/LiHaoTan/gists{/gist_id}","starred_url":"https://api.github.com/users/LiHaoTan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LiHaoTan/subscriptions","organizations_url":"https://api.github.com/users/LiHaoTan/orgs","repos_url":"https://api.github.com/users/LiHaoTan/repos","events_url":"https://api.github.com/users/LiHaoTan/events{/privacy}","received_events_url":"https://api.github.com/users/LiHaoTan/received_events","type":"User","site_admin":false},"body":"Fixes #8209\r\n\r\nThis addresses some of the problems in tests and the main aspects are:\r\n\r\n### Modals\r\n* Fixes improper handling of modals with regards to modal state, e.g. not waiting for the modal to open or close properly before performing other tasks\r\n* Fixes incorrect usage of modals (multiple modals are not supported by Bootstrap).\r\n\r\n### Text Input (c277335)\r\n* Do not fill input when modal state is inconsistent\r\n* Workaround for Firefox bug with regards to `change` events\r\n* Fix bug for filling rich text editors\r\n\r\n### Questions\r\n* Fix not waiting for question scroll animation to complete, which causes interference with other parts of tests such as clickability issues.\r\n\r\n### Using actual clicks (0005594)\r\n* The general approach taken is not to replace all `click(...)` with `WebElement#click()` but rather when there's ambiguity in test failure. Some further discussion is found at #8623\r\n\r\n### Status Messages (08aeb59)\r\n* The tracking issue for the root issue is #2620.\r\n---\r\nAppveyor Passing Build: https://ci.appveyor.com/project/LiHaoTan/teammates/build/1.0.161","created_at":"2018-01-11T15:04:28Z","updated_at":"2018-04-24T12:43:07Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4f870461a97a8a76ac80495606c7b71d5318fc2a","assignee":{"login":"whipermr5","id":6811428,"avatar_url":"https://avatars0.githubusercontent.com/u/6811428?v=4","gravatar_id":"","url":"https://api.github.com/users/whipermr5","html_url":"https://github.com/whipermr5","followers_url":"https://api.github.com/users/whipermr5/followers","following_url":"https://api.github.com/users/whipermr5/following{/other_user}","gists_url":"https://api.github.com/users/whipermr5/gists{/gist_id}","starred_url":"https://api.github.com/users/whipermr5/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/whipermr5/subscriptions","organizations_url":"https://api.github.com/users/whipermr5/orgs","repos_url":"https://api.github.com/users/whipermr5/repos","events_url":"https://api.github.com/users/whipermr5/events{/privacy}","received_events_url":"https://api.github.com/users/whipermr5/received_events","type":"User","site_admin":false},"assignees":[{"login":"whipermr5","id":6811428,"avatar_url":"https://avatars0.githubusercontent.com/u/6811428?v=4","gravatar_id":"","url":"https://api.github.com/users/whipermr5","html_url":"https://github.com/whipermr5","followers_url":"https://api.github.com/users/whipermr5/followers","following_url":"https://api.github.com/users/whipermr5/following{/other_user}","gists_url":"https://api.github.com/users/whipermr5/gists{/gist_id}","starred_url":"https://api.github.com/users/whipermr5/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/whipermr5/subscriptions","organizations_url":"https://api.github.com/users/whipermr5/orgs","repos_url":"https://api.github.com/users/whipermr5/repos","events_url":"https://api.github.com/users/whipermr5/events{/privacy}","received_events_url":"https://api.github.com/users/whipermr5/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":98049507,"url":"https://api.github.com/repos/TEAMMATES/teammates/labels/s.Ongoing","name":"s.Ongoing","color":"6BC471","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/TEAMMATES/teammates/pulls/8296/commits","review_comments_url":"https://api.github.com/repos/TEAMMATES/teammates/pulls/8296/comments","review_comment_url":"https://api.github.com/repos/TEAMMATES/teammates/pulls/comments{/number}","comments_url":"https://api.github.com/repos/TEAMMATES/teammates/issues/8296/comments","statuses_url":"https://api.github.com/repos/TEAMMATES/teammates/statuses/ad97b2df3b1a93a0f36bc7f1649f11d37b4b7b97","head":{"label":"LiHaoTan:8209-improve-modal-testing","ref":"8209-improve-modal-testing","sha":"ad97b2df3b1a93a0f36bc7f1649f11d37b4b7b97","user":{"login":"LiHaoTan","id":13617389,"avatar_url":"https://avatars2.githubusercontent.com/u/13617389?v=4","gravatar_id":"","url":"https://api.github.com/users/LiHaoTan","html_url":"https://github.com/LiHaoTan","followers_url":"https://api.github.com/users/LiHaoTan/followers","following_url":"https://api.github.com/users/LiHaoTan/following{/other_user}","gists_url":"https://api.github.com/users/LiHaoTan/gists{/gist_id}","starred_url":"https://api.github.com/users/LiHaoTan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LiHaoTan/subscriptions","organizations_url":"https://api.github.com/users/LiHaoTan/orgs","repos_url":"https://api.github.com/users/LiHaoTan/repos","events_url":"https://api.github.com/users/LiHaoTan/events{/privacy}","received_events_url":"https://api.github.com/users/LiHaoTan/received_events","type":"User","site_admin":false},"repo":{"id":83028850,"name":"teammates","full_name":"LiHaoTan/teammates","owner":{"login":"LiHaoTan","id":13617389,"avatar_url":"https://avatars2.githubusercontent.com/u/13617389?v=4","gravatar_id":"","url":"https://api.github.com/users/LiHaoTan","html_url":"https://github.com/LiHaoTan","followers_url":"https://api.github.com/users/LiHaoTan/followers","following_url":"https://api.github.com/users/LiHaoTan/following{/other_user}","gists_url":"https://api.github.com/users/LiHaoTan/gists{/gist_id}","starred_url":"https://api.github.com/users/LiHaoTan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LiHaoTan/subscriptions","organizations_url":"https://api.github.com/users/LiHaoTan/orgs","repos_url":"https://api.github.com/users/LiHaoTan/repos","events_url":"https://api.github.com/users/LiHaoTan/events{/privacy}","received_events_url":"https://api.github.com/users/LiHaoTan/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/LiHaoTan/teammates","description":"This is the project website for the TEAMMATES feedback management tool for education","fork":true,"url":"https://api.github.com/repos/LiHaoTan/teammates","forks_url":"https://api.github.com/repos/LiHaoTan/teammates/forks","keys_url":"https://api.github.com/repos/LiHaoTan/teammates/keys{/key_id}","collaborators_url":"https://api.github.com/repos/LiHaoTan/teammates/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/LiHaoTan/teammates/teams","hooks_url":"https://api.github.com/repos/LiHaoTan/teammates/hooks","issue_events_url":"https://api.github.com/repos/LiHaoTan/teammates/issues/events{/number}","events_url":"https://api.github.com/repos/LiHaoTan/teammates/events","assignees_url":"https://api.github.com/repos/LiHaoTan/teammates/assignees{/user}","branches_url":"https://api.github.com/repos/LiHaoTan/teammates/branches{/branch}","tags_url":"https://api.github.com/repos/LiHaoTan/teammates/tags","blobs_url":"https://api.github.com/repos/LiHaoTan/teammates/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/LiHaoTan/teammates/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/LiHaoTan/teammates/git/refs{/sha}","trees_url":"https://api.github.com/repos/LiHaoTan/teammates/git/trees{/sha}","statuses_url":"https://api.github.com/repos/LiHaoTan/teammates/statuses/{sha}","languages_url":"https://api.github.com/repos/LiHaoTan/teammates/languages","stargazers_url":"https://api.github.com/repos/LiHaoTan/teammates/stargazers","contributors_url":"https://api.github.com/repos/LiHaoTan/teammates/contributors","subscribers_url":"https://api.github.com/repos/LiHaoTan/teammates/subscribers","subscription_url":"https://api.github.com/repos/LiHaoTan/teammates/subscription","commits_url":"https://api.github.com/repos/LiHaoTan/teammates/commits{/sha}","git_commits_url":"https://api.github.com/repos/LiHaoTan/teammates/git/commits{/sha}","comments_url":"https://api.github.com/repos/LiHaoTan/teammates/comments{/number}","issue_comment_url":"https://api.github.com/repos/LiHaoTan/teammates/issues/comments{/number}","contents_url":"https://api.github.com/repos/LiHaoTan/teammates/contents/{+path}","compare_url":"https://api.github.com/repos/LiHaoTan/teammates/compare/{base}...{head}","merges_url":"https://api.github.com/repos/LiHaoTan/teammates/merges","archive_url":"https://api.github.com/repos/LiHaoTan/teammates/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/LiHaoTan/teammates/downloads","issues_url":"https://api.github.com/repos/LiHaoTan/teammates/issues{/number}","pulls_url":"https://api.github.com/repos/LiHaoTan/teammates/pulls{/number}","milestones_url":"https://api.github.com/repos/LiHaoTan/teammates/milestones{/number}","notifications_url":"https://api.github.com/repos/LiHaoTan/teammates/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/LiHaoTan/teammates/labels{/name}","releases_url":"https://api.github.com/repos/LiHaoTan/teammates/releases{/id}","deployments_url":"https://api.github.com/repos/LiHaoTan/teammates/deployments","created_at":"2017-02-24T10:11:40Z","updated_at":"2018-04-17T02:05:36Z","pushed_at":"2018-04-24T12:41:43Z","git_url":"git://github.com/LiHaoTan/teammates.git","ssh_url":"git@github.com:LiHaoTan/teammates.git","clone_url":"https://github.com/LiHaoTan/teammates.git","svn_url":"https://github.com/LiHaoTan/teammates","homepage":"http://teammatesv4.appspot.com/","size":195731,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"gpl-2.0","name":"GNU General Public License v2.0","spdx_id":"GPL-2.0","url":"https://api.github.com/licenses/gpl-2.0"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"TEAMMATES:master","ref":"master","sha":"7248edb70413d8133fd11382fdc255b639eb7a82","user":{"login":"TEAMMATES","id":7374810,"avatar_url":"https://avatars2.githubusercontent.com/u/7374810?v=4","gravatar_id":"","url":"https://api.github.com/users/TEAMMATES","html_url":"https://github.com/TEAMMATES","followers_url":"https://api.github.com/users/TEAMMATES/followers","following_url":"https://api.github.com/users/TEAMMATES/following{/other_user}","gists_url":"https://api.github.com/users/TEAMMATES/gists{/gist_id}","starred_url":"https://api.github.com/users/TEAMMATES/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/TEAMMATES/subscriptions","organizations_url":"https://api.github.com/users/TEAMMATES/orgs","repos_url":"https://api.github.com/users/TEAMMATES/repos","events_url":"https://api.github.com/users/TEAMMATES/events{/privacy}","received_events_url":"https://api.github.com/users/TEAMMATES/received_events","type":"Organization","site_admin":false},"repo":{"id":19369035,"name":"teammates","full_name":"TEAMMATES/teammates","owner":{"login":"TEAMMATES","id":7374810,"avatar_url":"https://avatars2.githubusercontent.com/u/7374810?v=4","gravatar_id":"","url":"https://api.github.com/users/TEAMMATES","html_url":"https://github.com/TEAMMATES","followers_url":"https://api.github.com/users/TEAMMATES/followers","following_url":"https://api.github.com/users/TEAMMATES/following{/other_user}","gists_url":"https://api.github.com/users/TEAMMATES/gists{/gist_id}","starred_url":"https://api.github.com/users/TEAMMATES/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/TEAMMATES/subscriptions","organizations_url":"https://api.github.com/users/TEAMMATES/orgs","repos_url":"https://api.github.com/users/TEAMMATES/repos","events_url":"https://api.github.com/users/TEAMMATES/events{/privacy}","received_events_url":"https://api.github.com/users/TEAMMATES/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/TEAMMATES/teammates","description":"This is the project website for the TEAMMATES feedback management tool for education","fork":false,"url":"https://api.github.com/repos/TEAMMATES/teammates","forks_url":"https://api.github.com/repos/TEAMMATES/teammates/forks","keys_url":"https://api.github.com/repos/TEAMMATES/teammates/keys{/key_id}","collaborators_url":"https://api.github.com/repos/TEAMMATES/teammates/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/TEAMMATES/teammates/teams","hooks_url":"https://api.github.com/repos/TEAMMATES/teammates/hooks","issue_events_url":"https://api.github.com/repos/TEAMMATES/teammates/issues/events{/number}","events_url":"https://api.github.com/repos/TEAMMATES/teammates/events","assignees_url":"https://api.github.com/repos/TEAMMATES/teammates/assignees{/user}","branches_url":"https://api.github.com/repos/TEAMMATES/teammates/branches{/branch}","tags_url":"https://api.github.com/repos/TEAMMATES/teammates/tags","blobs_url":"https://api.github.com/repos/TEAMMATES/teammates/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/TEAMMATES/teammates/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/TEAMMATES/teammates/git/refs{/sha}","trees_url":"https://api.github.com/repos/TEAMMATES/teammates/git/trees{/sha}","statuses_url":"https://api.github.com/repos/TEAMMATES/teammates/statuses/{sha}","languages_url":"https://api.github.com/repos/TEAMMATES/teammates/languages","stargazers_url":"https://api.github.com/repos/TEAMMATES/teammates/stargazers","contributors_url":"https://api.github.com/repos/TEAMMATES/teammates/contributors","subscribers_url":"https://api.github.com/repos/TEAMMATES/teammates/subscribers","subscription_url":"https://api.github.com/repos/TEAMMATES/teammates/subscription","commits_url":"https://api.github.com/repos/TEAMMATES/teammates/commits{/sha}","git_commits_url":"https://api.github.com/repos/TEAMMATES/teammates/git/commits{/sha}","comments_url":"https://api.github.com/repos/TEAMMATES/teammates/comments{/number}","issue_comment_url":"https://api.github.com/repos/TEAMMATES/teammates/issues/comments{/number}","contents_url":"https://api.github.com/repos/TEAMMATES/teammates/contents/{+path}","compare_url":"https://api.github.com/repos/TEAMMATES/teammates/compare/{base}...{head}","merges_url":"https://api.github.com/repos/TEAMMATES/teammates/merges","archive_url":"https://api.github.com/repos/TEAMMATES/teammates/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/TEAMMATES/teammates/downloads","issues_url":"https://api.github.com/repos/TEAMMATES/teammates/issues{/number}","pulls_url":"https://api.github.com/repos/TEAMMATES/teammates/pulls{/number}","milestones_url":"https://api.github.com/repos/TEAMMATES/teammates/milestones{/number}","notifications_url":"https://api.github.com/repos/TEAMMATES/teammates/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/TEAMMATES/teammates/labels{/name}","releases_url":"https://api.github.com/repos/TEAMMATES/teammates/releases{/id}","deployments_url":"https://api.github.com/repos/TEAMMATES/teammates/deployments","created_at":"2014-05-02T07:43:00Z","updated_at":"2018-04-24T03:04:11Z","pushed_at":"2018-04-24T12:41:45Z","git_url":"git://github.com/TEAMMATES/teammates.git","ssh_url":"git@github.com:TEAMMATES/teammates.git","clone_url":"https://github.com/TEAMMATES/teammates.git","svn_url":"https://github.com/TEAMMATES/teammates","homepage":"https://teammatesv4.appspot.com/","size":197306,"stargazers_count":589,"watchers_count":589,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":1386,"mirror_url":null,"archived":false,"open_issues_count":257,"license":{"key":"gpl-2.0","name":"GNU General Public License v2.0","spdx_id":"GPL-2.0","url":"https://api.github.com/licenses/gpl-2.0"},"forks":1386,"open_issues":257,"watchers":589,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/TEAMMATES/teammates/pulls/8296"},"html":{"href":"https://github.com/TEAMMATES/teammates/pull/8296"},"issue":{"href":"https://api.github.com/repos/TEAMMATES/teammates/issues/8296"},"comments":{"href":"https://api.github.com/repos/TEAMMATES/teammates/issues/8296/comments"},"review_comments":{"href":"https://api.github.com/repos/TEAMMATES/teammates/pulls/8296/comments"},"review_comment":{"href":"https://api.github.com/repos/TEAMMATES/teammates/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/TEAMMATES/teammates/pulls/8296/commits"},"statuses":{"href":"https://api.github.com/repos/TEAMMATES/teammates/statuses/ad97b2df3b1a93a0f36bc7f1649f11d37b4b7b97"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"whipermr5"}}