{"action":"created","comment":{"url":"https://api.github.com/repos/edx/edx-analytics-pipeline/pulls/comments/47031652","id":47031652,"diff_hunk":"@@ -0,0 +1,209 @@\n+from edx.analytics.tasks.tests import unittest\n+from edx.analytics.tasks.tests.target import FakeTarget\n+import edx.analytics.tasks.deidentify_dumps as deid\n+import edx.analytics.tasks.util.opaque_key_util as opaque_key_util\n+\n+from mock import MagicMock\n+from mock import sentinel\n+\n+import json\n+import tempfile\n+import os\n+import shutil\n+\n+\n+class TestDataDeidentification(unittest.TestCase):\n+\n+    def run_task(self, task_cls, source):\n+        task = task_cls(\n+            course=sentinel.ignored,\n+            output_directory=sentinel.ignored,\n+            data_directory=sentinel.ignored,\n+        )\n+\n+        fake_input = [FakeTarget(value=source)]\n+        task.input = MagicMock(return_value=fake_input)\n+\n+        output_target = FakeTarget()\n+        task.output = MagicMock(return_value=output_target)\n+\n+        task.run()\n+        return output_target.buffer.read()\n+\n+    def reformat(self, data):\n+        \"\"\"Reformat data to make it like a TSV.\"\"\"\n+        return \"\\n\".join([\"\\t\".join(row) for row in data]) + '\\n'\n+\n+    def check_output(self, cls, input_value, expected_value):\n+        output = self.run_task(task_cls=cls, source=self.reformat(input_value))\n+        self.assertEquals(output, self.reformat(expected_value))\n+\n+    def test_auth_user_deidentification(self):\n+        header = ['id', 'username', 'first_name', 'last_name', 'email', 'password', 'is_staff', 'is_active', 'is_superuser', 'last_login', 'date_joined', 'status', 'email_key', 'avatar_type', 'country', 'show_country', 'date_of_birth', 'interesting_tags', 'ignored_tags', 'email_tag_filter_strategy', 'display_tag_filter_strategy', 'consecutive_days_visit_count'] \n+        data = [\n+            header,\n+            ['123456', 'JohnDoe', 'John', 'Doe', 'johndoe@edx.org', '', '1', '1', '0', '2015-11-15 22:08:37', '2013-07-08 14:42:50', '', 'NULL', '', '', '0', 'NULL', '', '', '0', '0', '0']\n+        ]\n+        expected = [\n+            header,\n+            ['273678626', 'username_273678626', '', '', '', '', '1', '1', '0', '2015-11-15 22:08:37', '2013-07-08 14:42:50', '', '', '', '', '', '', '', '', '', '', '']\n+        ]\n+        self.check_output(deid.DeidentifyAuthUserTask, data, expected)\n+\n+    def test_auth_user_profile_deidentification(self):\n+        header = ['id', 'user_id', 'name', 'language', 'location', 'meta', 'courseware', 'gender', 'mailing_address', 'year_of_birth', 'level_of_education', 'goals', 'allow_certificate', 'country', 'city', 'bio', 'profile_image_uploaded_at']\n+        data = [\n+            header,\n+            ['123', '123456', 'John Doe', 'English', 'Batcave, USA', '{\"old_names\": [[\"old name\", \"Name change\", \"2015-09-07T02:30:17.735773+00:00\"]]}', 'course.xml', 'm', '4th Street', '1984', 'hs', 'To be someone', '0', 'NA', 'ID', 'I like to code', '2015-11-21 22:17:57']\n+        ]\n+        expected = [\n+            header,\n+            ['123', '273678626', '', '', '', '', '', 'm', '', '1984', 'hs', 'To be someone', '1', 'NA', '', '', '2015-11-21 22:17:57']\n+        ]\n+        self.check_output(deid.DeidentifyAuthUserProfileTask, data, expected)\n+\n+    def test_student_course_enrollment_deidentification(self):\n+        header = ['id', 'user_id', 'course_id', 'created', 'is_active', 'mode']\n+        data = [\n+            header,\n+            ['123', '123456', 'course-v1:edX+DemoX+Test_2014', '2015-07-16 19:19:10', '1', 'honor'],\n+            ['124', '123457', 'course-v1:edX+DemoX+Test_2014', '2015-07-28 12:41:13', '0', 'verified'],\n+        ]\n+        expected = [\n+            header,\n+            ['123', '273678626', 'course-v1:edX+DemoX+Test_2014', '2015-07-16 19:19:10', '1', 'honor'],\n+            ['124', '273680674', 'course-v1:edX+DemoX+Test_2014', '2015-07-28 12:41:13', '0', 'verified'],\n+        ]\n+        self.check_output(deid.DeidentifyStudentCourseEnrollmentTask, data, expected)\n+\n+    def test_student_language_proficiency_deidentification(self):\n+        header = ['id', 'user_profile_id', 'code']\n+        data = [\n+            header,\n+            ['1', '145', 'en'],\n+            ['2', '941', 'zh'],\n+            ['3', '81724', 'ar'],\n+        ]\n+        expected = [\n+            header,\n+            ['1', '145', 'en'],\n+            ['2', '941', 'zh'],\n+            ['3', '81724', 'ar'],\n+        ]\n+        self.check_output(deid.DeidentifyStudentLanguageProficiencyTask, data, expected)\n+\n+    def test_courseware_student_module_deidentification(self):\n+        header = ['id', 'module_type', 'module_id', 'student_id', 'state', 'grade', 'created', 'modified', 'max_grade', 'done', 'course_id']\n+        data = [\n+            header,\n+            ['1', 'problem', 'block-v1:edX+DemoX+Test_2014+type@problem+block@123091b4012312r210r120r12r', '123456', '{\"attempts\": 1, \"seed\": 1, \"done\": true}', '0', '2015-10-13 19:22:24', '2015-10-13 19:40:20', '1', 'na', 'course-v1:edX+DemoX+Test_2014'],\n+        ]\n+        expected = [\n+            header,\n+            ['1', 'problem', 'block-v1:edX+DemoX+Test_2014+type@problem+block@123091b4012312r210r120r12r', '273678626', '{\"attempts\": 1, \"seed\": 1, \"done\": true}', '0', '2015-10-13 19:22:24', '2015-10-13 19:40:20', '1', 'na', 'course-v1:edX+DemoX+Test_2014'],\n+        ]\n+        self.check_output(deid.DeidentifyCoursewareStudentModule, data, expected)\n+\n+    def test_certificates_generated_certificate_deidentification(self):\n+        header = ['id', 'user_id', 'download_url', 'grade', 'course_id', 'key', 'distinction', 'status', 'verify_uuid', 'download_uuid', 'name', 'created_date', 'modified_date', 'error_reason', 'mode']\n+        data = [\n+            header,\n+            ['1', '123456', 'some_url', '0.21', 'course-v1:edX+DemoX+Test_2014', 'key', '0', 'notpassing', 'verify_uuid', 'download_uuid', 'John Doe', '2015-10-16 12:53:49', '2015-10-16 12:53:49', 'error_reason', 'honor']\n+        ]\n+        expected = [\n+            header,\n+            ['1', '273678626', '', '0.21', 'course-v1:edX+DemoX+Test_2014', 'key', '0', 'notpassing', '', '', '', '2015-10-16 12:53:49', '2015-10-16 12:53:49', '', 'honor']\n+        ]\n+        self.check_output(deid.DeidentifyCertificatesGeneratedCertificate, data, expected)\n+\n+    def test_teams_deidentification(self):\n+        header = ['id', 'team_id', 'name', 'course_id', 'topic_id', 'date_created', 'description', 'country', 'language', 'discussion_topic_id', 'last_activity_at', 'team_size']\n+        data = [\n+            header,\n+            ['1', 'A-Team-8883d3b43094f0e9e6ec7e190e7600e', 'A Team', 'course-v1:edX+DemoX+Test_2014', 'some_topic', '2015-10-13 13:14:41', 'description', 'GB', 'en', 'topic_id', '2015-10-31 21:32:17', '8']\n+        ]\n+        expected = [\n+            header,\n+            ['1', 'A-Team-8883d3b43094f0e9e6ec7e190e7600e', 'A Team', 'course-v1:edX+DemoX+Test_2014', 'some_topic', '2015-10-13 13:14:41', 'description', 'GB', 'en', 'topic_id', '2015-10-31 21:32:17', '8']\n+        ]\n+        self.check_output(deid.DeidentifyTeamsTask, data, expected)\n+\n+    def test_teams_membership_deidentification(self):\n+        header = ['id', 'user_id', 'team_id', 'date_joined', 'last_activity_at']\n+        data = [\n+            header,\n+            ['1', '123456', '1', '2015-10-13 13:14:41', '2015-10-14 18:41:24']\n+        ]\n+        expected = [\n+            header,\n+            ['1', '273678626', '1', '2015-10-13 13:14:41', '2015-10-14 18:41:24']\n+        ]\n+        self.check_output(deid.DeidentifyTeamsMembershipTask, data, expected)\n+\n+    def test_verification_status_deidentification(self):\n+        header = ['timestamp', 'status', 'course_id', 'checkpoint_location', 'user_id']\n+        data = [\n+            header,\n+            ['2015-09-03 07:19:10', 'submitted', 'course-v1:edX+DemoX+Test_2014', 'block-v1:edX+DemoX+Test_2014+type@edx', '123456']\n+        ]\n+        expected = [\n+            header,\n+            ['2015-09-03 07:19:10', 'submitted', 'course-v1:edX+DemoX+Test_2014', 'block-v1:edX+DemoX+Test_2014+type@edx', '273678626']\n+        ]\n+        self.check_output(deid.DeidentifyVerificationStatusTask, data, expected)\n+\n+    def test_wiki_article_deidentification(self):\n+        header = ['id', 'current_revision_id', 'created', 'modified', 'owner_id', 'group_id', 'group_read', 'group_write', 'other_read', 'other_write']\n+        data = [\n+            header,\n+            ['1234', '27567', '2013-08-08 22:00:58', '2013-09-30 16:52:21', 'owner_id', 'group_id', '1', '2', '3', '4']\n+        ]\n+        expected = [\n+            header,\n+            ['1234', '27567', '2013-08-08 22:00:58', '2013-09-30 16:52:21', 'owner_id', 'group_id', '1', '2', '3', '4']\n+        ]\n+        self.check_output(deid.DeidentifyWikiArticleTask, data, expected)\n+\n+    def test_wiki_article_revision_deidentification(self):\n+        header = ['id', 'revision_number', 'user_message', 'automatic_log', 'ip_address', 'user_id', 'modified', 'created', 'previous_revision_id', 'deleted', 'locked', 'article_id', 'content', 'title']\n+        data = [\n+            header,\n+            ['23456', '1', 'This is a user message', 'automatic_log', '192.168.1.1', '123456', '2013-08-08 22:00:58', '2013-08-08 22:00:58', '123', '0', '0', '123', 'This is the content', 'TITLE']\n+        ]\n+        expected = [\n+            header,\n+            ['23456', '1', '', '', '', '273678626', '2013-08-08 22:00:58', '2013-08-08 22:00:58', '123', '0', '0', '123', 'This is the content', 'TITLE']\n+        ]\n+        self.check_output(deid.DeidentifyWikiArticleRevisionTask, data, expected)\n+\n+    def test_mongo_deidentification(self):\n+        data = '{\"author_id\":\"123456\",\"author_username\":\"johndoe\",\"body\":\"This is a boady\", \"course_id\":\"course-v1:edX+DemoX+Test_2014\",\"votes\":{\"down\":[\"123456\"],\"up\":[\"12345\"]}}'","path":"edx/analytics/tasks/tests/test_data_deidentification.py","position":null,"original_position":180,"commit_id":"e734ab76ecee5abcbbf17bc4de19d8ab57b8ad72","original_commit_id":"919b09b7f24bd5bdb053ed1153ccebd3a8e6daf6","user":{"login":"HassanJaveed84","id":5018044,"avatar_url":"https://avatars.githubusercontent.com/u/5018044?v=3","gravatar_id":"","url":"https://api.github.com/users/HassanJaveed84","html_url":"https://github.com/HassanJaveed84","followers_url":"https://api.github.com/users/HassanJaveed84/followers","following_url":"https://api.github.com/users/HassanJaveed84/following{/other_user}","gists_url":"https://api.github.com/users/HassanJaveed84/gists{/gist_id}","starred_url":"https://api.github.com/users/HassanJaveed84/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/HassanJaveed84/subscriptions","organizations_url":"https://api.github.com/users/HassanJaveed84/orgs","repos_url":"https://api.github.com/users/HassanJaveed84/repos","events_url":"https://api.github.com/users/HassanJaveed84/events{/privacy}","received_events_url":"https://api.github.com/users/HassanJaveed84/received_events","type":"User","site_admin":false},"body":"Fixed.","created_at":"2015-12-08T23:34:59Z","updated_at":"2015-12-08T23:34:59Z","html_url":"https://github.com/edx/edx-analytics-pipeline/pull/181#discussion_r47031652","pull_request_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/pulls/181","_links":{"self":{"href":"https://api.github.com/repos/edx/edx-analytics-pipeline/pulls/comments/47031652"},"html":{"href":"https://github.com/edx/edx-analytics-pipeline/pull/181#discussion_r47031652"},"pull_request":{"href":"https://api.github.com/repos/edx/edx-analytics-pipeline/pulls/181"}}},"pull_request":{"url":"https://api.github.com/repos/edx/edx-analytics-pipeline/pulls/181","id":51810526,"html_url":"https://github.com/edx/edx-analytics-pipeline/pull/181","diff_url":"https://github.com/edx/edx-analytics-pipeline/pull/181.diff","patch_url":"https://github.com/edx/edx-analytics-pipeline/pull/181.patch","issue_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/issues/181","number":181,"state":"open","locked":false,"title":"Added tasks for Database deidentification.","user":{"login":"HassanJaveed84","id":5018044,"avatar_url":"https://avatars.githubusercontent.com/u/5018044?v=3","gravatar_id":"","url":"https://api.github.com/users/HassanJaveed84","html_url":"https://github.com/HassanJaveed84","followers_url":"https://api.github.com/users/HassanJaveed84/followers","following_url":"https://api.github.com/users/HassanJaveed84/following{/other_user}","gists_url":"https://api.github.com/users/HassanJaveed84/gists{/gist_id}","starred_url":"https://api.github.com/users/HassanJaveed84/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/HassanJaveed84/subscriptions","organizations_url":"https://api.github.com/users/HassanJaveed84/orgs","repos_url":"https://api.github.com/users/HassanJaveed84/repos","events_url":"https://api.github.com/users/HassanJaveed84/events{/privacy}","received_events_url":"https://api.github.com/users/HassanJaveed84/received_events","type":"User","site_admin":false},"body":"@brianhw @mulby up for initial review.\r\nTODO: A couple of features: scrubbing/encryption.\r\n\r\nParts on which I would really appreciate feedback/suggestions in particular: \r\n\r\n1. FileCopyTask, is there a better way of doing a platform-agnostic file copy ?\r\n2. Writing back json(DeidentifyMongoDumpsTask), right now I'm using json.dumps with ensure_ascii=False and encoding in utf-8 before writing to the output file.\r\n3. Organization and structure of the Victor's re-mapping algo(Permutations class).\r\n","created_at":"2015-11-25T15:47:02Z","updated_at":"2015-12-08T23:34:59Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0b219f4d5eef6a916d33819b2f19f3d883ef99f8","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/pulls/181/commits","review_comments_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/pulls/181/comments","review_comment_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/pulls/comments{/number}","comments_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/issues/181/comments","statuses_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/statuses/e734ab76ecee5abcbbf17bc4de19d8ab57b8ad72","head":{"label":"edx:hassan/de-id-spike","ref":"hassan/de-id-spike","sha":"e734ab76ecee5abcbbf17bc4de19d8ab57b8ad72","user":{"login":"edx","id":3179841,"avatar_url":"https://avatars.githubusercontent.com/u/3179841?v=3","gravatar_id":"","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":22929261,"name":"edx-analytics-pipeline","full_name":"edx/edx-analytics-pipeline","owner":{"login":"edx","id":3179841,"avatar_url":"https://avatars.githubusercontent.com/u/3179841?v=3","gravatar_id":"","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-analytics-pipeline","description":"","fork":false,"url":"https://api.github.com/repos/edx/edx-analytics-pipeline","forks_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/forks","keys_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/keys{/key_id}","collaborators_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/teams","hooks_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/hooks","issue_events_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/issues/events{/number}","events_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/events","assignees_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/assignees{/user}","branches_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/branches{/branch}","tags_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/tags","blobs_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/git/refs{/sha}","trees_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/git/trees{/sha}","statuses_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/statuses/{sha}","languages_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/languages","stargazers_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/stargazers","contributors_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/contributors","subscribers_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/subscribers","subscription_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/subscription","commits_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/commits{/sha}","git_commits_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/git/commits{/sha}","comments_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/comments{/number}","issue_comment_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/issues/comments{/number}","contents_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/contents/{+path}","compare_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/compare/{base}...{head}","merges_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/merges","archive_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/downloads","issues_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/issues{/number}","pulls_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/pulls{/number}","milestones_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/milestones{/number}","notifications_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/labels{/name}","releases_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/releases{/id}","created_at":"2014-08-13T19:57:17Z","updated_at":"2015-11-26T12:46:33Z","pushed_at":"2015-12-08T23:34:13Z","git_url":"git://github.com/edx/edx-analytics-pipeline.git","ssh_url":"git@github.com:edx/edx-analytics-pipeline.git","clone_url":"https://github.com/edx/edx-analytics-pipeline.git","svn_url":"https://github.com/edx/edx-analytics-pipeline","homepage":null,"size":2573,"stargazers_count":15,"watchers_count":15,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":31,"mirror_url":null,"open_issues_count":9,"forks":31,"open_issues":9,"watchers":15,"default_branch":"master"}},"base":{"label":"edx:master","ref":"master","sha":"8a8bc84e5b7e090b30966ffb24338662934ca743","user":{"login":"edx","id":3179841,"avatar_url":"https://avatars.githubusercontent.com/u/3179841?v=3","gravatar_id":"","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":22929261,"name":"edx-analytics-pipeline","full_name":"edx/edx-analytics-pipeline","owner":{"login":"edx","id":3179841,"avatar_url":"https://avatars.githubusercontent.com/u/3179841?v=3","gravatar_id":"","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-analytics-pipeline","description":"","fork":false,"url":"https://api.github.com/repos/edx/edx-analytics-pipeline","forks_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/forks","keys_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/keys{/key_id}","collaborators_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/teams","hooks_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/hooks","issue_events_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/issues/events{/number}","events_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/events","assignees_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/assignees{/user}","branches_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/branches{/branch}","tags_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/tags","blobs_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/git/refs{/sha}","trees_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/git/trees{/sha}","statuses_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/statuses/{sha}","languages_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/languages","stargazers_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/stargazers","contributors_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/contributors","subscribers_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/subscribers","subscription_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/subscription","commits_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/commits{/sha}","git_commits_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/git/commits{/sha}","comments_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/comments{/number}","issue_comment_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/issues/comments{/number}","contents_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/contents/{+path}","compare_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/compare/{base}...{head}","merges_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/merges","archive_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/downloads","issues_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/issues{/number}","pulls_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/pulls{/number}","milestones_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/milestones{/number}","notifications_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/labels{/name}","releases_url":"https://api.github.com/repos/edx/edx-analytics-pipeline/releases{/id}","created_at":"2014-08-13T19:57:17Z","updated_at":"2015-11-26T12:46:33Z","pushed_at":"2015-12-08T23:34:13Z","git_url":"git://github.com/edx/edx-analytics-pipeline.git","ssh_url":"git@github.com:edx/edx-analytics-pipeline.git","clone_url":"https://github.com/edx/edx-analytics-pipeline.git","svn_url":"https://github.com/edx/edx-analytics-pipeline","homepage":null,"size":2573,"stargazers_count":15,"watchers_count":15,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":31,"mirror_url":null,"open_issues_count":9,"forks":31,"open_issues":9,"watchers":15,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/edx/edx-analytics-pipeline/pulls/181"},"html":{"href":"https://github.com/edx/edx-analytics-pipeline/pull/181"},"issue":{"href":"https://api.github.com/repos/edx/edx-analytics-pipeline/issues/181"},"comments":{"href":"https://api.github.com/repos/edx/edx-analytics-pipeline/issues/181/comments"},"review_comments":{"href":"https://api.github.com/repos/edx/edx-analytics-pipeline/pulls/181/comments"},"review_comment":{"href":"https://api.github.com/repos/edx/edx-analytics-pipeline/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/edx/edx-analytics-pipeline/pulls/181/commits"},"statuses":{"href":"https://api.github.com/repos/edx/edx-analytics-pipeline/statuses/e734ab76ecee5abcbbf17bc4de19d8ab57b8ad72"}}}}