{"action":"created","comment":{"url":"https://api.github.com/repos/spyder-ide/spyder/pulls/comments/28546294","id":28546294,"diff_hunk":"@@ -0,0 +1,148 @@\n+# -*- coding: utf-8 -*-\n+#\n+# Copyright © 2009-2013 Pierre Raybaut\n+# Copyright © 2013-2015 The Spyder Development Team\n+# Licensed under the terms of the MIT License\n+# (see spyderlib/__init__.py for details)\n+\n+import json\n+\n+from spyderlib import __version__\n+from spyderlib.baseconfig import _\n+from spyderlib.py3compat import PY3\n+from spyderlib.qt.QtGui import (QMessageBox, QCheckBox)\n+from spyderlib.qt.QtCore import Signal, Qt, QObject\n+\n+\n+class MessageCheckBox(QMessageBox):\n+    \"\"\"\n+    A QMessageBox derived widget that includes a QCheckBox under the message\n+    and on top of the buttons.\n+    \"\"\"\n+    def __init__(self, *args, **kwargs):\n+        super(MessageCheckBox, self).__init__(*args, **kwargs)\n+\n+        self._checkbox = QCheckBox()\n+\n+        # Access the Layout of the MessageBox to add the Checkbox\n+        layout = self.layout()\n+        layout.addWidget(self._checkbox, 1, 1, Qt.AlignRight)\n+\n+    # Methods to access the checkbox\n+    def is_checked(self):\n+        return self._checkbox.isChecked()\n+\n+    def set_checked(self, value):\n+        return self._checkbox.setChecked(value)\n+\n+    def set_check_visible(self, value):\n+        self._checkbox.setVisible(value)\n+\n+    def is_check_visible(self):\n+        self._checkbox.isVisible()\n+\n+    def checkbox_text(self):\n+        self._checkbox.text()\n+\n+    def set_checkbox_text(self, text):\n+        self._checkbox.setText(text)\n+\n+\n+class WorkerUpdates(QObject):\n+    \"\"\"\n+    Worker that checks for releases using the Github API without blocking the\n+    Spyder user interface, in case of connections issues.\n+    \"\"\"\n+    sig_ready = Signal()\n+\n+    def __init__(self, parent, feedback):\n+        QObject.__init__(self)\n+        self._parent = parent\n+        self.feedback = feedback\n+        self.error = feedback\n+        self.latest_release = None\n+\n+    def is_stable_version(self, version):\n+        \"\"\"\n+        A stable version has no letters in the final part, it has only numbers.\n+\n+        Stable version example: 1.2, 1.3.4, 1.0.5\n+        Not stable version: 1.2alpha, 1.3.4beta, 0.1.0rc1, 3.0.0dev\n+        \"\"\"\n+        if not isinstance(version, tuple):\n+            version = version.split('.')\n+        last_part = version[-1]\n+\n+        try:\n+            int(last_part)\n+            return True\n+        except ValueError:\n+            return False\n+\n+    def check_update_available(self, version, releases):\n+        \"\"\" \"\"\"\n+        from spyderlib.utils.programs import check_version\n+\n+        if self.is_stable_version(version):\n+            # Remove non stable versions from the list\n+            releases = [r for r in releases if self.is_stable_version(r)]\n+\n+        latest = releases[0]\n+        latest_release = releases[0]\n+\n+        if version.endswith('dev'):\n+            return (False, latest_release)\n+\n+        if self.is_stable_version(latest) and \\\n+                version.startswith(latest) and latest != version:\n+            # Modify the last part so that i.e. 3.0.0 is bigger than 3.0.0rc2\n+            parts = latest.split('.')\n+            parts = parts[:-1] + [parts[-1] + 'z']\n+            latest = '.'.join(parts)\n+\n+        return (check_version(version, latest, '<'), latest_release)\n+\n+    def start(self):\n+        \"\"\" \"\"\"\n+        if PY3:\n+            from urllib.request import urlopen\n+            from urllib.error import URLError, HTTPError\n+        else:\n+            from urllib2 import urlopen, URLError, HTTPError","path":"spyderlib/workers/updates.py","position":111,"original_position":111,"commit_id":"ea1a37de52b94bce3f6b4a27c0e05caa32438097","original_commit_id":"ea1a37de52b94bce3f6b4a27c0e05caa32438097","user":{"login":"ccordoba12","id":365293,"avatar_url":"https://avatars.githubusercontent.com/u/365293?v=3","gravatar_id":"","url":"https://api.github.com/users/ccordoba12","html_url":"https://github.com/ccordoba12","followers_url":"https://api.github.com/users/ccordoba12/followers","following_url":"https://api.github.com/users/ccordoba12/following{/other_user}","gists_url":"https://api.github.com/users/ccordoba12/gists{/gist_id}","starred_url":"https://api.github.com/users/ccordoba12/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ccordoba12/subscriptions","organizations_url":"https://api.github.com/users/ccordoba12/orgs","repos_url":"https://api.github.com/users/ccordoba12/repos","events_url":"https://api.github.com/users/ccordoba12/events{/privacy}","received_events_url":"https://api.github.com/users/ccordoba12/received_events","type":"User","site_admin":false},"body":"I'd like to use something better than `LooseVersion`, which is what `check_version` is based on.","created_at":"2015-04-16T20:25:33Z","updated_at":"2015-04-16T20:25:33Z","html_url":"https://github.com/spyder-ide/spyder/pull/2321#discussion_r28546294","pull_request_url":"https://api.github.com/repos/spyder-ide/spyder/pulls/2321","_links":{"self":{"href":"https://api.github.com/repos/spyder-ide/spyder/pulls/comments/28546294"},"html":{"href":"https://github.com/spyder-ide/spyder/pull/2321#discussion_r28546294"},"pull_request":{"href":"https://api.github.com/repos/spyder-ide/spyder/pulls/2321"}}},"pull_request":{"url":"https://api.github.com/repos/spyder-ide/spyder/pulls/2321","id":33108376,"html_url":"https://github.com/spyder-ide/spyder/pull/2321","diff_url":"https://github.com/spyder-ide/spyder/pull/2321.diff","patch_url":"https://github.com/spyder-ide/spyder/pull/2321.patch","issue_url":"https://api.github.com/repos/spyder-ide/spyder/issues/2321","number":2321,"state":"open","locked":false,"title":"Implements #2307: Add a check for updates method","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":"Fixes #2307 \r\n\r\n(Note from @ccordoba12: Please leave *Fixes* instead of *Implements* because that way when I merge the PR, GH will automatically close the corresponding issue. If you don't like *Fixes*, [here](https://help.github.com/articles/closing-issues-via-commit-messages/#keywords-for-closing-issues) are the other words you can use to make this happen)\r\n\r\n## Description\r\nAdd a method to check for updates querying the Github API, using a QThread and Worker to avoid blocking the GUI.\r\n\r\nThe method is called on startup if running from installed version and will only display a message if there is an update. If running in `DEV` mode versions it will not be triggered on startup. \r\n\r\nThere is also an entry in the Help menu to check for updates at any moment, unlike the one on startup, this action will give feedback also if no updates are available, or if there is some internet error.\r\n\r\n## Messages\r\n\r\n**Ubuntu**\r\n![image](https://cloud.githubusercontent.com/assets/3627835/7104758/3a8f5f68-e0f7-11e4-863b-83928779fa39.png)\r\n\r\n**Ubuntu**\r\n![image](https://cloud.githubusercontent.com/assets/3627835/7104796/babf9698-e0f8-11e4-9df9-0edb1746dbce.png)\r\n\r\n**Windows**\r\n![image](https://cloud.githubusercontent.com/assets/3627835/7116177/deb64036-e1ef-11e4-86ba-6697b9a926e9.png)\r\n\r\n\r\n## New option in the general preferences\r\nThis option is on by default and then the user can decide by checking or unchecking the checkbox.\r\n\r\n**Windows**\r\n![image](https://cloud.githubusercontent.com/assets/3627835/7116033/6c13ccfc-e1ee-11e4-870e-4a8e0aafb045.png)\r\n\r\n\r\n\r\n## Checklist\r\n- [x] Agree on location in menu\r\n- [x] Agree on message\r\n- [x] Add preferences option to disable this check on startup (**on** by default)\r\n- [x] Adjust check to handle stable and dev/beta cases. \r\n    - If using a beta release display message if higher beta release or higher stable\r\n    - If using a stable version check only against stable versions\r\n\r\nPush pending...","created_at":"2015-04-11T19:15:10Z","updated_at":"2015-04-16T20:25:33Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f79ab94d5c2a686adc095dcdbd86e957cb369807","assignee":{"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},"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":"","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":253,"closed_issues":46,"state":"open","created_at":"2015-02-16T23:17:23Z","updated_at":"2015-04-15T21:39:04Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/spyder-ide/spyder/pulls/2321/commits","review_comments_url":"https://api.github.com/repos/spyder-ide/spyder/pulls/2321/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/2321/comments","statuses_url":"https://api.github.com/repos/spyder-ide/spyder/statuses/ea1a37de52b94bce3f6b4a27c0e05caa32438097","head":{"label":"goanpeca:updates","ref":"updates","sha":"ea1a37de52b94bce3f6b4a27c0e05caa32438097","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},"repo":{"id":31085493,"name":"spyder","full_name":"goanpeca/spyder","owner":{"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},"private":false,"html_url":"https://github.com/goanpeca/spyder","description":"Official repository for Spyder - The Scientific PYthon Development EnviRonment","fork":true,"url":"https://api.github.com/repos/goanpeca/spyder","forks_url":"https://api.github.com/repos/goanpeca/spyder/forks","keys_url":"https://api.github.com/repos/goanpeca/spyder/keys{/key_id}","collaborators_url":"https://api.github.com/repos/goanpeca/spyder/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/goanpeca/spyder/teams","hooks_url":"https://api.github.com/repos/goanpeca/spyder/hooks","issue_events_url":"https://api.github.com/repos/goanpeca/spyder/issues/events{/number}","events_url":"https://api.github.com/repos/goanpeca/spyder/events","assignees_url":"https://api.github.com/repos/goanpeca/spyder/assignees{/user}","branches_url":"https://api.github.com/repos/goanpeca/spyder/branches{/branch}","tags_url":"https://api.github.com/repos/goanpeca/spyder/tags","blobs_url":"https://api.github.com/repos/goanpeca/spyder/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/goanpeca/spyder/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/goanpeca/spyder/git/refs{/sha}","trees_url":"https://api.github.com/repos/goanpeca/spyder/git/trees{/sha}","statuses_url":"https://api.github.com/repos/goanpeca/spyder/statuses/{sha}","languages_url":"https://api.github.com/repos/goanpeca/spyder/languages","stargazers_url":"https://api.github.com/repos/goanpeca/spyder/stargazers","contributors_url":"https://api.github.com/repos/goanpeca/spyder/contributors","subscribers_url":"https://api.github.com/repos/goanpeca/spyder/subscribers","subscription_url":"https://api.github.com/repos/goanpeca/spyder/subscription","commits_url":"https://api.github.com/repos/goanpeca/spyder/commits{/sha}","git_commits_url":"https://api.github.com/repos/goanpeca/spyder/git/commits{/sha}","comments_url":"https://api.github.com/repos/goanpeca/spyder/comments{/number}","issue_comment_url":"https://api.github.com/repos/goanpeca/spyder/issues/comments{/number}","contents_url":"https://api.github.com/repos/goanpeca/spyder/contents/{+path}","compare_url":"https://api.github.com/repos/goanpeca/spyder/compare/{base}...{head}","merges_url":"https://api.github.com/repos/goanpeca/spyder/merges","archive_url":"https://api.github.com/repos/goanpeca/spyder/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/goanpeca/spyder/downloads","issues_url":"https://api.github.com/repos/goanpeca/spyder/issues{/number}","pulls_url":"https://api.github.com/repos/goanpeca/spyder/pulls{/number}","milestones_url":"https://api.github.com/repos/goanpeca/spyder/milestones{/number}","notifications_url":"https://api.github.com/repos/goanpeca/spyder/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/goanpeca/spyder/labels{/name}","releases_url":"https://api.github.com/repos/goanpeca/spyder/releases{/id}","created_at":"2015-02-20T21:13:25Z","updated_at":"2015-04-11T20:59:37Z","pushed_at":"2015-04-15T07:26:10Z","git_url":"git://github.com/goanpeca/spyder.git","ssh_url":"git@github.com:goanpeca/spyder.git","clone_url":"https://github.com/goanpeca/spyder.git","svn_url":"https://github.com/goanpeca/spyder","homepage":"","size":21402,"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":"80b1c8b2c9f2e8f1cff182d7cd594dbbbf181565","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-04-16T16:02:54Z","pushed_at":"2015-04-16T08:28:36Z","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":27595,"stargazers_count":205,"watchers_count":205,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":60,"mirror_url":null,"open_issues_count":480,"forks":60,"open_issues":480,"watchers":205,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/spyder-ide/spyder/pulls/2321"},"html":{"href":"https://github.com/spyder-ide/spyder/pull/2321"},"issue":{"href":"https://api.github.com/repos/spyder-ide/spyder/issues/2321"},"comments":{"href":"https://api.github.com/repos/spyder-ide/spyder/issues/2321/comments"},"review_comments":{"href":"https://api.github.com/repos/spyder-ide/spyder/pulls/2321/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/2321/commits"},"statuses":{"href":"https://api.github.com/repos/spyder-ide/spyder/statuses/ea1a37de52b94bce3f6b4a27c0e05caa32438097"}}}}