{"action":"created","comment":{"url":"https://api.github.com/repos/oppia/oppia/pulls/comments/59131575","id":59131575,"diff_hunk":"@@ -3057,3 +3057,148 @@ def test_reject_actioned_suggestion(self):\n             with self.assertRaisesRegexp(Exception, exception_message):\n                 exp_services.reject_suggestion(\n                     self.editor_id, self.THREAD_ID1, self.EXP_ID2)\n+\n+\n+class EditorAutoSavingUnitTests(test_utils.GenericTestBase):\n+    \"\"\"Test editor auto saving functions in exp_services.\"\"\"\n+\n+    EXP_ID1 = 'exp_id1'\n+    EXP_ID2 = 'exp_id2'\n+    EXP_ID3 = 'exp_id3'\n+    USERNAME = 'user123'\n+    USER_ID = 'user_id'\n+    COMMIT_MESSAGE = 'commit message'\n+    DATETIME = datetime.datetime.strptime('2016-02-16', '%Y-%m-%d')\n+    OLDER_DATETIME = datetime.datetime.strptime('2016-01-16', '%Y-%m-%d')\n+    NEWER_DATETIME = datetime.datetime.strptime('2016-03-16', '%Y-%m-%d')\n+    draft_change_list = []\n+    NEW_CHANGELIST = [{\n+        'cmd': 'edit_exploration_property',\n+        'property_name': 'title',\n+        'new_value': 'New title'}]\n+\n+    def setUp(self):\n+        super(EditorAutoSavingUnitTests, self).setUp()\n+        # Create explorations.\n+        exploration = self.save_new_valid_exploration(\n+            self.EXP_ID1, self.USER_ID)\n+        exploration.param_specs = {\n+            'myParam': param_domain.ParamSpec('UnicodeString')}\n+        exp_services._save_exploration(self.USER_ID, exploration, '', [])\n+        self.save_new_valid_exploration(self.EXP_ID2, self.USER_ID)\n+        self.save_new_valid_exploration(self.EXP_ID3, self.USER_ID)\n+        self.init_state_name = exploration.init_state_name\n+        self.param_changes = [{\n+            'customization_args': {\n+                'list_of_values': ['1', '2'], 'parse_with_jinja': False\n+            },\n+            'name': 'myParam',\n+            'generator_id': 'RandomSelector'\n+        }]\n+        self.draft_change_list = _get_change_list(\n+            self.init_state_name, 'param_changes', self.param_changes)\n+        # Explorations with draft set.\n+        user_models.ExplorationUserDataModel(\n+            id='%s.%s' % (self.USER_ID, self.EXP_ID1), user_id=self.USER_ID,\n+            exploration_id=self.EXP_ID1,\n+            draft_change_list=self.draft_change_list,\n+            draft_change_list_last_updated=self.DATETIME,\n+            draft_change_list_exp_version=2).put()\n+        user_models.ExplorationUserDataModel(\n+            id='%s.%s' % (self.USER_ID, self.EXP_ID2), user_id=self.USER_ID,\n+            exploration_id=self.EXP_ID2,\n+            draft_change_list=self.draft_change_list,\n+            draft_change_list_last_updated=self.DATETIME,\n+            draft_change_list_exp_version=4).put()\n+        # Exploration with no draft.\n+        user_models.ExplorationUserDataModel(\n+            id='%s.%s' % (self.USER_ID, self.EXP_ID3), user_id=self.USER_ID,\n+            exploration_id=self.EXP_ID3).put()\n+\n+    def _empty_method(self, strict):\n+        pass\n+\n+    def _get_exp_domain_object(self, unused_exp_id, unused_change_list):\n+        return exp_domain.Exploration.create_default_exploration(\n+            self.EXP_ID1, 'A title', 'A category')\n+\n+    def test_draft_cleared_after_change_list_applied(self):\n+        exp_services.update_exploration(\n+            self.USER_ID, self.EXP_ID1, self.draft_change_list, '')\n+        exp_user_data = user_models.ExplorationUserDataModel.get_by_id(\n+            '%s.%s' % (self.USER_ID, self.EXP_ID1))\n+        self.assertIsNone(exp_user_data.draft_change_list)\n+        self.assertIsNone(exp_user_data.draft_change_list_last_updated)\n+        self.assertIsNone(exp_user_data.draft_change_list_exp_version)\n+\n+    def test_draft_version_valid_true(self):\n+        self.assertTrue(exp_services.is_draft_version_valid(\n+            self.EXP_ID1, self.USER_ID))\n+\n+    def test_draft_version_valid_false(self):\n+        self.assertFalse(exp_services.is_draft_version_valid(\n+            self.EXP_ID2, self.USER_ID))\n+\n+    def test_create_or_update_draft_older_draft_exists(self):\n+        with self.swap(exp_domain.Exploration, 'validate',\n+                       self._empty_method):\n+            exp_services.create_or_update_draft(\n+                self.EXP_ID1, self.USER_ID, self.NEW_CHANGELIST, 5,\n+                self.NEWER_DATETIME)\n+        exp_user_data = user_models.ExplorationUserDataModel.get(\n+            self.USER_ID, self.EXP_ID1)\n+        self.assertEqual(exp_user_data.exploration_id, self.EXP_ID1)\n+        self.assertEqual(\n+            exp_user_data.draft_change_list, self.NEW_CHANGELIST)\n+        self.assertEqual(exp_user_data.draft_change_list_last_updated,\n+                         self.NEWER_DATETIME)\n+        self.assertEqual(exp_user_data.draft_change_list_exp_version, 5)\n+\n+    def test_create_or_update_draft_newer_draft_exists(self):\n+        exp_services.create_or_update_draft(\n+            self.EXP_ID1, self.USER_ID, self.NEW_CHANGELIST, 5,\n+            self.OLDER_DATETIME)\n+        user_exp = user_models.ExplorationUserDataModel.get(\n+            self.USER_ID, self.EXP_ID1)\n+        self.assertEqual(user_exp.exploration_id, self.EXP_ID1)\n+        self.assertEqual(user_exp.draft_change_list, self.draft_change_list)\n+        self.assertEqual(\n+            user_exp.draft_change_list_last_updated, self.DATETIME)\n+        self.assertEqual(user_exp.draft_change_list_exp_version, 2)\n+\n+    def test_create_or_update_draft_draft_does_not_exist(self):\n+        with self.swap(exp_services, 'apply_change_list',\n+                       self._get_exp_domain_object):\n+            with self.swap(exp_domain.Exploration, 'validate',\n+                           self._empty_method):\n+                exp_services.create_or_update_draft(\n+                    self.EXP_ID3, self.USER_ID, self.NEW_CHANGELIST, 5,\n+                    self.NEWER_DATETIME)\n+        exp_user_data = user_models.ExplorationUserDataModel.get(\n+            self.USER_ID, self.EXP_ID3)\n+        self.assertEqual(exp_user_data.exploration_id, self.EXP_ID3)\n+        self.assertEqual(\n+            exp_user_data.draft_change_list, self.NEW_CHANGELIST)\n+        self.assertEqual(exp_user_data.draft_change_list_last_updated,\n+                         self.NEWER_DATETIME)\n+        self.assertEqual(exp_user_data.draft_change_list_exp_version, 5)\n+\n+    def test_get_exp_with_draft_applied_draft_exists(self):\n+        apply_change_list_counter = test_utils.CallCounter(\n+            self._get_exp_domain_object)\n+        with self.swap(exp_services, 'apply_change_list',\n+                       apply_change_list_counter):\n+            exp_services.get_exp_with_draft_applied(","path":"core/domain/exp_services_test.py","position":null,"original_position":146,"commit_id":"ad341671f9f762aa17d25ae5ec3e55ef54ba1549","original_commit_id":"0694d139388cf01f58264f3fa0e4150598e662f5","user":{"login":"seanlip","id":10575562,"avatar_url":"https://avatars.githubusercontent.com/u/10575562?v=3","gravatar_id":"","url":"https://api.github.com/users/seanlip","html_url":"https://github.com/seanlip","followers_url":"https://api.github.com/users/seanlip/followers","following_url":"https://api.github.com/users/seanlip/following{/other_user}","gists_url":"https://api.github.com/users/seanlip/gists{/gist_id}","starred_url":"https://api.github.com/users/seanlip/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/seanlip/subscriptions","organizations_url":"https://api.github.com/users/seanlip/orgs","repos_url":"https://api.github.com/users/seanlip/repos","events_url":"https://api.github.com/users/seanlip/events{/privacy}","received_events_url":"https://api.github.com/users/seanlip/received_events","type":"User","site_admin":false},"body":"Yep -- that was what I intended by the comment.","created_at":"2016-04-10T10:49:16Z","updated_at":"2016-04-10T10:49:16Z","html_url":"https://github.com/oppia/oppia/pull/1657#discussion_r59131575","pull_request_url":"https://api.github.com/repos/oppia/oppia/pulls/1657","_links":{"self":{"href":"https://api.github.com/repos/oppia/oppia/pulls/comments/59131575"},"html":{"href":"https://github.com/oppia/oppia/pull/1657#discussion_r59131575"},"pull_request":{"href":"https://api.github.com/repos/oppia/oppia/pulls/1657"}}},"pull_request":{"url":"https://api.github.com/repos/oppia/oppia/pulls/1657","id":64509815,"html_url":"https://github.com/oppia/oppia/pull/1657","diff_url":"https://github.com/oppia/oppia/pull/1657.diff","patch_url":"https://github.com/oppia/oppia/pull/1657.patch","issue_url":"https://api.github.com/repos/oppia/oppia/issues/1657","number":1657,"state":"open","locked":false,"title":"Domain layer for editor auto saving.","user":{"login":"sbhowmik89","id":8260362,"avatar_url":"https://avatars.githubusercontent.com/u/8260362?v=3","gravatar_id":"","url":"https://api.github.com/users/sbhowmik89","html_url":"https://github.com/sbhowmik89","followers_url":"https://api.github.com/users/sbhowmik89/followers","following_url":"https://api.github.com/users/sbhowmik89/following{/other_user}","gists_url":"https://api.github.com/users/sbhowmik89/gists{/gist_id}","starred_url":"https://api.github.com/users/sbhowmik89/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sbhowmik89/subscriptions","organizations_url":"https://api.github.com/users/sbhowmik89/orgs","repos_url":"https://api.github.com/users/sbhowmik89/repos","events_url":"https://api.github.com/users/sbhowmik89/events{/privacy}","received_events_url":"https://api.github.com/users/sbhowmik89/received_events","type":"User","site_admin":false},"body":"Domain layer for editor services. Please discard the previous pull request for the same. The fork was out of sync and had several merging issues. ","created_at":"2016-03-29T18:18:26Z","updated_at":"2016-04-10T10:49:16Z","closed_at":null,"merged_at":null,"merge_commit_sha":"96d7ac3c129b77469cc88eb97ab4950c5b99b88a","assignee":{"login":"seanlip","id":10575562,"avatar_url":"https://avatars.githubusercontent.com/u/10575562?v=3","gravatar_id":"","url":"https://api.github.com/users/seanlip","html_url":"https://github.com/seanlip","followers_url":"https://api.github.com/users/seanlip/followers","following_url":"https://api.github.com/users/seanlip/following{/other_user}","gists_url":"https://api.github.com/users/seanlip/gists{/gist_id}","starred_url":"https://api.github.com/users/seanlip/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/seanlip/subscriptions","organizations_url":"https://api.github.com/users/seanlip/orgs","repos_url":"https://api.github.com/users/seanlip/repos","events_url":"https://api.github.com/users/seanlip/events{/privacy}","received_events_url":"https://api.github.com/users/seanlip/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/oppia/oppia/pulls/1657/commits","review_comments_url":"https://api.github.com/repos/oppia/oppia/pulls/1657/comments","review_comment_url":"https://api.github.com/repos/oppia/oppia/pulls/comments{/number}","comments_url":"https://api.github.com/repos/oppia/oppia/issues/1657/comments","statuses_url":"https://api.github.com/repos/oppia/oppia/statuses/ad341671f9f762aa17d25ae5ec3e55ef54ba1549","head":{"label":"sbhowmik89:editorservices","ref":"editorservices","sha":"ad341671f9f762aa17d25ae5ec3e55ef54ba1549","user":{"login":"sbhowmik89","id":8260362,"avatar_url":"https://avatars.githubusercontent.com/u/8260362?v=3","gravatar_id":"","url":"https://api.github.com/users/sbhowmik89","html_url":"https://github.com/sbhowmik89","followers_url":"https://api.github.com/users/sbhowmik89/followers","following_url":"https://api.github.com/users/sbhowmik89/following{/other_user}","gists_url":"https://api.github.com/users/sbhowmik89/gists{/gist_id}","starred_url":"https://api.github.com/users/sbhowmik89/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sbhowmik89/subscriptions","organizations_url":"https://api.github.com/users/sbhowmik89/orgs","repos_url":"https://api.github.com/users/sbhowmik89/repos","events_url":"https://api.github.com/users/sbhowmik89/events{/privacy}","received_events_url":"https://api.github.com/users/sbhowmik89/received_events","type":"User","site_admin":false},"repo":{"id":54997827,"name":"oppia","full_name":"sbhowmik89/oppia","owner":{"login":"sbhowmik89","id":8260362,"avatar_url":"https://avatars.githubusercontent.com/u/8260362?v=3","gravatar_id":"","url":"https://api.github.com/users/sbhowmik89","html_url":"https://github.com/sbhowmik89","followers_url":"https://api.github.com/users/sbhowmik89/followers","following_url":"https://api.github.com/users/sbhowmik89/following{/other_user}","gists_url":"https://api.github.com/users/sbhowmik89/gists{/gist_id}","starred_url":"https://api.github.com/users/sbhowmik89/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sbhowmik89/subscriptions","organizations_url":"https://api.github.com/users/sbhowmik89/orgs","repos_url":"https://api.github.com/users/sbhowmik89/repos","events_url":"https://api.github.com/users/sbhowmik89/events{/privacy}","received_events_url":"https://api.github.com/users/sbhowmik89/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/sbhowmik89/oppia","description":"Tool for collaboratively building intelligent tutors.","fork":true,"url":"https://api.github.com/repos/sbhowmik89/oppia","forks_url":"https://api.github.com/repos/sbhowmik89/oppia/forks","keys_url":"https://api.github.com/repos/sbhowmik89/oppia/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sbhowmik89/oppia/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sbhowmik89/oppia/teams","hooks_url":"https://api.github.com/repos/sbhowmik89/oppia/hooks","issue_events_url":"https://api.github.com/repos/sbhowmik89/oppia/issues/events{/number}","events_url":"https://api.github.com/repos/sbhowmik89/oppia/events","assignees_url":"https://api.github.com/repos/sbhowmik89/oppia/assignees{/user}","branches_url":"https://api.github.com/repos/sbhowmik89/oppia/branches{/branch}","tags_url":"https://api.github.com/repos/sbhowmik89/oppia/tags","blobs_url":"https://api.github.com/repos/sbhowmik89/oppia/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sbhowmik89/oppia/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sbhowmik89/oppia/git/refs{/sha}","trees_url":"https://api.github.com/repos/sbhowmik89/oppia/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sbhowmik89/oppia/statuses/{sha}","languages_url":"https://api.github.com/repos/sbhowmik89/oppia/languages","stargazers_url":"https://api.github.com/repos/sbhowmik89/oppia/stargazers","contributors_url":"https://api.github.com/repos/sbhowmik89/oppia/contributors","subscribers_url":"https://api.github.com/repos/sbhowmik89/oppia/subscribers","subscription_url":"https://api.github.com/repos/sbhowmik89/oppia/subscription","commits_url":"https://api.github.com/repos/sbhowmik89/oppia/commits{/sha}","git_commits_url":"https://api.github.com/repos/sbhowmik89/oppia/git/commits{/sha}","comments_url":"https://api.github.com/repos/sbhowmik89/oppia/comments{/number}","issue_comment_url":"https://api.github.com/repos/sbhowmik89/oppia/issues/comments{/number}","contents_url":"https://api.github.com/repos/sbhowmik89/oppia/contents/{+path}","compare_url":"https://api.github.com/repos/sbhowmik89/oppia/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sbhowmik89/oppia/merges","archive_url":"https://api.github.com/repos/sbhowmik89/oppia/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sbhowmik89/oppia/downloads","issues_url":"https://api.github.com/repos/sbhowmik89/oppia/issues{/number}","pulls_url":"https://api.github.com/repos/sbhowmik89/oppia/pulls{/number}","milestones_url":"https://api.github.com/repos/sbhowmik89/oppia/milestones{/number}","notifications_url":"https://api.github.com/repos/sbhowmik89/oppia/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sbhowmik89/oppia/labels{/name}","releases_url":"https://api.github.com/repos/sbhowmik89/oppia/releases{/id}","deployments_url":"https://api.github.com/repos/sbhowmik89/oppia/deployments","created_at":"2016-03-29T17:51:19Z","updated_at":"2016-03-29T17:51:22Z","pushed_at":"2016-04-10T09:31:40Z","git_url":"git://github.com/sbhowmik89/oppia.git","ssh_url":"git@github.com:sbhowmik89/oppia.git","clone_url":"https://github.com/sbhowmik89/oppia.git","svn_url":"https://github.com/sbhowmik89/oppia","homepage":"https://www.oppia.org","size":42773,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":false,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"develop"}},"base":{"label":"oppia:develop","ref":"develop","sha":"d73303243f46f445731a0dfa8f32a7b6dc33db72","user":{"login":"oppia","id":11620230,"avatar_url":"https://avatars.githubusercontent.com/u/11620230?v=3","gravatar_id":"","url":"https://api.github.com/users/oppia","html_url":"https://github.com/oppia","followers_url":"https://api.github.com/users/oppia/followers","following_url":"https://api.github.com/users/oppia/following{/other_user}","gists_url":"https://api.github.com/users/oppia/gists{/gist_id}","starred_url":"https://api.github.com/users/oppia/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/oppia/subscriptions","organizations_url":"https://api.github.com/users/oppia/orgs","repos_url":"https://api.github.com/users/oppia/repos","events_url":"https://api.github.com/users/oppia/events{/privacy}","received_events_url":"https://api.github.com/users/oppia/received_events","type":"Organization","site_admin":false},"repo":{"id":40687563,"name":"oppia","full_name":"oppia/oppia","owner":{"login":"oppia","id":11620230,"avatar_url":"https://avatars.githubusercontent.com/u/11620230?v=3","gravatar_id":"","url":"https://api.github.com/users/oppia","html_url":"https://github.com/oppia","followers_url":"https://api.github.com/users/oppia/followers","following_url":"https://api.github.com/users/oppia/following{/other_user}","gists_url":"https://api.github.com/users/oppia/gists{/gist_id}","starred_url":"https://api.github.com/users/oppia/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/oppia/subscriptions","organizations_url":"https://api.github.com/users/oppia/orgs","repos_url":"https://api.github.com/users/oppia/repos","events_url":"https://api.github.com/users/oppia/events{/privacy}","received_events_url":"https://api.github.com/users/oppia/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/oppia/oppia","description":"Tool for collaboratively building intelligent tutors.","fork":false,"url":"https://api.github.com/repos/oppia/oppia","forks_url":"https://api.github.com/repos/oppia/oppia/forks","keys_url":"https://api.github.com/repos/oppia/oppia/keys{/key_id}","collaborators_url":"https://api.github.com/repos/oppia/oppia/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/oppia/oppia/teams","hooks_url":"https://api.github.com/repos/oppia/oppia/hooks","issue_events_url":"https://api.github.com/repos/oppia/oppia/issues/events{/number}","events_url":"https://api.github.com/repos/oppia/oppia/events","assignees_url":"https://api.github.com/repos/oppia/oppia/assignees{/user}","branches_url":"https://api.github.com/repos/oppia/oppia/branches{/branch}","tags_url":"https://api.github.com/repos/oppia/oppia/tags","blobs_url":"https://api.github.com/repos/oppia/oppia/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/oppia/oppia/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/oppia/oppia/git/refs{/sha}","trees_url":"https://api.github.com/repos/oppia/oppia/git/trees{/sha}","statuses_url":"https://api.github.com/repos/oppia/oppia/statuses/{sha}","languages_url":"https://api.github.com/repos/oppia/oppia/languages","stargazers_url":"https://api.github.com/repos/oppia/oppia/stargazers","contributors_url":"https://api.github.com/repos/oppia/oppia/contributors","subscribers_url":"https://api.github.com/repos/oppia/oppia/subscribers","subscription_url":"https://api.github.com/repos/oppia/oppia/subscription","commits_url":"https://api.github.com/repos/oppia/oppia/commits{/sha}","git_commits_url":"https://api.github.com/repos/oppia/oppia/git/commits{/sha}","comments_url":"https://api.github.com/repos/oppia/oppia/comments{/number}","issue_comment_url":"https://api.github.com/repos/oppia/oppia/issues/comments{/number}","contents_url":"https://api.github.com/repos/oppia/oppia/contents/{+path}","compare_url":"https://api.github.com/repos/oppia/oppia/compare/{base}...{head}","merges_url":"https://api.github.com/repos/oppia/oppia/merges","archive_url":"https://api.github.com/repos/oppia/oppia/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/oppia/oppia/downloads","issues_url":"https://api.github.com/repos/oppia/oppia/issues{/number}","pulls_url":"https://api.github.com/repos/oppia/oppia/pulls{/number}","milestones_url":"https://api.github.com/repos/oppia/oppia/milestones{/number}","notifications_url":"https://api.github.com/repos/oppia/oppia/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/oppia/oppia/labels{/name}","releases_url":"https://api.github.com/repos/oppia/oppia/releases{/id}","deployments_url":"https://api.github.com/repos/oppia/oppia/deployments","created_at":"2015-08-14T00:16:14Z","updated_at":"2016-04-10T04:54:38Z","pushed_at":"2016-04-10T09:31:40Z","git_url":"git://github.com/oppia/oppia.git","ssh_url":"git@github.com:oppia/oppia.git","clone_url":"https://github.com/oppia/oppia.git","svn_url":"https://github.com/oppia/oppia","homepage":"https://www.oppia.org","size":74864,"stargazers_count":115,"watchers_count":115,"language":"Python","has_issues":true,"has_downloads":false,"has_wiki":true,"has_pages":false,"forks_count":182,"mirror_url":null,"open_issues_count":284,"forks":182,"open_issues":284,"watchers":115,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/oppia/oppia/pulls/1657"},"html":{"href":"https://github.com/oppia/oppia/pull/1657"},"issue":{"href":"https://api.github.com/repos/oppia/oppia/issues/1657"},"comments":{"href":"https://api.github.com/repos/oppia/oppia/issues/1657/comments"},"review_comments":{"href":"https://api.github.com/repos/oppia/oppia/pulls/1657/comments"},"review_comment":{"href":"https://api.github.com/repos/oppia/oppia/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/oppia/oppia/pulls/1657/commits"},"statuses":{"href":"https://api.github.com/repos/oppia/oppia/statuses/ad341671f9f762aa17d25ae5ec3e55ef54ba1549"}}}}