Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Hide Help plugin if Sphinx is not installed #2929

Merged
merged 6 commits into from
Jan 15, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 13 additions & 36 deletions spyderlib/plugins/help.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,13 @@
import sys

# Local imports
from spyderlib import dependencies
from spyderlib.config.base import get_conf_path, get_module_source_path, _
from spyderlib.config.ipython import QTCONSOLE_INSTALLED
from spyderlib.config.main import CONF
from spyderlib.config.gui import get_color_scheme, get_font, set_font
from spyderlib.utils import programs
from spyderlib.utils.help.sphinxify import (CSS_PATH, sphinxify, warning,
generate_context, usage)
from spyderlib.utils.qthelpers import (create_toolbutton, add_actions,
create_action)
from spyderlib.widgets.comboboxes import EditableComboBox
Expand All @@ -44,19 +45,6 @@
else:
IPythonControlWidget = None # analysis:ignore

# Check if we can import Sphinx to activate rich text mode
try:
from spyderlib.utils.help.sphinxify import (CSS_PATH, sphinxify, warning,
generate_context, usage)
sphinx_version = programs.get_module_version('sphinx')
except (ImportError, TypeError):
sphinxify = sphinx_version = None # analysis:ignore

# To add sphinx dependency to the Dependencies dialog
SPHINX_REQVER = '>=0.6.6'
dependencies.add("sphinx", _("Rich text help"),
required_version=SPHINX_REQVER)


