@@ -435,38 +435,66 @@ def _check_for_pkg_config(self, package, include_file, min_version=None,
435435
436436class OptionalPackage (SetupPackage ):
437437 optional = True
438+ force = False
439+ config_category = "packages"
438440
439441 def get_config (self ):
440- install = True
441- if config is not None :
442- try :
443- install = config .getboolean (
444- 'packages' , self .name )
445- except :
446- pass
447- return install
442+ """
443+ Look at `setup.cfg` and return one of ["auto", True, False] indicating
444+ if the package is at default state ("auto"), forced by the user (True)
445+ or opted-out (False).
446+ """
447+ try :
448+ return config .getboolean (self .config_category , self .name )
449+ except :
450+ return "auto"
448451
449452 def check (self ):
450- self .install = self .get_config ()
451- if not self .install :
452- raise CheckFailed ("skipping due to configuration" )
453- return "installing"
453+ """
454+ Do not override this method!
454455
456+ For custom dependency checks override self.check_requirements().
457+ Two things are checked: Configuration file and requirements.
458+ """
459+ # Check configuration file
460+ conf = self .get_config ()
461+ # Default "auto" state or install forced by user
462+ if conf in [True , 'auto' ]:
463+ message = "installing"
464+ # Set non-optional if user sets `True` in config
465+ if conf is True :
466+ self .optional = False
467+ # Configuration opt-out by user
468+ else :
469+ # Some backend extensions (e.g. Agg) need to be built for certain
470+ # other GUI backends (e.g. TkAgg) even when manually disabled
471+ if self .force is True :
472+ message = "installing forced (config override)"
473+ else :
474+ raise CheckFailed ("skipping due to configuration" )
455475
456- class OptionalBackendPackage (SetupPackage ):
457- optional = True
476+ # Check requirements and add extra information (if any) to message.
477+ # If requirements are not met a CheckFailed should be raised in there.
478+ additional_info = self .check_requirements ()
479+ if additional_info :
480+ message += ", " + additional_info
481+
482+ # No CheckFailed raised until now, return install message.
483+ return message
484+
485+ def check_requirements (self ):
486+ """
487+ Override this method to do custom dependency checks.
488+
489+ - Raise CheckFailed() if requirements are not met.
490+ - Return message with additional information, or an empty string
491+ (or None) for no additional information.
492+ """
493+ return ""
458494
459- def get_config (self ):
460- install = 'auto'
461- if config is not None :
462- try :
463- install = config .getboolean (
464- 'gui_support' , self .name )
465- except :
466- install = 'auto'
467- if install is True :
468- self .optional = False
469- return install
495+
496+ class OptionalBackendPackage (OptionalPackage ):
497+ config_category = "gui_support"
470498
471499
472500class Platform (SetupPackage ):
@@ -1005,16 +1033,6 @@ def get_install_requires(self):
10051033
10061034class BackendAgg (OptionalBackendPackage ):
10071035 name = "agg"
1008- force = False
1009-
1010- def check (self ):
1011- # The Agg backend extension needs to be built even
1012- # for certain GUI backends, such as TkAgg
1013- config = self .get_config ()
1014- if config is False and self .force is False :
1015- raise CheckFailed ("skipping due to configuration" )
1016- else :
1017- return "installing"
10181036
10191037 def get_extension (self ):
10201038 sources = [
@@ -1036,10 +1054,7 @@ class BackendTkAgg(OptionalBackendPackage):
10361054 def __init__ (self ):
10371055 self .tcl_tk_cache = None
10381056
1039- def check (self ):
1040- if self .get_config () is False :
1041- raise CheckFailed ("skipping due to configuration" )
1042-
1057+ def check_requirements (self ):
10431058 try :
10441059 if sys .version_info [0 ] < 3 :
10451060 import Tkinter
@@ -1325,10 +1340,7 @@ def add_flags(self, ext):
13251340class BackendGtk (OptionalBackendPackage ):
13261341 name = "gtk"
13271342
1328- def check (self ):
1329- if self .get_config () is False :
1330- raise CheckFailed ("skipping due to configuration" )
1331-
1343+ def check_requirements (self ):
13321344 try :
13331345 import gtk
13341346 except ImportError :
@@ -1483,7 +1495,7 @@ def backend_gtk3agg_internal_check(x):
14831495class BackendGtk3Agg (OptionalBackendPackage ):
14841496 name = "gtk3agg"
14851497
1486- def check (self ):
1498+ def check_requirements (self ):
14871499 if 'TRAVIS' in os .environ :
14881500 raise CheckFailed ("Can't build with Travis" )
14891501
@@ -1548,7 +1560,7 @@ def backend_gtk3cairo_internal_check(x):
15481560class BackendGtk3Cairo (OptionalBackendPackage ):
15491561 name = "gtk3cairo"
15501562
1551- def check (self ):
1563+ def check_requirements (self ):
15521564 if 'TRAVIS' in os .environ :
15531565 raise CheckFailed ("Can't build with Travis" )
15541566
@@ -1576,7 +1588,7 @@ def get_package_data(self):
15761588class BackendWxAgg (OptionalBackendPackage ):
15771589 name = "wxagg"
15781590
1579- def check (self ):
1591+ def check_requirements (self ):
15801592 try :
15811593 import wxversion
15821594 except ImportError :
@@ -1614,10 +1626,7 @@ def check(self):
16141626class BackendMacOSX (OptionalBackendPackage ):
16151627 name = 'macosx'
16161628
1617- def check (self ):
1618- if self .get_config () is False :
1619- raise CheckFailed ("skipping due to configuration" )
1620-
1629+ def check_requirements (self ):
16211630 if sys .platform != 'darwin' :
16221631 raise CheckFailed ("Mac OS-X only" )
16231632
@@ -1644,7 +1653,7 @@ class Windowing(OptionalBackendPackage):
16441653 """
16451654 name = "windowing"
16461655
1647- def check (self ):
1656+ def check_requirements (self ):
16481657 if sys .platform != 'win32' :
16491658 raise CheckFailed ("Microsoft Windows only" )
16501659 config = self .get_config ()
@@ -1675,7 +1684,7 @@ def convert_qt_version(self, version):
16751684 temp .insert (0 , str (int (chunk , 16 )))
16761685 return '.' .join (temp )
16771686
1678- def check (self ):
1687+ def check_requirements (self ):
16791688 try :
16801689 from PyQt4 import pyqtconfig
16811690 except ImportError :
@@ -1695,7 +1704,7 @@ def check(self):
16951704class BackendPySide (OptionalBackendPackage ):
16961705 name = "pyside"
16971706
1698- def check (self ):
1707+ def check_requirements (self ):
16991708 try :
17001709 from PySide import __version__
17011710 from PySide import QtCore
@@ -1711,7 +1720,7 @@ def check(self):
17111720class BackendCairo (OptionalBackendPackage ):
17121721 name = "cairo"
17131722
1714- def check (self ):
1723+ def check_requirements (self ):
17151724 try :
17161725 import cairo
17171726 except ImportError :
0 commit comments