Skip to content

Commit

Permalink
Improve the error message when an import is missing
Browse files Browse the repository at this point in the history
  • Loading branch information
patricksnape committed Dec 3, 2017
1 parent a86a4a7 commit f6c9a23
Show file tree
Hide file tree
Showing 12 changed files with 67 additions and 52 deletions.
27 changes: 19 additions & 8 deletions menpo/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import os.path
from pprint import pformat
import warnings
import textwrap


class Copyable(object):
Expand Down Expand Up @@ -330,18 +331,28 @@ class MenpoDeprecationWarning(Warning):
pass


class MenpoMissingDependencyError(Exception):
class MenpoMissingDependencyError(ImportError):
r"""
An exception that a dependency required for the requested functionality
was not detected.
"""
def __init__(self, package_name):
super(MenpoMissingDependencyError, self).__init__()
self.message = "You need to install the '{pname}' package in order " \
"to use this functionality. We recommend that you " \
"use conda to achieve this - try the command " \
"'conda install -c menpo {pname}' " \
"in your terminal.".format(pname=package_name)
self.message = textwrap.dedent("""
You need to install the '{pname}' package in order to use this
functionality. We recommend that you use conda to achieve this -
try the command
conda install {pname}
in your terminal. Note that this package may be provided by another
channel such as the "menpo" channel or the "conda-forge" channel.
Failing that, try installing use pip:
pip install {pname}
""".format(pname=package_name))

self.missing_name = package_name

def __str__(self):
return self.message
Expand Down Expand Up @@ -700,9 +711,9 @@ def view_widget(self):
"""
try:
from menpowidgets import view_widget
except ImportError:
except ImportError as e:
from menpo.visualize.base import MenpowidgetsMissingError
raise MenpowidgetsMissingError()
raise MenpowidgetsMissingError(e.name)
else:
return view_widget(self)

Expand Down
4 changes: 2 additions & 2 deletions menpo/feature/optional/vlfeat.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@

try:
from cyvlfeat.sift.dsift import dsift as cyvlfeat_dsift
except ImportError:
raise MenpoMissingDependencyError('cyvlfeat')
except ImportError as e:
raise MenpoMissingDependencyError(e.name)


@winitfeature
Expand Down
4 changes: 2 additions & 2 deletions menpo/image/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -848,9 +848,9 @@ def view_widget(self, figure_size=(7, 7)):
try:
from menpowidgets import view_widget
view_widget(self, figure_size=figure_size)
except ImportError:
except ImportError as e:
from menpo.visualize.base import MenpowidgetsMissingError
raise MenpowidgetsMissingError()
raise MenpowidgetsMissingError(e.name)

def _view_landmarks_2d(self, channels=None, group=None,
with_labels=None, without_labels=None,
Expand Down
8 changes: 4 additions & 4 deletions menpo/landmark/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -315,9 +315,9 @@ def _view_widget_2d(self, figure_size=(7, 7)):
try:
from menpowidgets import view_widget
view_widget(self, figure_size=figure_size)
except ImportError:
except ImportError as e:
from menpo.visualize.base import MenpowidgetsMissingError
raise MenpowidgetsMissingError()
raise MenpowidgetsMissingError(e.name)

def _view_widget_3d(self):
r"""
Expand All @@ -326,9 +326,9 @@ def _view_widget_3d(self):
try:
from menpowidgets import view_widget
view_widget(self)
except ImportError:
except ImportError as e:
from menpo.visualize.base import MenpowidgetsMissingError
raise MenpowidgetsMissingError()
raise MenpowidgetsMissingError(e.name)

