{"action":"created","comment":{"url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/pulls/comments/51655981","id":51655981,"diff_hunk":"@@ -0,0 +1,189 @@\n+#!/usr/bin/env python3\n+from bs4 import BeautifulSoup\n+import geocoder\n+import json\n+import pathlib\n+import re\n+import requests\n+import sys\n+\n+\n+INSPECTION_DOMAIN = 'http://info.kingcounty.gov'\n+INSPECTION_PATH = '/health/ehs/foodsafety/inspections/Results.aspx'\n+INSPECTION_PARAMS = {\n+    'Output': 'W',\n+    'Business_Name': '',\n+    'Business_Address': '',\n+    'Longitude': '',\n+    'Latitude': '',\n+    'City': '',\n+    'Zip_Code': '',\n+    'Inspection_Type': 'All',\n+    'Inspection_Start': '',\n+    'Inspection_End': '',\n+    'Inspection_Closed_Business': 'A',\n+    'Violation_Points': '',\n+    'Violation_Red_Points': '',\n+    'Violation_Descr': '',\n+    'Fuzzy_Search': 'N',\n+    'Sort': 'H'\n+}\n+\n+\n+def get_inspection_page(**kwargs):\n+    url = INSPECTION_DOMAIN + INSPECTION_PATH\n+    params = INSPECTION_PARAMS.copy()\n+    for key, val in kwargs.items():\n+        if key in INSPECTION_PARAMS:\n+            params[key] = val\n+    resp = requests.get(url, params=params)\n+    resp.raise_for_status()\n+    return resp.text\n+\n+\n+def parse_source(html):\n+    parsed = BeautifulSoup(html, 'html5lib')\n+    return parsed\n+\n+\n+def load_inspection_page(name):\n+    file_path = pathlib.Path(name)\n+    return file_path.read_text(encoding='utf8')\n+\n+\n+def restaurant_data_generator(html):\n+    id_finder = re.compile(r'PR[\\d]+~')\n+    return html.find_all('div', id=id_finder)\n+\n+\n+def has_two_tds(elem):\n+    is_tr = elem.name == 'tr'\n+    td_children = elem.find_all('td', recursive=False)\n+    has_two = len(td_children) == 2\n+    return is_tr and has_two\n+\n+\n+def clean_data(td):\n+    return td.text.strip(\" \\n:-\")\n+\n+\n+def extract_restaurant_metadata(elem):\n+    restaurant_data_rows = elem.find('tbody').find_all(\n+        has_two_tds, recursive=False\n+    )\n+    rdata = {}\n+    current_label = ''\n+    for data_row in restaurant_data_rows:\n+        key_cell, val_cell = data_row.find_all('td', recursive=False)\n+        new_label = clean_data(key_cell)\n+        current_label = new_label if new_label else current_label\n+        rdata.setdefault(current_label, []).append(clean_data(val_cell))\n+    return rdata\n+\n+\n+def is_inspection_data_row(elem):\n+    is_tr = elem.name == 'tr'\n+    if not is_tr:\n+        return False\n+    td_children = elem.find_all('td', recursive=False)\n+    has_four = len(td_children) == 4\n+    this_text = clean_data(td_children[0]).lower()\n+    contains_word = 'inspection' in this_text\n+    does_not_start = not this_text.startswith('inspection')\n+    return is_tr and has_four and contains_word and does_not_start\n+\n+\n+def get_score_data(elem):\n+    inspection_rows = elem.find_all(is_inspection_data_row)\n+    samples = len(inspection_rows)\n+    total = 0\n+    high_score = 0\n+    average = 0\n+    for row in inspection_rows:\n+        strval = clean_data(row.find_all('td')[2])\n+        try:\n+            intval = int(strval)\n+        except (ValueError, TypeError):\n+            samples -= 1\n+        else:\n+            total += intval\n+            high_score = intval if intval > high_score else high_score\n+    if samples:\n+        average = total/float(samples)\n+    data = {\n+        u'Average Score': average,\n+        u'High Score': high_score,\n+        u'Total Inspections': samples\n+    }\n+    return data\n+\n+\n+def result_generator(sorted_list, count):\n+    for rest_data in sorted_list[:count]:\n+        yield rest_data\n+\n+\n+\n+def result_display(*args):\n+    sort_dict = {'highscore': 'High Score',\n+                 'average': 'Average Score',\n+                 'total': 'Total Inspections'}\n+    html = load_inspection_page('inspection_page.html')\n+    parsed = parse_source(html)\n+    content_col = parsed.find(\"td\", id=\"contentcol\")\n+    data_list = restaurant_data_generator(content_col)\n+    dict_list = []\n+    for data_div in data_list:\n+        metadata = extract_restaurant_metadata(data_div)\n+        inspection_data = get_score_data(data_div)\n+        metadata.update(inspection_data)\n+        dict_list.append(metadata)\n+    for key in sort_dict:\n+        if key in args:\n+            dict_list = sorted(dict_list, key=lambda k: k[sort_dict[key]], reverse=True)\n+        else:\n+            dict_list = dict_list\n+    if 'reverse' in args:\n+        dict_list.reverse()\n+    return dict_list\n+\n+\n+\n+\n+def get_geojson(result):\n+    address = \" \".join(result.get('Address', ''))\n+    if not address:\n+        return None\n+    geocoded = geocoder.google(address)\n+    geojson = geocoded.geojson\n+    inspection_data = {}\n+    use_keys = (\n+        'Business Name', 'Average Score', 'Total Inspections', 'High Score'\n+    )\n+    for key, val in result.items():\n+        if key not in use_keys:\n+            continue\n+        if isinstance(val, list):\n+            val = \" \".join(val)\n+        inspection_data[key] = val\n+    geojson['properties'] = inspection_data\n+    return geojson\n+\n+\n+\n+if __name__ == '__main__':\n+    count = 10\n+    for arg in sys.argv:\n+        if arg.isdigit():\n+            count = int(arg)\n+        if arg == 'display':\n+            for rest in result_display(*sys.argv)[:count]:\n+                print('\\n', rest, type(rest))\n+        if arg == 'map':\n+            total_result = {'type': 'FeatureCollection', 'features': []}\n+            for result in result_generator((result_display(*sys.argv)),count):\n+                geojson = get_geojson(result)\n+                total_result['features'].append(geojson)\n+            print('Map created')\n+            with open('my_map.json', 'w') as fh:\n+                json.dump(total_result, fh)","path":"resources/session04/mashup.py","position":189,"original_position":189,"commit_id":"fe617f33ba7d75aafee3f3075364bd2102bb538c","original_commit_id":"fe617f33ba7d75aafee3f3075364bd2102bb538c","user":{"login":"cewing","id":417109,"avatar_url":"https://avatars.githubusercontent.com/u/417109?v=3","gravatar_id":"","url":"https://api.github.com/users/cewing","html_url":"https://github.com/cewing","followers_url":"https://api.github.com/users/cewing/followers","following_url":"https://api.github.com/users/cewing/following{/other_user}","gists_url":"https://api.github.com/users/cewing/gists{/gist_id}","starred_url":"https://api.github.com/users/cewing/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cewing/subscriptions","organizations_url":"https://api.github.com/users/cewing/orgs","repos_url":"https://api.github.com/users/cewing/repos","events_url":"https://api.github.com/users/cewing/events{/privacy}","received_events_url":"https://api.github.com/users/cewing/received_events","type":"User","site_admin":false},"body":"The only problem I have with this is that error handling for incorrect or mis-typed arguments is pretty much non-existent.  Remember that users will do all sorts of things with your scripts that you did not intend.  it's worth spending some time to try to make your scripts robust to those sorts of failings.","created_at":"2016-02-02T23:39:29Z","updated_at":"2016-02-02T23:39:29Z","html_url":"https://github.com/UWPCE-PythonCert/training.python_web/pull/133#discussion_r51655981","pull_request_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/pulls/133","_links":{"self":{"href":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/pulls/comments/51655981"},"html":{"href":"https://github.com/UWPCE-PythonCert/training.python_web/pull/133#discussion_r51655981"},"pull_request":{"href":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/pulls/133"}}},"pull_request":{"url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/pulls/133","id":58066126,"html_url":"https://github.com/UWPCE-PythonCert/training.python_web/pull/133","diff_url":"https://github.com/UWPCE-PythonCert/training.python_web/pull/133.diff","patch_url":"https://github.com/UWPCE-PythonCert/training.python_web/pull/133.patch","issue_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/issues/133","number":133,"state":"open","locked":false,"title":"training.python_web/resources/session04/mashup_homework/mashup.py","user":{"login":"gabrielx52","id":10860515,"avatar_url":"https://avatars.githubusercontent.com/u/10860515?v=3","gravatar_id":"","url":"https://api.github.com/users/gabrielx52","html_url":"https://github.com/gabrielx52","followers_url":"https://api.github.com/users/gabrielx52/followers","following_url":"https://api.github.com/users/gabrielx52/following{/other_user}","gists_url":"https://api.github.com/users/gabrielx52/gists{/gist_id}","starred_url":"https://api.github.com/users/gabrielx52/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gabrielx52/subscriptions","organizations_url":"https://api.github.com/users/gabrielx52/orgs","repos_url":"https://api.github.com/users/gabrielx52/repos","events_url":"https://api.github.com/users/gabrielx52/events{/privacy}","received_events_url":"https://api.github.com/users/gabrielx52/received_events","type":"User","site_admin":false},"body":"training.python_web/resources/session04/mashup_homework/mashup.py\r\n\r\nI completed the assignment, my version history is in my main session 4 folder under mashup_5.py\r\nI added a function for display that prints to the terminal and map that generates a geojson map file. I spent some time messing around with argparse but skipped it in lieu of sys.argv.\r\n\r\nIts still pretty bare and could use some structure/user guidance and tests... but the basic functionality of its there. ","created_at":"2016-02-02T23:12:18Z","updated_at":"2016-02-02T23:39:29Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9c9b3c05876437e7b2262733d74973b6e115849f","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/pulls/133/commits","review_comments_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/pulls/133/comments","review_comment_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/pulls/comments{/number}","comments_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/issues/133/comments","statuses_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/statuses/fe617f33ba7d75aafee3f3075364bd2102bb538c","head":{"label":"gabrielx52:master","ref":"master","sha":"fe617f33ba7d75aafee3f3075364bd2102bb538c","user":{"login":"gabrielx52","id":10860515,"avatar_url":"https://avatars.githubusercontent.com/u/10860515?v=3","gravatar_id":"","url":"https://api.github.com/users/gabrielx52","html_url":"https://github.com/gabrielx52","followers_url":"https://api.github.com/users/gabrielx52/followers","following_url":"https://api.github.com/users/gabrielx52/following{/other_user}","gists_url":"https://api.github.com/users/gabrielx52/gists{/gist_id}","starred_url":"https://api.github.com/users/gabrielx52/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gabrielx52/subscriptions","organizations_url":"https://api.github.com/users/gabrielx52/orgs","repos_url":"https://api.github.com/users/gabrielx52/repos","events_url":"https://api.github.com/users/gabrielx52/events{/privacy}","received_events_url":"https://api.github.com/users/gabrielx52/received_events","type":"User","site_admin":false},"repo":{"id":49911822,"name":"training.python_web","full_name":"gabrielx52/training.python_web","owner":{"login":"gabrielx52","id":10860515,"avatar_url":"https://avatars.githubusercontent.com/u/10860515?v=3","gravatar_id":"","url":"https://api.github.com/users/gabrielx52","html_url":"https://github.com/gabrielx52","followers_url":"https://api.github.com/users/gabrielx52/followers","following_url":"https://api.github.com/users/gabrielx52/following{/other_user}","gists_url":"https://api.github.com/users/gabrielx52/gists{/gist_id}","starred_url":"https://api.github.com/users/gabrielx52/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gabrielx52/subscriptions","organizations_url":"https://api.github.com/users/gabrielx52/orgs","repos_url":"https://api.github.com/users/gabrielx52/repos","events_url":"https://api.github.com/users/gabrielx52/events{/privacy}","received_events_url":"https://api.github.com/users/gabrielx52/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/gabrielx52/training.python_web","description":"Lecture and training materials for the 2016 Internet Programming with Python course from UW PCE","fork":true,"url":"https://api.github.com/repos/gabrielx52/training.python_web","forks_url":"https://api.github.com/repos/gabrielx52/training.python_web/forks","keys_url":"https://api.github.com/repos/gabrielx52/training.python_web/keys{/key_id}","collaborators_url":"https://api.github.com/repos/gabrielx52/training.python_web/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/gabrielx52/training.python_web/teams","hooks_url":"https://api.github.com/repos/gabrielx52/training.python_web/hooks","issue_events_url":"https://api.github.com/repos/gabrielx52/training.python_web/issues/events{/number}","events_url":"https://api.github.com/repos/gabrielx52/training.python_web/events","assignees_url":"https://api.github.com/repos/gabrielx52/training.python_web/assignees{/user}","branches_url":"https://api.github.com/repos/gabrielx52/training.python_web/branches{/branch}","tags_url":"https://api.github.com/repos/gabrielx52/training.python_web/tags","blobs_url":"https://api.github.com/repos/gabrielx52/training.python_web/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/gabrielx52/training.python_web/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/gabrielx52/training.python_web/git/refs{/sha}","trees_url":"https://api.github.com/repos/gabrielx52/training.python_web/git/trees{/sha}","statuses_url":"https://api.github.com/repos/gabrielx52/training.python_web/statuses/{sha}","languages_url":"https://api.github.com/repos/gabrielx52/training.python_web/languages","stargazers_url":"https://api.github.com/repos/gabrielx52/training.python_web/stargazers","contributors_url":"https://api.github.com/repos/gabrielx52/training.python_web/contributors","subscribers_url":"https://api.github.com/repos/gabrielx52/training.python_web/subscribers","subscription_url":"https://api.github.com/repos/gabrielx52/training.python_web/subscription","commits_url":"https://api.github.com/repos/gabrielx52/training.python_web/commits{/sha}","git_commits_url":"https://api.github.com/repos/gabrielx52/training.python_web/git/commits{/sha}","comments_url":"https://api.github.com/repos/gabrielx52/training.python_web/comments{/number}","issue_comment_url":"https://api.github.com/repos/gabrielx52/training.python_web/issues/comments{/number}","contents_url":"https://api.github.com/repos/gabrielx52/training.python_web/contents/{+path}","compare_url":"https://api.github.com/repos/gabrielx52/training.python_web/compare/{base}...{head}","merges_url":"https://api.github.com/repos/gabrielx52/training.python_web/merges","archive_url":"https://api.github.com/repos/gabrielx52/training.python_web/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/gabrielx52/training.python_web/downloads","issues_url":"https://api.github.com/repos/gabrielx52/training.python_web/issues{/number}","pulls_url":"https://api.github.com/repos/gabrielx52/training.python_web/pulls{/number}","milestones_url":"https://api.github.com/repos/gabrielx52/training.python_web/milestones{/number}","notifications_url":"https://api.github.com/repos/gabrielx52/training.python_web/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/gabrielx52/training.python_web/labels{/name}","releases_url":"https://api.github.com/repos/gabrielx52/training.python_web/releases{/id}","deployments_url":"https://api.github.com/repos/gabrielx52/training.python_web/deployments","created_at":"2016-01-18T23:17:02Z","updated_at":"2016-01-18T23:17:03Z","pushed_at":"2016-02-02T23:04:44Z","git_url":"git://github.com/gabrielx52/training.python_web.git","ssh_url":"git@github.com:gabrielx52/training.python_web.git","clone_url":"https://github.com/gabrielx52/training.python_web.git","svn_url":"https://github.com/gabrielx52/training.python_web","homepage":"","size":11607,"stargazers_count":0,"watchers_count":0,"language":"Python","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":"UWPCE-PythonCert:master","ref":"master","sha":"ee9a30ef92356da9744bd6c7c3abf5c43ebcbaea","user":{"login":"UWPCE-PythonCert","id":5218825,"avatar_url":"https://avatars.githubusercontent.com/u/5218825?v=3","gravatar_id":"","url":"https://api.github.com/users/UWPCE-PythonCert","html_url":"https://github.com/UWPCE-PythonCert","followers_url":"https://api.github.com/users/UWPCE-PythonCert/followers","following_url":"https://api.github.com/users/UWPCE-PythonCert/following{/other_user}","gists_url":"https://api.github.com/users/UWPCE-PythonCert/gists{/gist_id}","starred_url":"https://api.github.com/users/UWPCE-PythonCert/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/UWPCE-PythonCert/subscriptions","organizations_url":"https://api.github.com/users/UWPCE-PythonCert/orgs","repos_url":"https://api.github.com/users/UWPCE-PythonCert/repos","events_url":"https://api.github.com/users/UWPCE-PythonCert/events{/privacy}","received_events_url":"https://api.github.com/users/UWPCE-PythonCert/received_events","type":"Organization","site_admin":false},"repo":{"id":14915446,"name":"training.python_web","full_name":"UWPCE-PythonCert/training.python_web","owner":{"login":"UWPCE-PythonCert","id":5218825,"avatar_url":"https://avatars.githubusercontent.com/u/5218825?v=3","gravatar_id":"","url":"https://api.github.com/users/UWPCE-PythonCert","html_url":"https://github.com/UWPCE-PythonCert","followers_url":"https://api.github.com/users/UWPCE-PythonCert/followers","following_url":"https://api.github.com/users/UWPCE-PythonCert/following{/other_user}","gists_url":"https://api.github.com/users/UWPCE-PythonCert/gists{/gist_id}","starred_url":"https://api.github.com/users/UWPCE-PythonCert/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/UWPCE-PythonCert/subscriptions","organizations_url":"https://api.github.com/users/UWPCE-PythonCert/orgs","repos_url":"https://api.github.com/users/UWPCE-PythonCert/repos","events_url":"https://api.github.com/users/UWPCE-PythonCert/events{/privacy}","received_events_url":"https://api.github.com/users/UWPCE-PythonCert/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/UWPCE-PythonCert/training.python_web","description":"Lecture and training materials for the 2016 Internet Programming with Python course from UW PCE","fork":true,"url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web","forks_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/forks","keys_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/keys{/key_id}","collaborators_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/teams","hooks_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/hooks","issue_events_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/issues/events{/number}","events_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/events","assignees_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/assignees{/user}","branches_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/branches{/branch}","tags_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/tags","blobs_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/git/refs{/sha}","trees_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/git/trees{/sha}","statuses_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/statuses/{sha}","languages_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/languages","stargazers_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/stargazers","contributors_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/contributors","subscribers_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/subscribers","subscription_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/subscription","commits_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/commits{/sha}","git_commits_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/git/commits{/sha}","comments_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/comments{/number}","issue_comment_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/issues/comments{/number}","contents_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/contents/{+path}","compare_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/compare/{base}...{head}","merges_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/merges","archive_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/downloads","issues_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/issues{/number}","pulls_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/pulls{/number}","milestones_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/milestones{/number}","notifications_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/labels{/name}","releases_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/releases{/id}","deployments_url":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/deployments","created_at":"2013-12-04T05:43:56Z","updated_at":"2016-01-04T23:25:27Z","pushed_at":"2016-02-02T23:12:18Z","git_url":"git://github.com/UWPCE-PythonCert/training.python_web.git","ssh_url":"git@github.com:UWPCE-PythonCert/training.python_web.git","clone_url":"https://github.com/UWPCE-PythonCert/training.python_web.git","svn_url":"https://github.com/UWPCE-PythonCert/training.python_web","homepage":"","size":21306,"stargazers_count":8,"watchers_count":8,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":54,"mirror_url":null,"open_issues_count":5,"forks":54,"open_issues":5,"watchers":8,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/pulls/133"},"html":{"href":"https://github.com/UWPCE-PythonCert/training.python_web/pull/133"},"issue":{"href":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/issues/133"},"comments":{"href":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/issues/133/comments"},"review_comments":{"href":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/pulls/133/comments"},"review_comment":{"href":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/pulls/133/commits"},"statuses":{"href":"https://api.github.com/repos/UWPCE-PythonCert/training.python_web/statuses/fe617f33ba7d75aafee3f3075364bd2102bb538c"}}}}