{"action":"created","comment":{"url":"https://api.github.com/repos/GoogleChrome/experience-sampling/pulls/comments/23196188","id":23196188,"diff_hunk":"@@ -0,0 +1,306 @@\n+\"\"\"Functions for processing CUES data in AppEngine JSON format into CSV format\n+\n+Has one public function, ProcessResults, used like this from interpreter:\n+    ProcessResults('2015-01-06cuesDogfoodData.json', '2015-01-06-')\n+\"\"\"\n+\n+import csv\n+import dateutil.parser\n+from datetime import datetime\n+import json\n+import re\n+\n+DOGFOOD_START_DATE = datetime(2014, 12, 01, 0, 0, 0, 0)\n+CONDITIONS = [\n+    'ssl-overridable-proceed', 'ssl-overridable-noproceed',\n+    'ssl-nonoverridable', 'malware-proceed', 'malware-noproceed',\n+    'phishing-proceed', 'phishing-noproceed', 'extension-proceed',\n+    'extension-noproceed']\n+ATTRIBUTE_QUESTION_PREFIX = 'To what degree do each of the following'\n+\n+def ProcessResults(json_in_file, csv_prefix):\n+  \"\"\"Take results from AppEngine JSON file, process, and write to CSV file.\n+\n+  Results from the input JSON file will be filtered into the 9 experimental\n+  conditions and written to CSV output files named in the format\n+  <csv_prefix><condition>.csv. CSV column headers will be the meta data fields\n+  date_received, date_taken, participant_id, and survey_type, plus the\n+  questions asked of the participant (with [URL] replacing actual URLs in the\n+  question text). Responses where questions were replaced with PLACEHOLDER\n+  will be ignored and not copied to the CSV file.\n+\n+  Args:\n+    json_in_file: File with raw AppEngine results in JSON format\n+    csv_prefix: Prefix to output CSV files. These files will be named\n+        in the format <csv_prefix><condition>.csv. For example, if\n+        csv_prefix is '2015-01-15-' then one output file would be\n+        named 2015-01-15-ssl-overridable-proceed.csv\n+\n+  Returns:\n+    None\n+  \"\"\"\n+  parsed_events = _ParseSurveyResults(json_in_file)\n+  parsed_events = _DiscardResultsBeforeDate(parsed_events, DOGFOOD_START_DATE)\n+\n+  for c in CONDITIONS:\n+    try:\n+      filtered_results = _FilterByCondition(c, parsed_events)\n+      canonical_index = _CanonicalizeQuestions(filtered_results)\n+      _WriteToCsv(filtered_results, canonical_index, csv_prefix + c + '.csv')\n+    except UnexpectedFormatException as e:\n+      # Print UnexpectedFormatException and continue, since they are usually\n+      # due to lack of data for a condition.\n+      print 'Exception in %s: %s' % (c, e.value)\n+  \n+def _ParseSurveyResults(in_file):\n+  with open(in_file, 'r') as json_file:\n+    parsed = json.load(json_file)\n+  events = filter(lambda x: x['survey_type'] != 'setup.js', parsed)\n+  return events\n+  \n+def _DiscardResultsBeforeDate(results, date):\n+  \"\"\"Return a list of results that occur after the given date.\n+\n+  Args:\n+    results: Results parsed from a raw JSON file into list of dicts\n+    date: A date of type datetime.datetime\n+    \n+  Returns:\n+    List of results whose date_taken value comes after the given date.\n+  \"\"\"\n+  return [\n+      r for r in results\n+      if dateutil.parser.parse(r['date_taken']) >= date]\n+\n+def _FilterByCondition(cond, results):\n+  \"\"\"Return a list of results for the given condition only.\n+\n+  Args:\n+    cond: Condition to filter on; e.g., 'ssl-overridable-proceed',\n+      'malware-noproceed', etc.\n+    results: Results parsed from raw JSON file into list of dicts\n+\n+  Returns:\n+    List of results for the given condition.\n+\n+  Raises:\n+    ValueError: A unrecognized condition was passed in.\n+  \"\"\"\n+  if cond not in CONDITIONS:\n+    raise ValueError(cond + ' is not a valid condition')\n+\n+  return [pr for pr in results if pr['survey_type'] == cond + '.js']\n+\n+\n+class QuestionError(BaseException):\n+  def __init__(self, value):\n+    BaseException.__init__(self, value)\n+    self.value = value\n+  def __str__(self):\n+    return(repr(self.value))\n+\n+\n+class UnexpectedFormatException(BaseException):\n+  def __init__(self, value):\n+    BaseException.__init__(self, value)\n+    self.value = value\n+  def __str__(self):\n+    return(repr(self.value))\n+\n+\n+def _CanonicalizeQuestions(results):\n+  \"\"\"Apply various fixes to questions in results\n+\n+  To write a set of survey responses to a CSV file, we need the questions\n+  to look the same for each response, so we can match answers to each other.\n+  But questions can differ from survey to survey, even within a condition,\n+  because:\n+    -- some questions were replaced with PLACEHOLDER in early dogfood versions\n+    -- attribute questions are presented in randomized order\n+    -- sometimes domains in the first question were supposed to be replaced\n+           by a placeholder but weren't\n+    -- some question lists are longer than others because the participant\n+           gave consent to collect URL and the URL was sent back as an extra\n+           question\n+  This function modifies results to fix these issues as follows:\n+    -- eliminates responses where questions that were replaced with PLACEHOLDER\n+    -- within each response, sorts attribute questions alphabetically\n+    -- replaces domains in first questions with [URL]\n+    -- question lists stay their original length, but a list of max length\n+           is selected as a canonical list for use as CSV headers\n+  The function does some light error checking to flag unexpected differences\n+  in questions.\n+\n+  Args:\n+    results: List of results, where each result is a dict\n+      containing metadata and response data from a survey response.\n+      The results list should be filtered for one condition.\n+\n+  Returns:\n+    Integer index into the results list indicating which list\n+    element's questions can be considered canonical and complete.\n+    Also modifies the input results to canonicalize all questions.\n+\n+  Raises:\n+    QuestionError: A question in some response didn't match the expected\n+        canonical version of the question\n+    UnexpectedFormatError: Either results has no responses or all\n+        responses use PLACEHOLDER as the text for all questions\n+  \"\"\"\n+  # Find responses that didn't use 'PLACEHOLDER' as the text for every question\n+  results[:] = [r for r in results\n+                      if r['responses'][0]['question'] != 'PLACEHOLDER']\n+  if not results:\n+    raise UnexpectedFormatException('No results with questions found')\n+\n+  _ReorderAttributeQuestions(results)\n+\n+  _ReplaceUrlWithPlaceholder(results)\n+\n+  # Any response with the max number of questions should now be fine as\n+  # the canonical list of questions; find one such response.\n+  max_list_len = len(results[0]['responses'])\n+  canonical_index = 0\n+  for i, r in enumerate(results):\n+    if len(r['responses']) > max_list_len:\n+      max_list_len = len(r['responses'])\n+      canonical_index = i\n+\n+  # Do some light error checking; all questions lists should now be the same,\n+  # except some question lists may have extra questions. So, check each list\n+  # of questions against the canonical list of questions.\n+  for i, qa_pair in enumerate(\n+      results[canonical_index]['responses']):\n+    for j, r in enumerate(results):\n+      if i < len(r['responses']):\n+        if qa_pair['question'] != r['responses'][i]['question']:\n+          raise QuestionError(\n+              'Question text differs: Result %d question %d is {%s}. Result '\n+              '%d question %d is {%s}.'\n+              % (canonical_index, i, qa_pair['question'],\n+                 j, i, r['responses'][i]['question']))\n+\n+  return canonical_index\n+\n+def _WriteToCsv(results, canonical_index, out_file):\n+  \"\"\"Write results for a given condition to a CSV file\n+\n+  Given a list of results in the expected format, writes\n+  date_received, date_taken,  participant_id, survey_type, and\n+  answers to each survey question to a CSV file. Uses\n+  canonical_questions as column headers for corresponding answers.\n+    \n+  Args:\n+    results: List of results, where each result is a dict\n+        containing metadata and response data from a survey response.\n+        The results list should be filtered for one condition, and\n+        questions in the response data should be canonicalized.\n+    canonical_index: Index of element in results whose questions can\n+        be considered canonical for use as CSV column headers.\n+    out_file: CSV file to write output to.\n+\n+  Returns:\n+    None.\n+  \"\"\"\n+  canonical_questions = [\n+      qa_pair['question']\n+      for qa_pair in results[canonical_index]['responses']]\n+\n+  # Use the Python csv library to write to csv format. The writer in this\n+  # library requires data to be a list of rows in flat field_name:data form.\n+  # So, we put it in the required form, open the CSV file, and write the data.\n+  results_for_csv_writer = []\n+  for r in results:\n+    dict_for_csv_writer = {}\n+    for qa_pair in r['responses']:\n+      dict_for_csv_writer[qa_pair['question']] = qa_pair['answer']\n+    dict_for_csv_writer.update(r)\n+    del dict_for_csv_writer['responses']\n+    results_for_csv_writer.append(dict_for_csv_writer)\n+\n+  with open(out_file, 'w') as csv_file:\n+    field_names = ['date_received', 'date_taken', 'participant_id',\n+        'survey_type']\n+    field_names.extend(canonical_questions)\n+    csv_writer = csv.DictWriter(csv_file, field_names)\n+    csv_writer.writeheader()\n+    csv_writer.writerows(results_for_csv_writer)\n+\n+def _ReorderAttributeQuestions(results):\n+  \"\"\"Alphabetize attribute questions\n+\n+  The attribute questions are presented in random order, so we\n+  need to reorder them into a canonical order for the output CSV\n+  file. This uses alphabetical order as canonical order.\n+\n+  Args:\n+    results: A list of dicts containing parsed and filtered results.\n+        It is assumed that results has been filtered for a given survey\n+        condition, such that attributes questions should all appear in the\n+        same place.\n+\n+  Returns:\n+    The altered results. Modifies the input results list as well.\n+\n+  Raises:\n+    UnexpectedFormatException: Something unexpected found in input.\n+  \"\"\"\n+  # Gather a list of lists of the indices of the attribute questions in\n+  # each result\n+  attribute_question_indices = []\n+  for r in results:\n+    index_list = []\n+    for i, qa_pair in enumerate(r['responses']):\n+      if ATTRIBUTE_QUESTION_PREFIX in qa_pair['question']:\n+        index_list.append(i)\n+      attribute_question_indices.append(index_list)\n+\n+  # Do some error checking; attribute questions should have the same indices\n+  # for all results and should appear consecutively. Since they should be the\n+  # same for all results, we grab the min and max index from the first result.\n+  if not attribute_question_indices:\n+    raise UnexpectedFormatException ('Attributes questions not found.')","path":"tools/processresults.py","position":null,"original_position":262,"commit_id":"c316f3ea00f95ff8a606a2bef034366a352fac15","original_commit_id":"bf575fb1cd03a6907ca67966555e534736452332","user":{"login":"moduloprime","id":5904096,"avatar_url":"https://avatars.githubusercontent.com/u/5904096?v=3","gravatar_id":"","url":"https://api.github.com/users/moduloprime","html_url":"https://github.com/moduloprime","followers_url":"https://api.github.com/users/moduloprime/followers","following_url":"https://api.github.com/users/moduloprime/following{/other_user}","gists_url":"https://api.github.com/users/moduloprime/gists{/gist_id}","starred_url":"https://api.github.com/users/moduloprime/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/moduloprime/subscriptions","organizations_url":"https://api.github.com/users/moduloprime/orgs","repos_url":"https://api.github.com/users/moduloprime/repos","events_url":"https://api.github.com/users/moduloprime/events{/privacy}","received_events_url":"https://api.github.com/users/moduloprime/received_events","type":"User","site_admin":false},"body":"Done.","created_at":"2015-01-20T00:30:26Z","updated_at":"2015-01-20T00:30:26Z","html_url":"https://github.com/GoogleChrome/experience-sampling/pull/163#discussion_r23196188","pull_request_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/pulls/163","_links":{"self":{"href":"https://api.github.com/repos/GoogleChrome/experience-sampling/pulls/comments/23196188"},"html":{"href":"https://github.com/GoogleChrome/experience-sampling/pull/163#discussion_r23196188"},"pull_request":{"href":"https://api.github.com/repos/GoogleChrome/experience-sampling/pulls/163"}}},"pull_request":{"url":"https://api.github.com/repos/GoogleChrome/experience-sampling/pulls/163","id":27476521,"html_url":"https://github.com/GoogleChrome/experience-sampling/pull/163","diff_url":"https://github.com/GoogleChrome/experience-sampling/pull/163.diff","patch_url":"https://github.com/GoogleChrome/experience-sampling/pull/163.patch","issue_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/issues/163","number":163,"state":"open","locked":false,"title":"Processingtool","user":{"login":"moduloprime","id":5904096,"avatar_url":"https://avatars.githubusercontent.com/u/5904096?v=3","gravatar_id":"","url":"https://api.github.com/users/moduloprime","html_url":"https://github.com/moduloprime","followers_url":"https://api.github.com/users/moduloprime/followers","following_url":"https://api.github.com/users/moduloprime/following{/other_user}","gists_url":"https://api.github.com/users/moduloprime/gists{/gist_id}","starred_url":"https://api.github.com/users/moduloprime/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/moduloprime/subscriptions","organizations_url":"https://api.github.com/users/moduloprime/orgs","repos_url":"https://api.github.com/users/moduloprime/repos","events_url":"https://api.github.com/users/moduloprime/events{/privacy}","received_events_url":"https://api.github.com/users/moduloprime/received_events","type":"User","site_admin":false},"body":"@adrifelt PTAL Processing tool to get data into CSV format. Sorry for big PR!","created_at":"2015-01-16T00:55:12Z","updated_at":"2015-01-20T00:30:26Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d643e39354c41afdd19a24dc0b09bb4ede49f593","assignee":{"login":"adrifelt","id":4962198,"avatar_url":"https://avatars.githubusercontent.com/u/4962198?v=3","gravatar_id":"","url":"https://api.github.com/users/adrifelt","html_url":"https://github.com/adrifelt","followers_url":"https://api.github.com/users/adrifelt/followers","following_url":"https://api.github.com/users/adrifelt/following{/other_user}","gists_url":"https://api.github.com/users/adrifelt/gists{/gist_id}","starred_url":"https://api.github.com/users/adrifelt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adrifelt/subscriptions","organizations_url":"https://api.github.com/users/adrifelt/orgs","repos_url":"https://api.github.com/users/adrifelt/repos","events_url":"https://api.github.com/users/adrifelt/events{/privacy}","received_events_url":"https://api.github.com/users/adrifelt/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/pulls/163/commits","review_comments_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/pulls/163/comments","review_comment_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/pulls/comments/{number}","comments_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/issues/163/comments","statuses_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/statuses/c316f3ea00f95ff8a606a2bef034366a352fac15","head":{"label":"moduloprime:processingtool","ref":"processingtool","sha":"c316f3ea00f95ff8a606a2bef034366a352fac15","user":{"login":"moduloprime","id":5904096,"avatar_url":"https://avatars.githubusercontent.com/u/5904096?v=3","gravatar_id":"","url":"https://api.github.com/users/moduloprime","html_url":"https://github.com/moduloprime","followers_url":"https://api.github.com/users/moduloprime/followers","following_url":"https://api.github.com/users/moduloprime/following{/other_user}","gists_url":"https://api.github.com/users/moduloprime/gists{/gist_id}","starred_url":"https://api.github.com/users/moduloprime/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/moduloprime/subscriptions","organizations_url":"https://api.github.com/users/moduloprime/orgs","repos_url":"https://api.github.com/users/moduloprime/repos","events_url":"https://api.github.com/users/moduloprime/events{/privacy}","received_events_url":"https://api.github.com/users/moduloprime/received_events","type":"User","site_admin":false},"repo":{"id":26832452,"name":"experience-sampling","full_name":"moduloprime/experience-sampling","owner":{"login":"moduloprime","id":5904096,"avatar_url":"https://avatars.githubusercontent.com/u/5904096?v=3","gravatar_id":"","url":"https://api.github.com/users/moduloprime","html_url":"https://github.com/moduloprime","followers_url":"https://api.github.com/users/moduloprime/followers","following_url":"https://api.github.com/users/moduloprime/following{/other_user}","gists_url":"https://api.github.com/users/moduloprime/gists{/gist_id}","starred_url":"https://api.github.com/users/moduloprime/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/moduloprime/subscriptions","organizations_url":"https://api.github.com/users/moduloprime/orgs","repos_url":"https://api.github.com/users/moduloprime/repos","events_url":"https://api.github.com/users/moduloprime/events{/privacy}","received_events_url":"https://api.github.com/users/moduloprime/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/moduloprime/experience-sampling","description":"","fork":true,"url":"https://api.github.com/repos/moduloprime/experience-sampling","forks_url":"https://api.github.com/repos/moduloprime/experience-sampling/forks","keys_url":"https://api.github.com/repos/moduloprime/experience-sampling/keys{/key_id}","collaborators_url":"https://api.github.com/repos/moduloprime/experience-sampling/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/moduloprime/experience-sampling/teams","hooks_url":"https://api.github.com/repos/moduloprime/experience-sampling/hooks","issue_events_url":"https://api.github.com/repos/moduloprime/experience-sampling/issues/events{/number}","events_url":"https://api.github.com/repos/moduloprime/experience-sampling/events","assignees_url":"https://api.github.com/repos/moduloprime/experience-sampling/assignees{/user}","branches_url":"https://api.github.com/repos/moduloprime/experience-sampling/branches{/branch}","tags_url":"https://api.github.com/repos/moduloprime/experience-sampling/tags","blobs_url":"https://api.github.com/repos/moduloprime/experience-sampling/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/moduloprime/experience-sampling/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/moduloprime/experience-sampling/git/refs{/sha}","trees_url":"https://api.github.com/repos/moduloprime/experience-sampling/git/trees{/sha}","statuses_url":"https://api.github.com/repos/moduloprime/experience-sampling/statuses/{sha}","languages_url":"https://api.github.com/repos/moduloprime/experience-sampling/languages","stargazers_url":"https://api.github.com/repos/moduloprime/experience-sampling/stargazers","contributors_url":"https://api.github.com/repos/moduloprime/experience-sampling/contributors","subscribers_url":"https://api.github.com/repos/moduloprime/experience-sampling/subscribers","subscription_url":"https://api.github.com/repos/moduloprime/experience-sampling/subscription","commits_url":"https://api.github.com/repos/moduloprime/experience-sampling/commits{/sha}","git_commits_url":"https://api.github.com/repos/moduloprime/experience-sampling/git/commits{/sha}","comments_url":"https://api.github.com/repos/moduloprime/experience-sampling/comments{/number}","issue_comment_url":"https://api.github.com/repos/moduloprime/experience-sampling/issues/comments/{number}","contents_url":"https://api.github.com/repos/moduloprime/experience-sampling/contents/{+path}","compare_url":"https://api.github.com/repos/moduloprime/experience-sampling/compare/{base}...{head}","merges_url":"https://api.github.com/repos/moduloprime/experience-sampling/merges","archive_url":"https://api.github.com/repos/moduloprime/experience-sampling/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/moduloprime/experience-sampling/downloads","issues_url":"https://api.github.com/repos/moduloprime/experience-sampling/issues{/number}","pulls_url":"https://api.github.com/repos/moduloprime/experience-sampling/pulls{/number}","milestones_url":"https://api.github.com/repos/moduloprime/experience-sampling/milestones{/number}","notifications_url":"https://api.github.com/repos/moduloprime/experience-sampling/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/moduloprime/experience-sampling/labels{/name}","releases_url":"https://api.github.com/repos/moduloprime/experience-sampling/releases{/id}","created_at":"2014-11-18T22:09:47Z","updated_at":"2014-11-26T17:28:30Z","pushed_at":"2015-01-20T00:28:35Z","git_url":"git://github.com/moduloprime/experience-sampling.git","ssh_url":"git@github.com:moduloprime/experience-sampling.git","clone_url":"https://github.com/moduloprime/experience-sampling.git","svn_url":"https://github.com/moduloprime/experience-sampling","homepage":null,"size":3829,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"GoogleChrome:master","ref":"master","sha":"7831bf0424d403c5935bfb629d8b53370cca183a","user":{"login":"GoogleChrome","id":1778935,"avatar_url":"https://avatars.githubusercontent.com/u/1778935?v=3","gravatar_id":"","url":"https://api.github.com/users/GoogleChrome","html_url":"https://github.com/GoogleChrome","followers_url":"https://api.github.com/users/GoogleChrome/followers","following_url":"https://api.github.com/users/GoogleChrome/following{/other_user}","gists_url":"https://api.github.com/users/GoogleChrome/gists{/gist_id}","starred_url":"https://api.github.com/users/GoogleChrome/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GoogleChrome/subscriptions","organizations_url":"https://api.github.com/users/GoogleChrome/orgs","repos_url":"https://api.github.com/users/GoogleChrome/repos","events_url":"https://api.github.com/users/GoogleChrome/events{/privacy}","received_events_url":"https://api.github.com/users/GoogleChrome/received_events","type":"Organization","site_admin":false},"repo":{"id":22887014,"name":"experience-sampling","full_name":"GoogleChrome/experience-sampling","owner":{"login":"GoogleChrome","id":1778935,"avatar_url":"https://avatars.githubusercontent.com/u/1778935?v=3","gravatar_id":"","url":"https://api.github.com/users/GoogleChrome","html_url":"https://github.com/GoogleChrome","followers_url":"https://api.github.com/users/GoogleChrome/followers","following_url":"https://api.github.com/users/GoogleChrome/following{/other_user}","gists_url":"https://api.github.com/users/GoogleChrome/gists{/gist_id}","starred_url":"https://api.github.com/users/GoogleChrome/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GoogleChrome/subscriptions","organizations_url":"https://api.github.com/users/GoogleChrome/orgs","repos_url":"https://api.github.com/users/GoogleChrome/repos","events_url":"https://api.github.com/users/GoogleChrome/events{/privacy}","received_events_url":"https://api.github.com/users/GoogleChrome/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/GoogleChrome/experience-sampling","description":"","fork":false,"url":"https://api.github.com/repos/GoogleChrome/experience-sampling","forks_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/forks","keys_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/keys{/key_id}","collaborators_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/teams","hooks_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/hooks","issue_events_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/issues/events{/number}","events_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/events","assignees_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/assignees{/user}","branches_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/branches{/branch}","tags_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/tags","blobs_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/git/refs{/sha}","trees_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/git/trees{/sha}","statuses_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/statuses/{sha}","languages_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/languages","stargazers_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/stargazers","contributors_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/contributors","subscribers_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/subscribers","subscription_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/subscription","commits_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/commits{/sha}","git_commits_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/git/commits{/sha}","comments_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/comments{/number}","issue_comment_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/issues/comments/{number}","contents_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/contents/{+path}","compare_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/compare/{base}...{head}","merges_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/merges","archive_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/downloads","issues_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/issues{/number}","pulls_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/pulls{/number}","milestones_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/milestones{/number}","notifications_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/labels{/name}","releases_url":"https://api.github.com/repos/GoogleChrome/experience-sampling/releases{/id}","created_at":"2014-08-12T18:02:09Z","updated_at":"2015-01-17T01:04:18Z","pushed_at":"2015-01-17T01:04:17Z","git_url":"git://github.com/GoogleChrome/experience-sampling.git","ssh_url":"git@github.com:GoogleChrome/experience-sampling.git","clone_url":"https://github.com/GoogleChrome/experience-sampling.git","svn_url":"https://github.com/GoogleChrome/experience-sampling","homepage":null,"size":4396,"stargazers_count":3,"watchers_count":3,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3,"mirror_url":null,"open_issues_count":9,"forks":3,"open_issues":9,"watchers":3,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/GoogleChrome/experience-sampling/pulls/163"},"html":{"href":"https://github.com/GoogleChrome/experience-sampling/pull/163"},"issue":{"href":"https://api.github.com/repos/GoogleChrome/experience-sampling/issues/163"},"comments":{"href":"https://api.github.com/repos/GoogleChrome/experience-sampling/issues/163/comments"},"review_comments":{"href":"https://api.github.com/repos/GoogleChrome/experience-sampling/pulls/163/comments"},"review_comment":{"href":"https://api.github.com/repos/GoogleChrome/experience-sampling/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/GoogleChrome/experience-sampling/pulls/163/commits"},"statuses":{"href":"https://api.github.com/repos/GoogleChrome/experience-sampling/statuses/c316f3ea00f95ff8a606a2bef034366a352fac15"}}}}