def __str__(self):
out_string = '{}: n_groups: {}'.format(type(self).__name__,
Expand Down
16 changes: 8 additions & 8 deletions menpo/model/pca.py
Original file line number Diff line number Diff line change
Expand Up @@ -832,9 +832,9 @@ def plot_eigenvalues_widget(self, figure_size=(10, 6), style='coloured'):
"""
try:
from menpowidgets import plot_graph
except:
except ImportError as e:
from menpo.visualize.base import MenpowidgetsMissingError
raise MenpowidgetsMissingError()
raise MenpowidgetsMissingError(e.name)
plot_graph(x_axis=range(self.n_active_components),
y_axis=[self.eigenvalues], legend_entries=['Eigenvalues'],
figure_size=figure_size, style=style)
Expand Down Expand Up @@ -981,9 +981,9 @@ def plot_eigenvalues_ratio_widget(self, figure_size=(10, 6),
"""
try:
from menpowidgets import plot_graph
except:
except ImportError as e:
from menpo.visualize.base import MenpowidgetsMissingError
raise MenpowidgetsMissingError()
raise MenpowidgetsMissingError(e.name)
plot_graph(x_axis=range(self.n_active_components),
y_axis=[self.eigenvalues_ratio()],
legend_entries=['Eigenvalues ratio'],
Expand Down Expand Up @@ -1137,9 +1137,9 @@ def plot_eigenvalues_cumulative_ratio_widget(self, figure_size=(10, 6),
"""
try:
from menpowidgets import plot_graph
except:
except ImportError as e:
from menpo.visualize.base import MenpowidgetsMissingError
raise MenpowidgetsMissingError()
raise MenpowidgetsMissingError(e.name)
plot_graph(x_axis=range(self.n_active_components),
y_axis=[self.eigenvalues_cumulative_ratio()],
legend_entries=['Eigenvalues cumulative ratio'],
Expand Down Expand Up @@ -1444,9 +1444,9 @@ def view_widget(self, figure_size=(7, 7)):
try:
from menpowidgets import view_widget
view_widget(self, figure_size=figure_size)
except ImportError:
except ImportError as e:
from menpo.visualize.base import MenpowidgetsMissingError
raise MenpowidgetsMissingError()
raise MenpowidgetsMissingError(e.name)

def __str__(self):
str_out = 'PCA Model \n' \
Expand Down
4 changes: 2 additions & 2 deletions menpo/shape/graph.py
Original file line number Diff line number Diff line change
Expand Up @@ -2363,9 +2363,9 @@ def _view_3d(self, figure_id=None, new_figure=True, render_lines=True,
render_numbering=render_numbering,
numbers_colour=numbers_colour, numbers_size=numbers_size)
return renderer
except ImportError:
except ImportError as e:
from menpo.visualize import Menpo3dMissingError
raise Menpo3dMissingError()
raise Menpo3dMissingError(e.name)


class PointUndirectedGraph(PointGraph, UndirectedGraph):
Expand Down
12 changes: 6 additions & 6 deletions menpo/shape/labelled.py
Original file line number Diff line number Diff line change
Expand Up @@ -765,9 +765,9 @@ def _view_3d(self, with_labels=None, without_labels=None, group='group',
marker_colour=marker_colour, marker_resolution=marker_resolution,
step=step, alpha=alpha, render_numbering=render_numbering,
numbers_colour=numbers_colour, numbers_size=numbers_size)
except ImportError:
except ImportError as e:
from menpo.visualize import Menpo3dMissingError
raise Menpo3dMissingError()
raise Menpo3dMissingError(e.name)

@viewwrapper
def view_widget(self, ):
Expand All @@ -791,9 +791,9 @@ def _view_widget_2d(self, figure_size=(7, 7)):
try:
from menpowidgets import view_widget
view_widget(self, figure_size=figure_size)
except ImportError:
except ImportError as e:
from menpo.visualize.base import MenpowidgetsMissingError
raise MenpowidgetsMissingError()
raise MenpowidgetsMissingError(e.name)

def _view_widget_3d(self):
r"""
Expand All @@ -803,9 +803,9 @@ def _view_widget_3d(self):
try:
from menpowidgets import view_widget
view_widget(self)
except ImportError:
except ImportError as e:
from menpo.visualize.base import MenpowidgetsMissingError
raise MenpowidgetsMissingError()
raise MenpowidgetsMissingError(e.name)

def __str__(self):
return '{}: n_labels: {}, n_points: {}, n_edges: {}'.format(
Expand Down
4 changes: 2 additions & 2 deletions menpo/shape/mesh/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -1176,6 +1176,6 @@ def _view_3d(self, figure_id=None, new_figure=True, mesh_type='wireframe',
normals_marker_resolution=normals_marker_resolution,
normals_marker_size=normals_marker_size, step=step, alpha=alpha)
return renderer
except ImportError:
except ImportError as e:
from menpo.visualize import Menpo3dMissingError
raise Menpo3dMissingError()
raise Menpo3dMissingError(e.name)
8 changes: 4 additions & 4 deletions menpo/shape/mesh/coloured.py
Original file line number Diff line number Diff line change
Expand Up @@ -316,9 +316,9 @@ def _view_3d(self, figure_id=None, new_figure=True, render_texture=True,
normals_marker_size=normals_marker_size, step=step,
alpha=alpha)
return renderer
except ImportError:
except ImportError as e:
from menpo.visualize import Menpo3dMissingError
raise Menpo3dMissingError()
raise Menpo3dMissingError(e.name)
else:
try:
from menpo3d.visualize import TriMeshViewer3d
Expand All @@ -333,9 +333,9 @@ def _view_3d(self, figure_id=None, new_figure=True, render_texture=True,
normals_marker_size=normals_marker_size, step=step,
alpha=alpha)
return renderer
except ImportError:
except ImportError as e:
from menpo.visualize import Menpo3dMissingError
raise Menpo3dMissingError()
raise Menpo3dMissingError(e.name)

def _view_2d(self, figure_id=None, new_figure=False, image_view=True,
render_lines=True, line_colour='r', line_style='-',
Expand Down
8 changes: 4 additions & 4 deletions menpo/shape/mesh/textured.py
Original file line number Diff line number Diff line change
Expand Up @@ -368,9 +368,9 @@ def _view_3d(self, figure_id=None, new_figure=True, render_texture=True,
normals_marker_size=normals_marker_size, step=step,
alpha=alpha)
return renderer
except ImportError:
except ImportError as e:
from menpo.visualize import Menpo3dMissingError
raise Menpo3dMissingError()
raise Menpo3dMissingError(e.name)
else:
try:
from menpo3d.visualize import TriMeshViewer3d
Expand All @@ -385,9 +385,9 @@ def _view_3d(self, figure_id=None, new_figure=True, render_texture=True,
normals_marker_size=normals_marker_size, step=step,
alpha=alpha)
return renderer
except ImportError:
except ImportError as e:
from menpo.visualize import Menpo3dMissingError
raise Menpo3dMissingError()
raise Menpo3dMissingError(e.name)

def _view_2d(self, figure_id=None, new_figure=False, image_view=True,
render_lines=True, line_colour='r', line_style='-',
Expand Down
12 changes: 6 additions & 6 deletions menpo/shape/pointcloud.py
Original file line number Diff line number Diff line change
Expand Up @@ -984,9 +984,9 @@ def _view_3d(self, figure_id=None, new_figure=True, render_markers=True,
step=step, alpha=alpha, render_numbering=render_numbering,
numbers_colour=numbers_colour, numbers_size=numbers_size)
return renderer
except ImportError:
except ImportError as e:
from menpo.visualize import Menpo3dMissingError
raise Menpo3dMissingError()
raise Menpo3dMissingError(e.name)

def _view_landmarks_3d(self, group=None, with_labels=None,
without_labels=None, figure_id=None,
Expand Down Expand Up @@ -1121,9 +1121,9 @@ def _view_widget_2d(self, figure_size=(7, 7)):
try:
from menpowidgets import view_widget
view_widget(self, figure_size=figure_size)
except ImportError:
except ImportError as e:
from menpo.visualize.base import MenpowidgetsMissingError
raise MenpowidgetsMissingError()
raise MenpowidgetsMissingError(e.name)

def _view_widget_3d(self):
r"""
Expand All @@ -1132,9 +1132,9 @@ def _view_widget_3d(self):
try:
from menpowidgets import view_widget
view_widget(self)
except ImportError:
except ImportError as e:
from menpo.visualize.base import MenpowidgetsMissingError
raise MenpowidgetsMissingError()
raise MenpowidgetsMissingError(e.name)

def _transform_self_inplace(self, transform):
self.points = transform(self.points)
Expand Down
12 changes: 8 additions & 4 deletions menpo/visualize/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,21 @@ class Menpo3dMissingError(MenpoMissingDependencyError):
Exception that is thrown when an attempt is made to import a 3D
visualisation method, but 'menpo3d' is not installed.
"""
def __init__(self):
super(Menpo3dMissingError, self).__init__('menpo3d')
def __init__(self, actual_missing_import_name):
super(Menpo3dMissingError, self).__init__(actual_missing_import_name)
self.message += ("\nThis import is required in order to use the "
"'menpo3d' package")


class MenpowidgetsMissingError(MenpoMissingDependencyError):
r"""
Exception that is thrown when an attempt is made to import a widget, but
'menpowidgets' is not installed.
"""
def __init__(self):
super(MenpowidgetsMissingError, self).__init__('menpowidgets')
def __init__(self, actual_missing_import_name):
super(MenpowidgetsMissingError, self).__init__(actual_missing_import_name)
self.message += ("\nThis import is required in order to use the "
"'menpowidgets' package")


class Renderer(object):
Expand Down

0 comments on commit f6c9a23

Please sign in to comment.