{"action":"created","comment":{"url":"https://api.github.com/repos/napalm-automation/napalm-ios/pulls/comments/117296306","pull_request_review_id":38989078,"id":117296306,"diff_hunk":"@@ -1134,129 +1136,225 @@ def bgp_time_conversion(bgp_uptime):\n     def get_bgp_neighbors(self):\n         \"\"\"\n         BGP neighbor information.\n-\n-        Currently, no VRF support\n-        Not tested with IPv6\n-\n-        Example output of 'show ip bgp summary' only peer table\n-        Neighbor        V    AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down State/PfxRcd\n-        10.100.1.1      4   200      26      22      199    0    0 00:14:23 23\n-        10.200.1.1      4   300      21      51      199    0    0 00:13:40 0\n-        192.168.1.2     4   200      19      17        0    0    0 00:00:21 2\n-        1.1.1.1         4     1       0       0        0    0    0 never    Active\n-        3.3.3.3         4     2       0       0        0    0    0 never    Idle\n-        1.1.1.2         4     1      11       9        0    0    0 00:00:13 Idle (Admin)\n-        1.1.1.3         4 27506  256642   11327     2527    0    0 1w0d     519\n-        1.1.1.4         4 46887 1015641   19982     2527    0    0 1w0d     365\n-        192.168.1.237   4 60000    2139    2355 13683280    0    0 1d11h    4 (SE)\n-        10.90.1.4       4 65015    2508    2502      170    0    0 1d17h    163\n-        172.30.155.20   4   111       0       0        0    0    0 never    Active\n-        1.1.1.5         4  6500      54      28        0    0    0 00:00:49 Idle (PfxCt)\n-        10.1.4.46       4  3979   95244   98874   267067    0    0 8w5d     254\n-        10.1.4.58       4  3979    2715    3045   267067    0    0 1d21h    2\n-        10.1.1.85       4 65417 8344303 8343570      235    0    0 1y28w    2\n+        Currently no VRF support\n+        Tested and working with IPv6\n         \"\"\"\n-        cmd_bgp_summary = 'show ip bgp summary'\n-        bgp_neighbor_data = {}\n+        supported_afi = ['ipv4', 'ipv6']\n+        # start output dict structure\n+        bgp_neighbor_data = dict()\n         bgp_neighbor_data['global'] = {}\n-\n-        output = self._send_command(cmd_bgp_summary).strip()\n-        # Cisco issue where new lines are inserted after neighbor IP\n-        output = re.sub(RE_IPADDR_STRIP, r\"\\1\", output)\n-        if 'Neighbor' not in output:\n-            return {}\n-        for line in output.splitlines():\n-            if 'router identifier' in line:\n-                # BGP router identifier 172.16.1.1, local AS number 100\n-                rid_regex = r'^.* router identifier (\\d+\\.\\d+\\.\\d+\\.\\d+), local AS number (\\d+)'\n-                match = re.search(rid_regex, line)\n-                router_id = match.group(1)\n-                local_as = int(match.group(2))\n-                break\n-        bgp_neighbor_data['global']['router_id'] = py23_compat.text_type(router_id)\n+        # get summary output from device\n+        cmd_bgp_all_sum = 'show bgp all summary'\n+        summary_output = self._send_command(cmd_bgp_all_sum).strip()\n+        # get neighbor output from device\n+        neighbor_output = ''\n+        for afi in supported_afi:\n+            cmd_bgp_neighbor = 'show bgp %s unicast neighbors' % afi\n+            neighbor_output += self._send_command(cmd_bgp_neighbor).strip()\n+            neighbor_output += \"\\n\"\n+        # compile regexps\n+        parse_summary = {\n+            'patterns': [\n+                {'regexp': re.compile(r'^For address family: (?P<afi>\\S+) (?P<safi>\\S+)'),\n+                 'record': False},\n+                {'regexp': re.compile(r'^.* router identifier (?P<router_id>\\d+(\\.\\d+){3}), '\n+                                      r'local AS number (?P<local_as>\\d+)'),\n+                 'record': False},\n+                {'regexp': re.compile(r'^\\*?(?P<remote_addr>(\\d+(\\.\\d+){3})|([0-9a-fA-F:]{2,40}))'\n+                                      r'\\s+\\d+\\s+(?P<remote_as>\\d+)(\\s+\\S+){5}\\s+'\n+                                      r'(?P<uptime>(never)|\\d+\\S+)\\s+(?P<accepted_prefixes>\\d+)'),\n+                 'record': True},\n+                {'regexp': re.compile(r'^\\*?(?P<remote_addr>(\\d+(\\.\\d+){3})|([0-9a-fA-F:]{2,40}))'\n+                                      r'\\s+\\d+\\s+(?P<remote_as>\\d+)(\\s+\\S+){5}\\s+'\n+                                      r'(?P<uptime>(never)|\\d+\\S+)\\s+(?P<state>\\D.*)'),\n+                 'record': True},\n+                {'regexp': re.compile(r'^\\*?(?P<remote_addr>(\\d+(\\.\\d+){3})|([0-9a-fA-F:]{2,40}))'),\n+                 'record': False},\n+                {'regexp': re.compile(r'^\\s+\\d+\\s+(?P<remote_as>\\d+)(\\s+\\S+){5}\\s+'\n+                                      r'(?P<uptime>(never)|\\d+\\S+)\\s+(?P<accepted_prefixes>\\d+)'),\n+                 'record': True},\n+                {'regexp': re.compile(r'^\\s+\\d+\\s+(?P<remote_as>\\d+)(\\s+\\S+){5}\\s+'\n+                                      r'(?P<uptime>(never)|\\d+\\S+)\\s+(?P<state>\\D.*)'),\n+                 'record': True}\n+            ],\n+            'no_fill_fields': ['accepted_prefixes', 'state']\n+        }\n+        parse_neighbors = {\n+            'patterns': [\n+                {'regexp': re.compile(r'^BGP neighbor is '\n+                                      r'(?P<remote_addr>(\\d+(\\.\\d+){3})|([0-9a-fA-F:]{2,40})),'\n+                                      r'\\s+remote AS (?P<remote_as>\\d+).*'),\n+                 'record': False},\n+                {'regexp': re.compile(r'^\\s+Description: (?P<description>.+)'),\n+                 'record': False},\n+                {'regexp': re.compile(r'^\\s+BGP version \\d+, remote router ID '\n+                                      r'(?P<remote_id>\\d+(\\.\\d+){3})'),\n+                 'record': False},\n+                {'regexp': re.compile(r'^\\s+For address family: (?P<afi>\\S+) (?P<safi>\\S+)'),\n+                 'record': False},\n+                {'regexp': re.compile(r'^\\s+Prefixes Current:\\s+(?P<sent_prefixes>\\d+)\\s+'\n+                                      r'(?P<accepted_prefixes>\\d+).*'),\n+                 'record': False},\n+                {'regexp': re.compile(r'^\\s+Saved (soft-reconfig):.+(?P<received_prefixes>\\d+).*'),\n+                 'record': True},\n+                {'regexp': re.compile(r'^\\s+Local Policy Denied Prefixes:.+'),\n+                 'record': True}\n+            ],\n+            'no_fill_fields': ['received_prefixes']\n+        }\n+        # parse outputs into a list of dicts\n+        summary_data = []\n+        summary_data_entry = {}\n+        for line in summary_output.splitlines():\n+            for item in parse_summary['patterns']:\n+                match = item['regexp'].match(line)\n+                if match:\n+                    summary_data_entry.update(match.groupdict())\n+                    if item['record']:\n+                        summary_data.append(copy.deepcopy(summary_data_entry))\n+                        for field in parse_summary['no_fill_fields']:\n+                            try:\n+                                del summary_data_entry[field]\n+                            except KeyError:\n+                                pass\n+                    break\n+        neighbor_data = []\n+        neighbor_data_entry = {}\n+        for line in neighbor_output.splitlines():\n+            for item in parse_neighbors['patterns']:\n+                match = item['regexp'].match(line)\n+                if match:\n+                    neighbor_data_entry.update(match.groupdict())\n+                    if item['record']:\n+                        neighbor_data.append(copy.deepcopy(neighbor_data_entry))\n+                        for field in parse_neighbors['no_fill_fields']:\n+                            try:\n+                                del neighbor_data_entry[field]\n+                            except KeyError:\n+                                pass\n+                    break\n+        router_id = None\n+        # check that we got a list of dicts\n+        assert summary_data and isinstance(summary_data, list)\n+        for entry in summary_data:\n+            assert isinstance(entry, dict)\n+            assert 'router_id' in entry","path":"napalm_ios/ios.py","position":185,"original_position":153,"commit_id":"071e98fce739b8e7e65580f76b019b4e16a10eac","original_commit_id":"4627d688e24cd57a81460268482ba6af2c7e0527","user":{"login":"ktbyers","id":899716,"avatar_url":"https://avatars3.githubusercontent.com/u/899716?v=3","gravatar_id":"","url":"https://api.github.com/users/ktbyers","html_url":"https://github.com/ktbyers","followers_url":"https://api.github.com/users/ktbyers/followers","following_url":"https://api.github.com/users/ktbyers/following{/other_user}","gists_url":"https://api.github.com/users/ktbyers/gists{/gist_id}","starred_url":"https://api.github.com/users/ktbyers/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ktbyers/subscriptions","organizations_url":"https://api.github.com/users/ktbyers/orgs","repos_url":"https://api.github.com/users/ktbyers/repos","events_url":"https://api.github.com/users/ktbyers/events{/privacy}","received_events_url":"https://api.github.com/users/ktbyers/received_events","type":"User","site_admin":false},"body":"I would scrap these asserts and just let the KeyError exception happen (in the following lines). It will get us a more meaningful message than the asserts.","created_at":"2017-05-18T16:36:52Z","updated_at":"2017-05-18T16:59:49Z","html_url":"https://github.com/napalm-automation/napalm-ios/pull/137#discussion_r117296306","pull_request_url":"https://api.github.com/repos/napalm-automation/napalm-ios/pulls/137","_links":{"self":{"href":"https://api.github.com/repos/napalm-automation/napalm-ios/pulls/comments/117296306"},"html":{"href":"https://github.com/napalm-automation/napalm-ios/pull/137#discussion_r117296306"},"pull_request":{"href":"https://api.github.com/repos/napalm-automation/napalm-ios/pulls/137"}}},"pull_request":{"url":"https://api.github.com/repos/napalm-automation/napalm-ios/pulls/137","id":115562020,"html_url":"https://github.com/napalm-automation/napalm-ios/pull/137","diff_url":"https://github.com/napalm-automation/napalm-ios/pull/137.diff","patch_url":"https://github.com/napalm-automation/napalm-ios/pull/137.patch","issue_url":"https://api.github.com/repos/napalm-automation/napalm-ios/issues/137","number":137,"state":"open","locked":false,"title":"get_bgp_neighbors method re-implementation","user":{"login":"benmaddison","id":19263308,"avatar_url":"https://avatars1.githubusercontent.com/u/19263308?v=3","gravatar_id":"","url":"https://api.github.com/users/benmaddison","html_url":"https://github.com/benmaddison","followers_url":"https://api.github.com/users/benmaddison/followers","following_url":"https://api.github.com/users/benmaddison/following{/other_user}","gists_url":"https://api.github.com/users/benmaddison/gists{/gist_id}","starred_url":"https://api.github.com/users/benmaddison/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/benmaddison/subscriptions","organizations_url":"https://api.github.com/users/benmaddison/orgs","repos_url":"https://api.github.com/users/benmaddison/repos","events_url":"https://api.github.com/users/benmaddison/events{/privacy}","received_events_url":"https://api.github.com/users/benmaddison/received_events","type":"User","site_admin":false},"body":"The revised implementation provides:\r\n\r\n- ipv6 address family support\r\n- neighbor description parsing\r\n- order of magnitude speed up in execution time for routers with many peers\r\n\r\n`textfsm` is used for output parsing. I'm willing to help re-write using `re` if the consensus is against the use of `textfsm`.","created_at":"2017-04-12T14:54:31Z","updated_at":"2017-05-18T16:59:49Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5d7100ed423c77f391a6119fab216b9c21128c1a","assignee":{"login":"ktbyers","id":899716,"avatar_url":"https://avatars3.githubusercontent.com/u/899716?v=3","gravatar_id":"","url":"https://api.github.com/users/ktbyers","html_url":"https://github.com/ktbyers","followers_url":"https://api.github.com/users/ktbyers/followers","following_url":"https://api.github.com/users/ktbyers/following{/other_user}","gists_url":"https://api.github.com/users/ktbyers/gists{/gist_id}","starred_url":"https://api.github.com/users/ktbyers/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ktbyers/subscriptions","organizations_url":"https://api.github.com/users/ktbyers/orgs","repos_url":"https://api.github.com/users/ktbyers/repos","events_url":"https://api.github.com/users/ktbyers/events{/privacy}","received_events_url":"https://api.github.com/users/ktbyers/received_events","type":"User","site_admin":false},"assignees":[{"login":"ktbyers","id":899716,"avatar_url":"https://avatars3.githubusercontent.com/u/899716?v=3","gravatar_id":"","url":"https://api.github.com/users/ktbyers","html_url":"https://github.com/ktbyers","followers_url":"https://api.github.com/users/ktbyers/followers","following_url":"https://api.github.com/users/ktbyers/following{/other_user}","gists_url":"https://api.github.com/users/ktbyers/gists{/gist_id}","starred_url":"https://api.github.com/users/ktbyers/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ktbyers/subscriptions","organizations_url":"https://api.github.com/users/ktbyers/orgs","repos_url":"https://api.github.com/users/ktbyers/repos","events_url":"https://api.github.com/users/ktbyers/events{/privacy}","received_events_url":"https://api.github.com/users/ktbyers/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"milestone":{"url":"https://api.github.com/repos/napalm-automation/napalm-ios/milestones/5","html_url":"https://github.com/napalm-automation/napalm-ios/milestone/5","labels_url":"https://api.github.com/repos/napalm-automation/napalm-ios/milestones/5/labels","id":2141844,"number":5,"title":"APPROVED","description":"","creator":{"login":"mirceaulinic","id":16694679,"avatar_url":"https://avatars2.githubusercontent.com/u/16694679?v=3","gravatar_id":"","url":"https://api.github.com/users/mirceaulinic","html_url":"https://github.com/mirceaulinic","followers_url":"https://api.github.com/users/mirceaulinic/followers","following_url":"https://api.github.com/users/mirceaulinic/following{/other_user}","gists_url":"https://api.github.com/users/mirceaulinic/gists{/gist_id}","starred_url":"https://api.github.com/users/mirceaulinic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mirceaulinic/subscriptions","organizations_url":"https://api.github.com/users/mirceaulinic/orgs","repos_url":"https://api.github.com/users/mirceaulinic/repos","events_url":"https://api.github.com/users/mirceaulinic/events{/privacy}","received_events_url":"https://api.github.com/users/mirceaulinic/received_events","type":"User","site_admin":false},"open_issues":12,"closed_issues":19,"state":"open","created_at":"2016-11-17T13:39:42Z","updated_at":"2017-05-02T22:45:54Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/napalm-automation/napalm-ios/pulls/137/commits","review_comments_url":"https://api.github.com/repos/napalm-automation/napalm-ios/pulls/137/comments","review_comment_url":"https://api.github.com/repos/napalm-automation/napalm-ios/pulls/comments{/number}","comments_url":"https://api.github.com/repos/napalm-automation/napalm-ios/issues/137/comments","statuses_url":"https://api.github.com/repos/napalm-automation/napalm-ios/statuses/071e98fce739b8e7e65580f76b019b4e16a10eac","head":{"label":"wolcomm:develop","ref":"develop","sha":"071e98fce739b8e7e65580f76b019b4e16a10eac","user":{"login":"wolcomm","id":19263339,"avatar_url":"https://avatars3.githubusercontent.com/u/19263339?v=3","gravatar_id":"","url":"https://api.github.com/users/wolcomm","html_url":"https://github.com/wolcomm","followers_url":"https://api.github.com/users/wolcomm/followers","following_url":"https://api.github.com/users/wolcomm/following{/other_user}","gists_url":"https://api.github.com/users/wolcomm/gists{/gist_id}","starred_url":"https://api.github.com/users/wolcomm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wolcomm/subscriptions","organizations_url":"https://api.github.com/users/wolcomm/orgs","repos_url":"https://api.github.com/users/wolcomm/repos","events_url":"https://api.github.com/users/wolcomm/events{/privacy}","received_events_url":"https://api.github.com/users/wolcomm/received_events","type":"Organization","site_admin":false},"repo":{"id":87862460,"name":"napalm-ios","full_name":"wolcomm/napalm-ios","owner":{"login":"wolcomm","id":19263339,"avatar_url":"https://avatars3.githubusercontent.com/u/19263339?v=3","gravatar_id":"","url":"https://api.github.com/users/wolcomm","html_url":"https://github.com/wolcomm","followers_url":"https://api.github.com/users/wolcomm/followers","following_url":"https://api.github.com/users/wolcomm/following{/other_user}","gists_url":"https://api.github.com/users/wolcomm/gists{/gist_id}","starred_url":"https://api.github.com/users/wolcomm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wolcomm/subscriptions","organizations_url":"https://api.github.com/users/wolcomm/orgs","repos_url":"https://api.github.com/users/wolcomm/repos","events_url":"https://api.github.com/users/wolcomm/events{/privacy}","received_events_url":"https://api.github.com/users/wolcomm/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/wolcomm/napalm-ios","description":null,"fork":true,"url":"https://api.github.com/repos/wolcomm/napalm-ios","forks_url":"https://api.github.com/repos/wolcomm/napalm-ios/forks","keys_url":"https://api.github.com/repos/wolcomm/napalm-ios/keys{/key_id}","collaborators_url":"https://api.github.com/repos/wolcomm/napalm-ios/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/wolcomm/napalm-ios/teams","hooks_url":"https://api.github.com/repos/wolcomm/napalm-ios/hooks","issue_events_url":"https://api.github.com/repos/wolcomm/napalm-ios/issues/events{/number}","events_url":"https://api.github.com/repos/wolcomm/napalm-ios/events","assignees_url":"https://api.github.com/repos/wolcomm/napalm-ios/assignees{/user}","branches_url":"https://api.github.com/repos/wolcomm/napalm-ios/branches{/branch}","tags_url":"https://api.github.com/repos/wolcomm/napalm-ios/tags","blobs_url":"https://api.github.com/repos/wolcomm/napalm-ios/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/wolcomm/napalm-ios/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/wolcomm/napalm-ios/git/refs{/sha}","trees_url":"https://api.github.com/repos/wolcomm/napalm-ios/git/trees{/sha}","statuses_url":"https://api.github.com/repos/wolcomm/napalm-ios/statuses/{sha}","languages_url":"https://api.github.com/repos/wolcomm/napalm-ios/languages","stargazers_url":"https://api.github.com/repos/wolcomm/napalm-ios/stargazers","contributors_url":"https://api.github.com/repos/wolcomm/napalm-ios/contributors","subscribers_url":"https://api.github.com/repos/wolcomm/napalm-ios/subscribers","subscription_url":"https://api.github.com/repos/wolcomm/napalm-ios/subscription","commits_url":"https://api.github.com/repos/wolcomm/napalm-ios/commits{/sha}","git_commits_url":"https://api.github.com/repos/wolcomm/napalm-ios/git/commits{/sha}","comments_url":"https://api.github.com/repos/wolcomm/napalm-ios/comments{/number}","issue_comment_url":"https://api.github.com/repos/wolcomm/napalm-ios/issues/comments{/number}","contents_url":"https://api.github.com/repos/wolcomm/napalm-ios/contents/{+path}","compare_url":"https://api.github.com/repos/wolcomm/napalm-ios/compare/{base}...{head}","merges_url":"https://api.github.com/repos/wolcomm/napalm-ios/merges","archive_url":"https://api.github.com/repos/wolcomm/napalm-ios/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/wolcomm/napalm-ios/downloads","issues_url":"https://api.github.com/repos/wolcomm/napalm-ios/issues{/number}","pulls_url":"https://api.github.com/repos/wolcomm/napalm-ios/pulls{/number}","milestones_url":"https://api.github.com/repos/wolcomm/napalm-ios/milestones{/number}","notifications_url":"https://api.github.com/repos/wolcomm/napalm-ios/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/wolcomm/napalm-ios/labels{/name}","releases_url":"https://api.github.com/repos/wolcomm/napalm-ios/releases{/id}","deployments_url":"https://api.github.com/repos/wolcomm/napalm-ios/deployments","created_at":"2017-04-10T22:14:38Z","updated_at":"2017-04-10T22:14:39Z","pushed_at":"2017-05-18T16:10:03Z","git_url":"git://github.com/wolcomm/napalm-ios.git","ssh_url":"git@github.com:wolcomm/napalm-ios.git","clone_url":"https://github.com/wolcomm/napalm-ios.git","svn_url":"https://github.com/wolcomm/napalm-ios","homepage":null,"size":589,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"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":"develop"}},"base":{"label":"napalm-automation:develop","ref":"develop","sha":"1069480b7b1054d2070fba8b32b11a01c4fa333c","user":{"login":"napalm-automation","id":16415577,"avatar_url":"https://avatars1.githubusercontent.com/u/16415577?v=3","gravatar_id":"","url":"https://api.github.com/users/napalm-automation","html_url":"https://github.com/napalm-automation","followers_url":"https://api.github.com/users/napalm-automation/followers","following_url":"https://api.github.com/users/napalm-automation/following{/other_user}","gists_url":"https://api.github.com/users/napalm-automation/gists{/gist_id}","starred_url":"https://api.github.com/users/napalm-automation/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/napalm-automation/subscriptions","organizations_url":"https://api.github.com/users/napalm-automation/orgs","repos_url":"https://api.github.com/users/napalm-automation/repos","events_url":"https://api.github.com/users/napalm-automation/events{/privacy}","received_events_url":"https://api.github.com/users/napalm-automation/received_events","type":"Organization","site_admin":false},"repo":{"id":53492012,"name":"napalm-ios","full_name":"napalm-automation/napalm-ios","owner":{"login":"napalm-automation","id":16415577,"avatar_url":"https://avatars1.githubusercontent.com/u/16415577?v=3","gravatar_id":"","url":"https://api.github.com/users/napalm-automation","html_url":"https://github.com/napalm-automation","followers_url":"https://api.github.com/users/napalm-automation/followers","following_url":"https://api.github.com/users/napalm-automation/following{/other_user}","gists_url":"https://api.github.com/users/napalm-automation/gists{/gist_id}","starred_url":"https://api.github.com/users/napalm-automation/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/napalm-automation/subscriptions","organizations_url":"https://api.github.com/users/napalm-automation/orgs","repos_url":"https://api.github.com/users/napalm-automation/repos","events_url":"https://api.github.com/users/napalm-automation/events{/privacy}","received_events_url":"https://api.github.com/users/napalm-automation/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/napalm-automation/napalm-ios","description":null,"fork":false,"url":"https://api.github.com/repos/napalm-automation/napalm-ios","forks_url":"https://api.github.com/repos/napalm-automation/napalm-ios/forks","keys_url":"https://api.github.com/repos/napalm-automation/napalm-ios/keys{/key_id}","collaborators_url":"https://api.github.com/repos/napalm-automation/napalm-ios/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/napalm-automation/napalm-ios/teams","hooks_url":"https://api.github.com/repos/napalm-automation/napalm-ios/hooks","issue_events_url":"https://api.github.com/repos/napalm-automation/napalm-ios/issues/events{/number}","events_url":"https://api.github.com/repos/napalm-automation/napalm-ios/events","assignees_url":"https://api.github.com/repos/napalm-automation/napalm-ios/assignees{/user}","branches_url":"https://api.github.com/repos/napalm-automation/napalm-ios/branches{/branch}","tags_url":"https://api.github.com/repos/napalm-automation/napalm-ios/tags","blobs_url":"https://api.github.com/repos/napalm-automation/napalm-ios/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/napalm-automation/napalm-ios/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/napalm-automation/napalm-ios/git/refs{/sha}","trees_url":"https://api.github.com/repos/napalm-automation/napalm-ios/git/trees{/sha}","statuses_url":"https://api.github.com/repos/napalm-automation/napalm-ios/statuses/{sha}","languages_url":"https://api.github.com/repos/napalm-automation/napalm-ios/languages","stargazers_url":"https://api.github.com/repos/napalm-automation/napalm-ios/stargazers","contributors_url":"https://api.github.com/repos/napalm-automation/napalm-ios/contributors","subscribers_url":"https://api.github.com/repos/napalm-automation/napalm-ios/subscribers","subscription_url":"https://api.github.com/repos/napalm-automation/napalm-ios/subscription","commits_url":"https://api.github.com/repos/napalm-automation/napalm-ios/commits{/sha}","git_commits_url":"https://api.github.com/repos/napalm-automation/napalm-ios/git/commits{/sha}","comments_url":"https://api.github.com/repos/napalm-automation/napalm-ios/comments{/number}","issue_comment_url":"https://api.github.com/repos/napalm-automation/napalm-ios/issues/comments{/number}","contents_url":"https://api.github.com/repos/napalm-automation/napalm-ios/contents/{+path}","compare_url":"https://api.github.com/repos/napalm-automation/napalm-ios/compare/{base}...{head}","merges_url":"https://api.github.com/repos/napalm-automation/napalm-ios/merges","archive_url":"https://api.github.com/repos/napalm-automation/napalm-ios/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/napalm-automation/napalm-ios/downloads","issues_url":"https://api.github.com/repos/napalm-automation/napalm-ios/issues{/number}","pulls_url":"https://api.github.com/repos/napalm-automation/napalm-ios/pulls{/number}","milestones_url":"https://api.github.com/repos/napalm-automation/napalm-ios/milestones{/number}","notifications_url":"https://api.github.com/repos/napalm-automation/napalm-ios/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/napalm-automation/napalm-ios/labels{/name}","releases_url":"https://api.github.com/repos/napalm-automation/napalm-ios/releases{/id}","deployments_url":"https://api.github.com/repos/napalm-automation/napalm-ios/deployments","created_at":"2016-03-09T11:20:16Z","updated_at":"2017-05-01T18:33:10Z","pushed_at":"2017-05-18T16:10:05Z","git_url":"git://github.com/napalm-automation/napalm-ios.git","ssh_url":"git@github.com:napalm-automation/napalm-ios.git","clone_url":"https://github.com/napalm-automation/napalm-ios.git","svn_url":"https://github.com/napalm-automation/napalm-ios","homepage":null,"size":405,"stargazers_count":13,"watchers_count":13,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":27,"mirror_url":null,"open_issues_count":23,"forks":27,"open_issues":23,"watchers":13,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/napalm-automation/napalm-ios/pulls/137"},"html":{"href":"https://github.com/napalm-automation/napalm-ios/pull/137"},"issue":{"href":"https://api.github.com/repos/napalm-automation/napalm-ios/issues/137"},"comments":{"href":"https://api.github.com/repos/napalm-automation/napalm-ios/issues/137/comments"},"review_comments":{"href":"https://api.github.com/repos/napalm-automation/napalm-ios/pulls/137/comments"},"review_comment":{"href":"https://api.github.com/repos/napalm-automation/napalm-ios/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/napalm-automation/napalm-ios/pulls/137/commits"},"statuses":{"href":"https://api.github.com/repos/napalm-automation/napalm-ios/statuses/071e98fce739b8e7e65580f76b019b4e16a10eac"}}}}
{"actor":{"display_login":"ktbyers"}}