class ObjectComboBox(EditableComboBox):
"""
Expand Down Expand Up @@ -158,14 +146,12 @@ def setup_page(self):
features_group = QGroupBox(_("Additional features"))
math_box = self.create_checkbox(_("Render mathematical equations"),
'math')
req_sphinx = sphinx_version is not None and \
programs.is_module_installed('sphinx', '>=1.1')
req_sphinx = programs.is_module_installed('sphinx', '>=1.1')
math_box.setEnabled(req_sphinx)
if not req_sphinx:
sphinx_ver = programs.get_module_version('sphinx')
sphinx_tip = _("This feature requires Sphinx 1.1 or superior.")
if sphinx_version is not None:
sphinx_tip += "\n" + _("Sphinx %s is currently installed."
) % sphinx_version
sphinx_tip += "\n" + _("Sphinx %s is currently installed.") % sphinx_ver
math_box.setToolTip(sphinx_tip)

features_layout = QVBoxLayout()
Expand Down Expand Up @@ -434,8 +420,7 @@ def __init__(self, parent):

# Plain text docstring option
self.docstring = True
self.rich_help = sphinxify is not None \
and self.get_option('rich_mode', True)
self.rich_help = self.get_option('rich_mode', True)
self.plain_text_action = create_action(self, _("Plain Text"),
toggled=self.toggle_plain_text)

Expand Down Expand Up @@ -482,7 +467,6 @@ def __init__(self, parent):
self.switch_to_plain_text()
self.plain_text_action.setChecked(not self.rich_help)
self.rich_text_action.setChecked(self.rich_help)
self.rich_text_action.setEnabled(sphinxify is not None)
self.source_changed()

# Main layout
Expand All @@ -494,15 +478,11 @@ def __init__(self, parent):
self.setLayout(layout)

# Add worker thread for handling rich text rendering
if sphinxify is None:
self._sphinx_thread = None
else:
self._sphinx_thread = SphinxThread(
self._sphinx_thread = SphinxThread(
html_text_no_doc=warning(self.no_doc_string))
self._sphinx_thread.html_ready.connect(
self._sphinx_thread.html_ready.connect(
self._on_sphinx_thread_html_ready)
self._sphinx_thread.error_msg.connect(
self._on_sphinx_thread_error_msg)
self._sphinx_thread.error_msg.connect(self._on_sphinx_thread_error_msg)

# Render internal links
view = self.rich_text.webview
Expand Down Expand Up @@ -551,8 +531,7 @@ def refresh_plugin(self):
"""Refresh widget"""
if self._starting_up:
self._starting_up = False
if sphinxify is not None:
self.switch_to_rich_text()
self.switch_to_rich_text()
self.show_intro_message()

def apply_plugin_settings(self, options):
Expand Down Expand Up @@ -788,10 +767,7 @@ def show_tutorial(self):
img_path = osp.join(tutorial_path, 'static', 'images')
tutorial = osp.join(tutorial_path, 'tutorial.rst')
text = open(tutorial).read()
if sphinxify is not None:
self.show_rich_text(text, collapse=True, img_path=img_path)
else:
self.show_plain_text(text)
self.show_rich_text(text, collapse=True, img_path=img_path)

def handle_link_clicks(self, url):
url = to_text_string(url.toString())
Expand Down Expand Up @@ -979,13 +955,14 @@ def _on_sphinx_thread_error_msg(self, error_msg):
""" Display error message on Sphinx rich text failure"""
self._sphinx_thread.wait()
self.plain_text_action.setChecked(True)
sphinx_ver = programs.get_module_version('sphinx')
QMessageBox.critical(self,
_('Help'),
_("The following error occured when calling "
"<b>Sphinx %s</b>. <br>Incompatible Sphinx "
"version or doc string decoding failed."
"<br><br>Error message:<br>%s"
) % (sphinx_version, error_msg))
) % (sphinx_ver, error_msg))

def show_help(self, obj_text, ignore_unknown=False):
"""Show help"""
Expand Down
26 changes: 17 additions & 9 deletions spyderlib/spyder.py
Original file line number Diff line number Diff line change
Expand Up @@ -818,7 +818,11 @@ def create_edit_action(text, tr_text, icon):
self.toolbarslist.append(self.workingdirectory)

# Help plugin
if CONF.get('help', 'enable'):
dependencies.add("sphinx", _("Show help for objects in the Editor and "
"Consoles in a dedicated pane"),
required_version='>=0.6.6')
if CONF.get('help', 'enable') and \
programs.is_module_installed('sphinx'):
self.set_splash(_("Loading help..."))
from spyderlib.plugins.help import Help
self.help = Help(self)
Expand Down Expand Up @@ -959,8 +963,11 @@ def create_edit_action(text, tr_text, icon):
icon=ima.icon('DialogHelpButton'),
triggered=lambda : programs.start_file(spyder_doc))

tut_action = create_action(self, _("Spyder tutorial"),
triggered=self.help.show_tutorial)
if self.help is not None:
tut_action = create_action(self, _("Spyder tutorial"),
triggered=self.help.show_tutorial)
else:
tut_action = None

#----- Tours
self.tour = tour.AnimatedTour(self)
Expand All @@ -987,18 +994,17 @@ def trigger(i=i, self=self): # closure needed!
self.tours_menu = None

self.help_menu_actions = [doc_action, tut_action, self.tours_menu,
None,
report_action, dep_action,
self.check_updates_action, support_action,
None]
None, report_action, dep_action,
self.check_updates_action, support_action,
None]
# Python documentation
if get_python_doc_path() is not None:
pydoc_act = create_action(self, _("Python documentation"),
triggered=lambda:
programs.start_file(get_python_doc_path()))
self.help_menu_actions.append(pydoc_act)
# IPython documentation
if self.ipyconsole is not None:
if self.ipyconsole is not None and self.help is not None:
ipython_menu = QMenu(_("IPython documentation"), self)
intro_action = create_action(self, _("Intro to IPython"),
triggered=self.ipyconsole.show_intro)
Expand Down Expand Up @@ -1258,7 +1264,9 @@ def post_visible_setup(self):
self.console.dockwidget.hide()

# Show Help and Consoles by default
plugins_to_show = [self.help]
plugins_to_show = []
if self.help is not None:
plugins_to_show.append(self.help)
if self.ipyconsole is not None:
if self.ipyconsole.isvisible:
plugins_to_show += [self.extconsole, self.ipyconsole]
Expand Down