{"action":"created","comment":{"url":"https://api.github.com/repos/spyder-ide/spyder/pulls/comments/34147700","id":34147700,"diff_hunk":"@@ -7,179 +7,504 @@\n \"\"\"Shortcut management\"\"\"\r\n \r\n from __future__ import print_function\r\n+import os\r\n+import re\r\n+import sys\r\n \r\n-from spyderlib.qt.QtGui import (QVBoxLayout, QComboBox, QItemDelegate,\r\n-                                QTableView, QMessageBox, QPushButton)\r\n-from spyderlib.qt.QtCore import Qt, QSize, QAbstractTableModel, QModelIndex\r\n+from spyderlib.qt.QtGui import (QVBoxLayout, QTableView, QMessageBox,\r\n+                                QPushButton, QKeySequence, QDialog,\r\n+                                QDialogButtonBox, QLabel, QGridLayout,\r\n+                                QLineEdit, QAbstractItemView,\r\n+                                QSortFilterProxyModel, QStyledItemDelegate,\r\n+                                QStyleOptionViewItemV4, QApplication,\r\n+                                QTextDocument, QStyle, QSpacerItem,\r\n+                                QAbstractTextDocumentLayout,\r\n+                                QRegExpValidator, QToolTip,\r\n+                                QHBoxLayout)\r\n+from spyderlib.qt.QtCore import (Qt, QAbstractTableModel, QModelIndex, QSize,\r\n+                                 QPoint, QRegExp)\r\n from spyderlib.qt.compat import to_qvariant, from_qvariant\r\n import spyderlib.utils.icon_manager as ima\r\n \r\n-import sys\r\n-\r\n # Local imports\r\n-from spyderlib.baseconfig import _\r\n+from spyderlib.baseconfig import _, debug_print\r\n from spyderlib.guiconfig import (get_shortcut, set_shortcut,\r\n                                  iter_shortcuts, reset_shortcuts)\r\n from spyderlib.plugins.configdialog import GeneralConfigPage\r\n-from spyderlib.py3compat import to_text_string, is_text_string\r\n+from spyderlib.utils.qthelpers import get_std_icon\r\n+from spyderlib.widgets.arraybuilder import HelperToolButton\r\n \r\n+MODIFIERS = {Qt.Key_Shift: Qt.SHIFT,\r\n+             Qt.Key_Control: Qt.CTRL,\r\n+             Qt.Key_Alt: Qt.ALT,\r\n+             Qt.Key_Meta: Qt.META}\r\n \r\n-KEYSTRINGS = [\"Escape\", \"Tab\", \"Backtab\", \"Backspace\", \"Return\", \"Enter\",\r\n-              \"Delete\", \"Pause\", \"Print\", \"Clear\", \"Home\", \"End\", \"Left\",\r\n+SINGLE_KEYS = [\"F{}\".format(_i) for _i in range(1, 36)] + [\"Delete\", \"Escape\"]\r\n+KEYSTRINGS = [\"Tab\", \"Backtab\", \"Backspace\", \"Return\", \"Enter\",\r\n+              \"Pause\", \"Print\", \"Clear\", \"Home\", \"End\", \"Left\",\r\n               \"Up\", \"Right\", \"Down\", \"PageUp\", \"PageDown\"] + \\\r\n-             [\"F%d\" % _i for _i in range(1, 36)] + \\\r\n-             [\"Space\", \"Exclam\", \"QuoteDbl\", \"NumberSign\", \"Dollar\", \"Percent\",\r\n-              \"Ampersand\", \"Apostrophe\", \"ParenLeft\", \"ParenRight\", \"Asterisk\",\r\n-              \"Plus\", \"Comma\", \"Minus\", \"Period\", \"Slash\"] + \\\r\n+             [\"Space\", \"Exclam\", \"QuoteDbl\", \"NumberSign\", \"Dollar\",\r\n+              \"Percent\", \"Ampersand\", \"Apostrophe\", \"ParenLeft\",\r\n+              \"ParenRight\", \"Asterisk\", \"Plus\", \"Comma\", \"Minus\",\r\n+              \"Period\", \"Slash\"] + \\\r\n              [str(_i) for _i in range(10)] + \\\r\n-             [\"Colon\", \"Semicolon\", \"Less\", \"Equal\", \"Greater\", \"Question\",\r\n-              \"At\"] + [chr(_i) for _i in range(65, 91)] + \\\r\n-             [\"BracketLeft\", \"Backslash\", \"BracketRight\", \"Underscore\"]\r\n-\r\n-\r\n-class Key(object):\r\n-    MODIFIERS = {Qt.NoModifier: \"\", Qt.ShiftModifier: \"Shift\",\r\n-                 Qt.ControlModifier: \"Ctrl\", Qt.AltModifier: \"Alt\",\r\n-                 Qt.MetaModifier: \"Meta\"}\r\n-    if sys.platform == 'darwin':\r\n-        MODIFIERNAMES = {Qt.NoModifier: \"\", Qt.ShiftModifier: \"Shift\",\r\n-                         Qt.ControlModifier: \"Cmd\", Qt.AltModifier: \"Alt\",\r\n-                         Qt.MetaModifier: \"Ctrl\"}\r\n-    elif sys.platform == 'win32':\r\n-        MODIFIERNAMES = {Qt.NoModifier: \"\", Qt.ShiftModifier: \"Shift\",\r\n-                         Qt.ControlModifier: \"Ctrl\", Qt.AltModifier: \"Alt\",\r\n-                         Qt.MetaModifier: \"Win\"}\r\n-    else:\r\n-        MODIFIERNAMES = {Qt.NoModifier: \"\", Qt.ShiftModifier: \"Shift\",\r\n-                         Qt.ControlModifier: \"Ctrl\", Qt.AltModifier: \"Alt\",\r\n-                         Qt.MetaModifier: \"Meta\"}\r\n-    KEYS = {}\r\n-    for attr in KEYSTRINGS:\r\n-        # ISSUE\r\n-        # This is needed to cope with a strange behaviour of Qt.\r\n-        # Qt.Key_PageUp/Qt.Key_PageDown when string parsed use PgDown/PgUp\r\n-        attr2 = attr\r\n-        if attr == 'PageDown':\r\n-            attr2 = 'PgDown'\r\n-        elif attr == 'PageUp':\r\n-            attr2 = 'PgUp'\r\n-\r\n-        KEYS[getattr(Qt, \"Key_\"+attr)] = attr2\r\n-\r\n-    def __init__(self, key, mod1=Qt.NoModifier, mod2=Qt.NoModifier,\r\n-                 mod3=Qt.NoModifier):\r\n-        modifiers = [mod1, mod2, mod3]\r\n-        assert all([mod in self.MODIFIERS for mod in modifiers])\r\n-        self.modifiers = sorted(modifiers)\r\n-        assert key in self.KEYS\r\n-        self.key = key\r\n+             [\"Colon\", \"Semicolon\", \"Less\", \"Equal\", \"Greater\",\r\n+              \"Question\", \"At\"] + [chr(_i) for _i in range(65, 91)] + \\\r\n+             [\"BracketLeft\", \"Backslash\", \"BracketRight\", \"Underscore\",\r\n+              \"Control\", \"Alt\", \"Shift\", \"Meta\"]\r\n+VALID_SINGLE_KEYS = [getattr(Qt, 'Key_{0}'.format(k)) for k in SINGLE_KEYS]\r\n+VALID_KEYS = [getattr(Qt, 'Key_{0}'.format(k)) for k in KEYSTRINGS+SINGLE_KEYS]\r\n+VALID_ACCENT_CHARS = \"ÁÉÍOÚáéíúóàèìòùÀÈÌÒÙâêîôûÂÊÎÔÛäëïöüÄËÏÖÜñÑ\"\r","path":"spyderlib/plugins/shortcuts.py","position":105,"original_position":105,"commit_id":"982277b0c7067078a7826a4a0cca57ec077f5c61","original_commit_id":"1f9581df69f56570869d4966b0f956b2f7afd716","user":{"login":"goanpeca","id":3627835,"avatar_url":"https://avatars.githubusercontent.com/u/3627835?v=3","gravatar_id":"","url":"https://api.github.com/users/goanpeca","html_url":"https://github.com/goanpeca","followers_url":"https://api.github.com/users/goanpeca/followers","following_url":"https://api.github.com/users/goanpeca/following{/other_user}","gists_url":"https://api.github.com/users/goanpeca/gists{/gist_id}","starred_url":"https://api.github.com/users/goanpeca/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/goanpeca/subscriptions","organizations_url":"https://api.github.com/users/goanpeca/orgs","repos_url":"https://api.github.com/users/goanpeca/repos","events_url":"https://api.github.com/users/goanpeca/events{/privacy}","received_events_url":"https://api.github.com/users/goanpeca/received_events","type":"User","site_admin":false},"body":"Of course this will break if someone starts doing weirder scripts... ","created_at":"2015-07-08T13:40:08Z","updated_at":"2015-07-08T13:40:08Z","html_url":"https://github.com/spyder-ide/spyder/pull/2367#discussion_r34147700","pull_request_url":"https://api.github.com/repos/spyder-ide/spyder/pulls/2367","_links":{"self":{"href":"https://api.github.com/repos/spyder-ide/spyder/pulls/comments/34147700"},"html":{"href":"https://github.com/spyder-ide/spyder/pull/2367#discussion_r34147700"},"pull_request":{"href":"https://api.github.com/repos/spyder-ide/spyder/pulls/2367"}}},"pull_request":{"url":"https://api.github.com/repos/spyder-ide/spyder/pulls/2367","id":34124225,"html_url":"https://github.com/spyder-ide/spyder/pull/2367","diff_url":"https://github.com/spyder-ide/spyder/pull/2367.diff","patch_url":"https://github.com/spyder-ide/spyder/pull/2367.patch","issue_url":"https://api.github.com/repos/spyder-ide/spyder/issues/2367","number":2367,"state":"open","locked":false,"title":"KeySequence Editor for Keyboard Shortcut Preferences","user":{"login":"blink1073","id":2096628,"avatar_url":"https://avatars.githubusercontent.com/u/2096628?v=3","gravatar_id":"","url":"https://api.github.com/users/blink1073","html_url":"https://github.com/blink1073","followers_url":"https://api.github.com/users/blink1073/followers","following_url":"https://api.github.com/users/blink1073/following{/other_user}","gists_url":"https://api.github.com/users/blink1073/gists{/gist_id}","starred_url":"https://api.github.com/users/blink1073/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/blink1073/subscriptions","organizations_url":"https://api.github.com/users/blink1073/orgs","repos_url":"https://api.github.com/users/blink1073/repos","events_url":"https://api.github.com/users/blink1073/events{/privacy}","received_events_url":"https://api.github.com/users/blink1073/received_events","type":"User","site_admin":false},"body":"Fixes #478\r\nFixes #494\r\nFixes #1940\r\nFixes #2125\r\n\r\n----\r\n\r\nAllows the user to enter keyboard shortcut preferences by typing them in.","created_at":"2015-04-26T14:52:44Z","updated_at":"2015-07-08T13:40:08Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0780d1feb2920fddb608a2de06ca87cd09f755fd","assignee":{"login":"blink1073","id":2096628,"avatar_url":"https://avatars.githubusercontent.com/u/2096628?v=3","gravatar_id":"","url":"https://api.github.com/users/blink1073","html_url":"https://github.com/blink1073","followers_url":"https://api.github.com/users/blink1073/followers","following_url":"https://api.github.com/users/blink1073/following{/other_user}","gists_url":"https://api.github.com/users/blink1073/gists{/gist_id}","starred_url":"https://api.github.com/users/blink1073/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/blink1073/subscriptions","organizations_url":"https://api.github.com/users/blink1073/orgs","repos_url":"https://api.github.com/users/blink1073/repos","events_url":"https://api.github.com/users/blink1073/events{/privacy}","received_events_url":"https://api.github.com/users/blink1073/received_events","type":"User","site_admin":false},"milestone":{"url":"https://api.github.com/repos/spyder-ide/spyder/milestones/5","html_url":"https://github.com/spyder-ide/spyder/milestones/v3.0","labels_url":"https://api.github.com/repos/spyder-ide/spyder/milestones/5/labels","id":982077,"number":5,"title":"v3.0","description":"New major release","creator":{"login":"spyder-issues-migrator","id":11021581,"avatar_url":"https://avatars.githubusercontent.com/u/11021581?v=3","gravatar_id":"","url":"https://api.github.com/users/spyder-issues-migrator","html_url":"https://github.com/spyder-issues-migrator","followers_url":"https://api.github.com/users/spyder-issues-migrator/followers","following_url":"https://api.github.com/users/spyder-issues-migrator/following{/other_user}","gists_url":"https://api.github.com/users/spyder-issues-migrator/gists{/gist_id}","starred_url":"https://api.github.com/users/spyder-issues-migrator/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spyder-issues-migrator/subscriptions","organizations_url":"https://api.github.com/users/spyder-issues-migrator/orgs","repos_url":"https://api.github.com/users/spyder-issues-migrator/repos","events_url":"https://api.github.com/users/spyder-issues-migrator/events{/privacy}","received_events_url":"https://api.github.com/users/spyder-issues-migrator/received_events","type":"User","site_admin":false},"open_issues":268,"closed_issues":102,"state":"open","created_at":"2015-02-16T23:17:23Z","updated_at":"2015-07-06T16:53:02Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/spyder-ide/spyder/pulls/2367/commits","review_comments_url":"https://api.github.com/repos/spyder-ide/spyder/pulls/2367/comments","review_comment_url":"https://api.github.com/repos/spyder-ide/spyder/pulls/comments{/number}","comments_url":"https://api.github.com/repos/spyder-ide/spyder/issues/2367/comments","statuses_url":"https://api.github.com/repos/spyder-ide/spyder/statuses/982277b0c7067078a7826a4a0cca57ec077f5c61","head":{"label":"blink1073:shortcut-editor","ref":"shortcut-editor","sha":"982277b0c7067078a7826a4a0cca57ec077f5c61","user":{"login":"blink1073","id":2096628,"avatar_url":"https://avatars.githubusercontent.com/u/2096628?v=3","gravatar_id":"","url":"https://api.github.com/users/blink1073","html_url":"https://github.com/blink1073","followers_url":"https://api.github.com/users/blink1073/followers","following_url":"https://api.github.com/users/blink1073/following{/other_user}","gists_url":"https://api.github.com/users/blink1073/gists{/gist_id}","starred_url":"https://api.github.com/users/blink1073/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/blink1073/subscriptions","organizations_url":"https://api.github.com/users/blink1073/orgs","repos_url":"https://api.github.com/users/blink1073/repos","events_url":"https://api.github.com/users/blink1073/events{/privacy}","received_events_url":"https://api.github.com/users/blink1073/received_events","type":"User","site_admin":false},"repo":{"id":31164085,"name":"spyder","full_name":"blink1073/spyder","owner":{"login":"blink1073","id":2096628,"avatar_url":"https://avatars.githubusercontent.com/u/2096628?v=3","gravatar_id":"","url":"https://api.github.com/users/blink1073","html_url":"https://github.com/blink1073","followers_url":"https://api.github.com/users/blink1073/followers","following_url":"https://api.github.com/users/blink1073/following{/other_user}","gists_url":"https://api.github.com/users/blink1073/gists{/gist_id}","starred_url":"https://api.github.com/users/blink1073/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/blink1073/subscriptions","organizations_url":"https://api.github.com/users/blink1073/orgs","repos_url":"https://api.github.com/users/blink1073/repos","events_url":"https://api.github.com/users/blink1073/events{/privacy}","received_events_url":"https://api.github.com/users/blink1073/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/blink1073/spyder","description":"Official repository for Spyder - The Scientific PYthon Development EnviRonment","fork":true,"url":"https://api.github.com/repos/blink1073/spyder","forks_url":"https://api.github.com/repos/blink1073/spyder/forks","keys_url":"https://api.github.com/repos/blink1073/spyder/keys{/key_id}","collaborators_url":"https://api.github.com/repos/blink1073/spyder/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/blink1073/spyder/teams","hooks_url":"https://api.github.com/repos/blink1073/spyder/hooks","issue_events_url":"https://api.github.com/repos/blink1073/spyder/issues/events{/number}","events_url":"https://api.github.com/repos/blink1073/spyder/events","assignees_url":"https://api.github.com/repos/blink1073/spyder/assignees{/user}","branches_url":"https://api.github.com/repos/blink1073/spyder/branches{/branch}","tags_url":"https://api.github.com/repos/blink1073/spyder/tags","blobs_url":"https://api.github.com/repos/blink1073/spyder/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/blink1073/spyder/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/blink1073/spyder/git/refs{/sha}","trees_url":"https://api.github.com/repos/blink1073/spyder/git/trees{/sha}","statuses_url":"https://api.github.com/repos/blink1073/spyder/statuses/{sha}","languages_url":"https://api.github.com/repos/blink1073/spyder/languages","stargazers_url":"https://api.github.com/repos/blink1073/spyder/stargazers","contributors_url":"https://api.github.com/repos/blink1073/spyder/contributors","subscribers_url":"https://api.github.com/repos/blink1073/spyder/subscribers","subscription_url":"https://api.github.com/repos/blink1073/spyder/subscription","commits_url":"https://api.github.com/repos/blink1073/spyder/commits{/sha}","git_commits_url":"https://api.github.com/repos/blink1073/spyder/git/commits{/sha}","comments_url":"https://api.github.com/repos/blink1073/spyder/comments{/number}","issue_comment_url":"https://api.github.com/repos/blink1073/spyder/issues/comments{/number}","contents_url":"https://api.github.com/repos/blink1073/spyder/contents/{+path}","compare_url":"https://api.github.com/repos/blink1073/spyder/compare/{base}...{head}","merges_url":"https://api.github.com/repos/blink1073/spyder/merges","archive_url":"https://api.github.com/repos/blink1073/spyder/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/blink1073/spyder/downloads","issues_url":"https://api.github.com/repos/blink1073/spyder/issues{/number}","pulls_url":"https://api.github.com/repos/blink1073/spyder/pulls{/number}","milestones_url":"https://api.github.com/repos/blink1073/spyder/milestones{/number}","notifications_url":"https://api.github.com/repos/blink1073/spyder/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/blink1073/spyder/labels{/name}","releases_url":"https://api.github.com/repos/blink1073/spyder/releases{/id}","created_at":"2015-02-22T13:39:06Z","updated_at":"2015-04-24T03:05:42Z","pushed_at":"2015-07-08T13:31:43Z","git_url":"git://github.com/blink1073/spyder.git","ssh_url":"git@github.com:blink1073/spyder.git","clone_url":"https://github.com/blink1073/spyder.git","svn_url":"https://github.com/blink1073/spyder","homepage":"","size":22393,"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":"spyder-ide:master","ref":"master","sha":"30e1b5bdc0adae233fa1aa3b543f6f66783a9d87","user":{"login":"spyder-ide","id":1284937,"avatar_url":"https://avatars.githubusercontent.com/u/1284937?v=3","gravatar_id":"","url":"https://api.github.com/users/spyder-ide","html_url":"https://github.com/spyder-ide","followers_url":"https://api.github.com/users/spyder-ide/followers","following_url":"https://api.github.com/users/spyder-ide/following{/other_user}","gists_url":"https://api.github.com/users/spyder-ide/gists{/gist_id}","starred_url":"https://api.github.com/users/spyder-ide/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spyder-ide/subscriptions","organizations_url":"https://api.github.com/users/spyder-ide/orgs","repos_url":"https://api.github.com/users/spyder-ide/repos","events_url":"https://api.github.com/users/spyder-ide/events{/privacy}","received_events_url":"https://api.github.com/users/spyder-ide/received_events","type":"Organization","site_admin":false},"repo":{"id":30892477,"name":"spyder","full_name":"spyder-ide/spyder","owner":{"login":"spyder-ide","id":1284937,"avatar_url":"https://avatars.githubusercontent.com/u/1284937?v=3","gravatar_id":"","url":"https://api.github.com/users/spyder-ide","html_url":"https://github.com/spyder-ide","followers_url":"https://api.github.com/users/spyder-ide/followers","following_url":"https://api.github.com/users/spyder-ide/following{/other_user}","gists_url":"https://api.github.com/users/spyder-ide/gists{/gist_id}","starred_url":"https://api.github.com/users/spyder-ide/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spyder-ide/subscriptions","organizations_url":"https://api.github.com/users/spyder-ide/orgs","repos_url":"https://api.github.com/users/spyder-ide/repos","events_url":"https://api.github.com/users/spyder-ide/events{/privacy}","received_events_url":"https://api.github.com/users/spyder-ide/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/spyder-ide/spyder","description":"Official repository for Spyder - The Scientific PYthon Development EnviRonment","fork":false,"url":"https://api.github.com/repos/spyder-ide/spyder","forks_url":"https://api.github.com/repos/spyder-ide/spyder/forks","keys_url":"https://api.github.com/repos/spyder-ide/spyder/keys{/key_id}","collaborators_url":"https://api.github.com/repos/spyder-ide/spyder/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/spyder-ide/spyder/teams","hooks_url":"https://api.github.com/repos/spyder-ide/spyder/hooks","issue_events_url":"https://api.github.com/repos/spyder-ide/spyder/issues/events{/number}","events_url":"https://api.github.com/repos/spyder-ide/spyder/events","assignees_url":"https://api.github.com/repos/spyder-ide/spyder/assignees{/user}","branches_url":"https://api.github.com/repos/spyder-ide/spyder/branches{/branch}","tags_url":"https://api.github.com/repos/spyder-ide/spyder/tags","blobs_url":"https://api.github.com/repos/spyder-ide/spyder/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/spyder-ide/spyder/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/spyder-ide/spyder/git/refs{/sha}","trees_url":"https://api.github.com/repos/spyder-ide/spyder/git/trees{/sha}","statuses_url":"https://api.github.com/repos/spyder-ide/spyder/statuses/{sha}","languages_url":"https://api.github.com/repos/spyder-ide/spyder/languages","stargazers_url":"https://api.github.com/repos/spyder-ide/spyder/stargazers","contributors_url":"https://api.github.com/repos/spyder-ide/spyder/contributors","subscribers_url":"https://api.github.com/repos/spyder-ide/spyder/subscribers","subscription_url":"https://api.github.com/repos/spyder-ide/spyder/subscription","commits_url":"https://api.github.com/repos/spyder-ide/spyder/commits{/sha}","git_commits_url":"https://api.github.com/repos/spyder-ide/spyder/git/commits{/sha}","comments_url":"https://api.github.com/repos/spyder-ide/spyder/comments{/number}","issue_comment_url":"https://api.github.com/repos/spyder-ide/spyder/issues/comments{/number}","contents_url":"https://api.github.com/repos/spyder-ide/spyder/contents/{+path}","compare_url":"https://api.github.com/repos/spyder-ide/spyder/compare/{base}...{head}","merges_url":"https://api.github.com/repos/spyder-ide/spyder/merges","archive_url":"https://api.github.com/repos/spyder-ide/spyder/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/spyder-ide/spyder/downloads","issues_url":"https://api.github.com/repos/spyder-ide/spyder/issues{/number}","pulls_url":"https://api.github.com/repos/spyder-ide/spyder/pulls{/number}","milestones_url":"https://api.github.com/repos/spyder-ide/spyder/milestones{/number}","notifications_url":"https://api.github.com/repos/spyder-ide/spyder/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/spyder-ide/spyder/labels{/name}","releases_url":"https://api.github.com/repos/spyder-ide/spyder/releases{/id}","created_at":"2015-02-16T22:49:48Z","updated_at":"2015-07-08T07:16:08Z","pushed_at":"2015-07-08T13:31:44Z","git_url":"git://github.com/spyder-ide/spyder.git","ssh_url":"git@github.com:spyder-ide/spyder.git","clone_url":"https://github.com/spyder-ide/spyder.git","svn_url":"https://github.com/spyder-ide/spyder","homepage":"","size":39996,"stargazers_count":380,"watchers_count":380,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":107,"mirror_url":null,"open_issues_count":526,"forks":107,"open_issues":526,"watchers":380,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/spyder-ide/spyder/pulls/2367"},"html":{"href":"https://github.com/spyder-ide/spyder/pull/2367"},"issue":{"href":"https://api.github.com/repos/spyder-ide/spyder/issues/2367"},"comments":{"href":"https://api.github.com/repos/spyder-ide/spyder/issues/2367/comments"},"review_comments":{"href":"https://api.github.com/repos/spyder-ide/spyder/pulls/2367/comments"},"review_comment":{"href":"https://api.github.com/repos/spyder-ide/spyder/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/spyder-ide/spyder/pulls/2367/commits"},"statuses":{"href":"https://api.github.com/repos/spyder-ide/spyder/statuses/982277b0c7067078a7826a4a0cca57ec077f5c61"}}}}