{"action":"created","comment":{"url":"https://api.github.com/repos/spyder-ide/spyder/pulls/comments/48316050","id":48316050,"diff_hunk":"@@ -903,77 +916,432 @@ def _save_lang(self):\n \r\n class ColorSchemeConfigPage(GeneralConfigPage):\r\n     CONF_SECTION = \"color_schemes\"\r\n-    \r\n+\r\n     NAME = _(\"Syntax coloring\")\r\n     ICON = ima.icon('eyedropper')\r\n-    \r\n+\r\n     def setup_page(self):\r\n-        tabs = QTabWidget()\r\n-        names = self.get_option(\"names\")\r\n-        names.pop(names.index(CUSTOM_COLOR_SCHEME_NAME))\r\n-        names.insert(0, CUSTOM_COLOR_SCHEME_NAME)\r\n-        fieldnames = {\r\n-                      \"background\":     _(\"Background:\"),\r\n-                      \"currentline\":    _(\"Current line:\"),\r\n-                      \"currentcell\":    _(\"Current cell:\"),\r\n-                      \"occurence\":      _(\"Occurence:\"),\r\n-                      \"ctrlclick\":      _(\"Link:\"),\r\n-                      \"sideareas\":      _(\"Side areas:\"),\r\n-                      \"matched_p\":      _(\"Matched parentheses:\"),\r\n-                      \"unmatched_p\":    _(\"Unmatched parentheses:\"),\r\n-                      \"normal\":         _(\"Normal text:\"),\r\n-                      \"keyword\":        _(\"Keyword:\"),\r\n-                      \"builtin\":        _(\"Builtin:\"),\r\n-                      \"definition\":     _(\"Definition:\"),\r\n-                      \"comment\":        _(\"Comment:\"),\r\n-                      \"string\":         _(\"String:\"),\r\n-                      \"number\":         _(\"Number:\"),\r\n-                      \"instance\":       _(\"Instance:\"),\r\n-                      }\r\n-        from spyderlib.utils import syntaxhighlighters\r\n-        assert all([key in fieldnames\r\n-                    for key in syntaxhighlighters.COLOR_SCHEME_KEYS])\r\n-        for tabname in names:\r\n-            cs_group = QGroupBox(_(\"Color scheme\"))\r\n-            cs_layout = QGridLayout()\r\n-            for row, key in enumerate(syntaxhighlighters.COLOR_SCHEME_KEYS):\r\n-                option = \"%s/%s\" % (tabname, key)\r\n-                value = self.get_option(option)\r\n-                name = fieldnames[key]\r\n-                if is_text_string(value):\r\n-                    label, clayout = self.create_coloredit(name, option,\r\n-                                                           without_layout=True)\r\n-                    label.setAlignment(Qt.AlignRight|Qt.AlignVCenter)\r\n-                    cs_layout.addWidget(label, row+1, 0)\r\n-                    cs_layout.addLayout(clayout, row+1, 1)\r\n-                else:\r\n-                    label, clayout, cb_bold, cb_italic = self.create_scedit(\r\n-                                            name, option, without_layout=True)\r\n-                    label.setAlignment(Qt.AlignRight|Qt.AlignVCenter)\r\n-                    cs_layout.addWidget(label, row+1, 0)\r\n-                    cs_layout.addLayout(clayout, row+1, 1)\r\n-                    cs_layout.addWidget(cb_bold, row+1, 2)\r\n-                    cs_layout.addWidget(cb_italic, row+1, 3)\r\n-            cs_group.setLayout(cs_layout)\r\n-            if tabname in sh.COLOR_SCHEME_NAMES:\r\n-                def_btn = self.create_button(_(\"Reset to default values\"),\r\n-                                         lambda: self.reset_to_default(tabname))\r\n-                tabs.addTab(self.create_tab(cs_group, def_btn), tabname)\r\n-            else:\r\n-                tabs.addTab(self.create_tab(cs_group), tabname)\r\n-        \r\n+        names = [n for n in self.get_option(\"names\")]\r\n+        custom_names = self.get_option(\"custom_names\", [])\r\n+\r\n+        # Widgets\r\n+        about_label = QLabel(_(\"Here you can edit the color schemes provided \"\r\n+                               \"by Spyder or create your own ones by using \"\r\n+                               \"the options provided below.<br>\"))\r\n+        edit_button = QPushButton(_(\"Edit selected\"))\r\n+        create_button = QPushButton(_(\"Create new scheme\"))\r\n+        self.delete_button = QPushButton(_(\"Delete\"))\r\n+        self.preview_editor = CodeEditor(self)\r\n+        self.stacked_widget = QStackedWidget(self)\r\n+        self.reset_button = QPushButton(_(\"Reset\"))\r\n+        self.scheme_editor_dialog = SchemeEditor(parent=self,\r\n+                                                 stack=self.stacked_widget)\r\n+\r\n+        # Widget setup\r\n+        self.scheme_choices_dic = {}\r\n+        about_label.setWordWrap(True)\r\n+        schemes_combo = self.create_combobox(_('Scheme:'),\r\n+                                             [('', '')],\r\n+                                             'selected')\r\n+        self.schemes_combo = schemes_combo.combobox\r\n+\r\n+        # Layouts\r\n         vlayout = QVBoxLayout()\r\n-        vlayout.addWidget(tabs)\r\n+\r\n+        manage_layout = QVBoxLayout()\r\n+        manage_layout.addWidget(about_label)\r\n+\r\n+        combo_layout = QHBoxLayout()\r\n+        combo_layout.addWidget(schemes_combo.label)\r\n+        combo_layout.addWidget(schemes_combo.combobox)\r\n+\r\n+        buttons_layout = QVBoxLayout()\r\n+        buttons_layout.addLayout(combo_layout)\r\n+        buttons_layout.addWidget(edit_button)\r\n+        buttons_layout.addWidget(self.reset_button)\r\n+        buttons_layout.addWidget(self.delete_button)\r\n+        buttons_layout.addStretch(1)\r\n+        buttons_layout.addWidget(create_button)\r\n+\r\n+        preview_layout = QVBoxLayout()\r\n+        preview_layout.addWidget(self.preview_editor)\r\n+\r\n+        buttons_preview_layout = QHBoxLayout()\r\n+        buttons_preview_layout.addLayout(buttons_layout)\r\n+        buttons_preview_layout.addLayout(preview_layout)\r\n+\r\n+        manage_layout.addLayout(buttons_preview_layout)\r\n+        manage_group = QGroupBox(_(\"Manage color schemes\"))\r\n+        manage_group.setLayout(manage_layout)\r\n+\r\n+        vlayout.addWidget(manage_group)\r\n         self.setLayout(vlayout)\r\n-        \r\n-    @Slot(str)\r\n-    def reset_to_default(self, name):\r\n-        set_default_color_scheme(name, replace=True)\r\n-        self.load_from_conf()\r\n-            \r\n+\r\n+        # Signals and slots\r\n+        create_button.clicked.connect(self.create_new_scheme)\r\n+        edit_button.clicked.connect(self.edit_scheme)\r\n+        self.reset_button.clicked.connect(self.reset_to_default)\r\n+        self.delete_button.clicked.connect(self.delete_scheme)\r\n+        self.schemes_combo.currentIndexChanged.connect(self.update_preview)\r\n+        self.schemes_combo.currentIndexChanged.connect(self.update_buttons)\r\n+\r\n+        # Setup\r\n+        for name in names:\r\n+            self.scheme_editor_dialog.add_color_scheme_stack(name)\r\n+\r\n+        for name in custom_names:\r\n+            self.scheme_editor_dialog.add_color_scheme_stack(name, custom=True)\r\n+\r\n+        self.update_combobox()\r\n+        self.update_preview()\r\n+\r\n     def apply_settings(self, options):\r\n         self.main.editor.apply_plugin_settings(['color_scheme_name'])\r\n         if self.main.historylog is not None:\r\n             self.main.historylog.apply_plugin_settings(['color_scheme_name'])\r\n         if self.main.help is not None:\r\n             self.main.help.apply_plugin_settings(['color_scheme_name'])\r\n+        self.update_combobox()\r\n+        self.update_preview()\r\n+\r\n+    # Helpers\r\n+    # -------------------------------------------------------------------------\r\n+    @property\r\n+    def current_scheme_name(self):\r\n+        return self.schemes_combo.currentText()\r\n+\r\n+    @property\r\n+    def current_scheme(self):\r\n+        return self.scheme_choices_dic[self.current_scheme_name]\r\n+\r\n+    @property\r\n+    def current_scheme_index(self):\r\n+        return self.schemes_combo.currentIndex()\r\n+\r\n+    def update_combobox(self):\r\n+        \"\"\"Recreates the combobox contents.\"\"\"\r\n+        index = self.current_scheme_index\r\n+        self.schemes_combo.blockSignals(True)\r\n+        names = self.get_option(\"names\")\r\n+        custom_names = self.get_option(\"custom_names\", [])\r\n+\r\n+        # Useful for retrieving the actual data\r\n+        for n in names + custom_names:\r\n+            self.scheme_choices_dic[self.get_option('{0}/name'.format(n))] = n\r\n+\r\n+        if custom_names:\r\n+            choices = names + [None] + custom_names\r\n+        else:\r\n+            choices = names\r\n+\r\n+        combo = self.schemes_combo\r\n+        combo.clear()\r\n+\r\n+        for name in choices:\r\n+            if name is None:\r\n+                continue\r\n+            combo.addItem(self.get_option('{0}/name'.format(name)), name)\r\n+\r\n+        if custom_names:\r\n+            combo.insertSeparator(len(names))\r\n+\r\n+        self.schemes_combo.blockSignals(False)\r\n+        self.schemes_combo.setCurrentIndex(index)\r\n+\r\n+    def update_buttons(self):\r\n+        \"\"\"Updates the enable status of delete and reset buttons.\"\"\"\r\n+        current_scheme = self.current_scheme\r\n+        names = self.get_option(\"names\")\r\n+        delete_enabled = current_scheme not in names\r\n+        self.delete_button.setEnabled(delete_enabled)\r\n+        self.reset_button.setEnabled(not delete_enabled)\r\n+\r\n+    def update_preview(self, index=None, scheme_name=None):\r\n+        \"\"\"\r\n+        Update the color scheme of the preview editor and adds text.\r\n+\r\n+        Note\r\n+        ----\r\n+        'index' is needed, because this is triggered by a signal that sends\r\n+        the selected index.\r\n+        \"\"\"\r\n+        text = ('\"\"\"A string\"\"\"\\n\\n'\r\n+                '# A comment\\n\\n'\r\n+                '# %% A cell\\n\\n'\r\n+                'class Foo(object):\\n'\r\n+                '    def __init__(self):\\n'\r\n+                '        bar = 42\\n'\r\n+                '        print(bar)\\n'\r\n+                )\r\n+        show_blanks = CONF.get('editor', 'blank_spaces')\r\n+        if not scheme_name:\r\n+            scheme_name = self.current_scheme\r\n+        self.preview_editor.setup_editor(linenumbers=True,\r\n+                                         markers=True,\r\n+                                         tab_mode=False,\r\n+                                         font=get_font('editor'),\r\n+                                         show_blanks=show_blanks,\r\n+                                         color_scheme=scheme_name)\r\n+        self.preview_editor.set_text(text)\r\n+        self.preview_editor.set_language('Python')\r\n+\r\n+    # Actions\r\n+    # -------------------------------------------------------------------------\r\n+    def create_new_scheme(self):\r\n+        \"\"\"Creates a new color scheme with a custom name.\"\"\"\r\n+        names = self.get_option('names')\r\n+        custom_names = self.get_option('custom_names', [])\r\n+\r\n+        # Get the available number this new color scheme\r\n+        counter = len(custom_names) - 1\r\n+        custom_index = [int(n.split('-')[-1]) for n in custom_names]\r\n+        for i in range(len(custom_names)):\r\n+            if custom_index[i] != i:\r\n+                counter = i - 1\r\n+                break\r\n+        custom_name = \"custom-{0}\".format(counter+1)\r\n+\r\n+        # Add the config settings, based on the current one.\r\n+        custom_names.append(custom_name)\r\n+        self.set_option('custom_names', custom_names)\r\n+        for key in syntaxhighlighters.COLOR_SCHEME_KEYS:\r\n+            name = \"{0}/{1}\".format(custom_name, key)\r\n+            default_name = \"{0}/{1}\".format(self.current_scheme, key)\r\n+            option = self.get_option(default_name)\r\n+            self.set_option(name, option)\r\n+        self.set_option('{0}/name'.format(custom_name), custom_name)\r\n+\r\n+        # Now they need to be loaded! how to make a partial load_from_conf?\r\n+        dlg = self.scheme_editor_dialog\r\n+        dlg.add_color_scheme_stack(custom_name, custom=True)\r\n+        dlg.set_scheme(custom_name)\r\n+        self.load_from_conf()\r\n+\r\n+        if dlg.exec_():\r\n+            self.update_combobox()\r\n+            # The +1 is needed because of the separator in the combobox\r\n+            index = (names + custom_names).index(custom_name) + 1\r\n+            self.schemes_combo.setCurrentIndex(index)\r\n+        else:\r\n+            # Delete the config ....\r\n+            custom_names.remove(custom_name)\r\n+            self.set_option('custom_names', custom_names)\r\n+            dlg.delete_color_scheme_stack(custom_name)\r\n+\r\n+    def edit_scheme(self):\r\n+        \"\"\"Edit current scheme.\"\"\"\r\n+        dlg = self.scheme_editor_dialog\r\n+        dlg.set_scheme(self.current_scheme)\r\n+\r\n+        if dlg.exec_():\r\n+            # Update temp scheme to reflect instant edits on the preview\r\n+            temporal_color_scheme = dlg.get_edited_color_scheme()\r\n+            for key in temporal_color_scheme:\r\n+                option = \"temp/{0}\".format(key)\r\n+                value = temporal_color_scheme[key]\r\n+                self.set_option(option, value)\r\n+            self.update_preview(scheme_name='temp')\r\n+\r\n+    def delete_scheme(self):\r\n+        \"\"\"Deletes the currently selected custom color scheme.\"\"\"\r\n+        scheme_name = self.current_scheme\r\n+\r\n+        # Put the combobox in Spyder by default, when deleting a scheme\r\n+        names = self.get_option('names')\r\n+        self.set_scheme('spyder')\r\n+        self.schemes_combo.setCurrentIndex(names.index('spyder'))\r\n+        self.set_option('selected', 'spyder')\r\n+\r\n+        # Delete from custom_names\r\n+        custom_names = self.get_option('custom_names')\r\n+        custom_names.remove(scheme_name)\r\n+        self.set_option('custom_names', custom_names)\r\n+\r\n+        # Delete config options\r\n+        for key in syntaxhighlighters.COLOR_SCHEME_KEYS:\r\n+            option = \"{0}/{1}\".format(scheme_name, key)\r\n+            CONF.remove_option(self.CONF_SECTION, option)\r\n+        CONF.remove_option(self.CONF_SECTION, \"{0}/name\".format(scheme_name))\r\n+\r\n+        self.update_combobox()\r\n+        self.update_preview()\r\n+\r\n+    def set_scheme(self, scheme_name):\r\n+        \"\"\"\r\n+        Set the current stack in the dialog to the scheme with 'schema_name'.\r\n+        \"\"\"\r\n+        dlg = self.scheme_editor_dialog\r\n+        dlg.set_scheme(scheme_name)\r\n+\r\n+    @Slot(str)\r\n+    def reset_to_default(self):\r\n+        \"\"\"Restore initial values for default color schemes.\"\"\"\r\n+        # Checks that this is indeed a default scheme\r\n+        scheme = self.current_scheme\r\n+        names = self.get_option('names')\r\n+        if scheme not in names:\r","path":"spyderlib/plugins/configdialog.py","position":393,"original_position":393,"commit_id":"3ed8c3efad02811bd7a4020cdf00a9dd876c12fc","original_commit_id":"3ed8c3efad02811bd7a4020cdf00a9dd876c12fc","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":"This shouldn't be `if scheme in names:` ?","created_at":"2015-12-23T01:25:11Z","updated_at":"2015-12-23T01:25:11Z","html_url":"https://github.com/spyder-ide/spyder/pull/2861#discussion_r48316050","pull_request_url":"https://api.github.com/repos/spyder-ide/spyder/pulls/2861","_links":{"self":{"href":"https://api.github.com/repos/spyder-ide/spyder/pulls/comments/48316050"},"html":{"href":"https://github.com/spyder-ide/spyder/pull/2861#discussion_r48316050"},"pull_request":{"href":"https://api.github.com/repos/spyder-ide/spyder/pulls/2861"}}},"pull_request":{"url":"https://api.github.com/repos/spyder-ide/spyder/pulls/2861","id":52934465,"html_url":"https://github.com/spyder-ide/spyder/pull/2861","diff_url":"https://github.com/spyder-ide/spyder/pull/2861.diff","patch_url":"https://github.com/spyder-ide/spyder/pull/2861.patch","issue_url":"https://api.github.com/repos/spyder-ide/spyder/issues/2861","number":2861,"state":"open","locked":false,"title":"PR: Modify color scheme preferences","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":"Related to #820 \r\n\r\n# Description\r\nThis PR aims to simplify the user experience for editing the color schemes. \r\nIt also incorporates  the creation/deletion of an unlimited number of custom schemes.\r\n\r\nThis PR however does not (yet) add the custom schemes to the options in the other plugins (editor etc...) as the idea is to unify the different color schemes into a single global one, located in this updated preferences page.\r\n\r\nThe custom name is generated automatically (`custom-N`) and cannot be modified for now, as the modifications needed for this would add too much to the PR, which is already getting big.\r\n\r\n# Screenshots\r\n![channels and 3](https://cloud.githubusercontent.com/assets/3627835/11647328/d5110ac4-9d34-11e5-94bf-c530b855be50.png)\r\n\r\n\r\n![channels and 4](https://cloud.githubusercontent.com/assets/3627835/11647142/9637cc22-9d32-11e5-97da-342e24d9be0f.png)\r\n","created_at":"2015-12-08T03:31:48Z","updated_at":"2015-12-23T01:25:11Z","closed_at":null,"merged_at":null,"merge_commit_sha":"964dee4e0526718711df4a374f604cd7671f6945","assignee":{"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},"milestone":{"url":"https://api.github.com/repos/spyder-ide/spyder/milestones/28","html_url":"https://github.com/spyder-ide/spyder/milestones/V3.0beta3","labels_url":"https://api.github.com/repos/spyder-ide/spyder/milestones/28/labels","id":1443008,"number":28,"title":"V3.0beta3","description":"","creator":{"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},"open_issues":13,"closed_issues":4,"state":"open","created_at":"2015-12-03T21:34:20Z","updated_at":"2015-12-22T04:40:03Z","due_on":"2016-01-31T05:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/spyder-ide/spyder/pulls/2861/commits","review_comments_url":"https://api.github.com/repos/spyder-ide/spyder/pulls/2861/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/2861/comments","statuses_url":"https://api.github.com/repos/spyder-ide/spyder/statuses/3ed8c3efad02811bd7a4020cdf00a9dd876c12fc","head":{"label":"goanpeca:fix/color-schemes","ref":"fix/color-schemes","sha":"3ed8c3efad02811bd7a4020cdf00a9dd876c12fc","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-05-05T16:27:19Z","pushed_at":"2015-12-22T23:43:04Z","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":28300,"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":"0bb07e05a051f0f0e903733ccef907caabcc8815","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-12-22T03:57:12Z","pushed_at":"2015-12-22T23:43:05Z","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":62209,"stargazers_count":718,"watchers_count":718,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":198,"mirror_url":null,"open_issues_count":553,"forks":198,"open_issues":553,"watchers":718,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/spyder-ide/spyder/pulls/2861"},"html":{"href":"https://github.com/spyder-ide/spyder/pull/2861"},"issue":{"href":"https://api.github.com/repos/spyder-ide/spyder/issues/2861"},"comments":{"href":"https://api.github.com/repos/spyder-ide/spyder/issues/2861/comments"},"review_comments":{"href":"https://api.github.com/repos/spyder-ide/spyder/pulls/2861/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/2861/commits"},"statuses":{"href":"https://api.github.com/repos/spyder-ide/spyder/statuses/3ed8c3efad02811bd7a4020cdf00a9dd876c12fc"}}}}