@@ -435,38 +435,66 @@ def _check_for_pkg_config(self, package, include_file, min_version=None,
435
435
436
436
class OptionalPackage (SetupPackage ):
437
437
optional = True
438
+ force = False
439
+ config_category = "packages"
438
440
439
441
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"
448
451
449
452
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!
454
455
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" )
455
475
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 ""
458
494
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"
470
498
471
499
472
500
class Platform (SetupPackage ):
@@ -1005,16 +1033,6 @@ def get_install_requires(self):
1005
1033
1006
1034
class BackendAgg (OptionalBackendPackage ):
1007
1035
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"
1018
1036
1019
1037
def get_extension (self ):
1020
1038
sources = [
@@ -1036,10 +1054,7 @@ class BackendTkAgg(OptionalBackendPackage):
1036
1054
def __init__ (self ):
1037
1055
self .tcl_tk_cache = None
1038
1056
1039
- def check (self ):
1040
- if self .get_config () is False :
1041
- raise CheckFailed ("skipping due to configuration" )
1042
-
1057
+ def check_requirements (self ):
1043
1058
try :
1044
1059
if sys .version_info [0 ] < 3 :
1045
1060
import Tkinter
@@ -1325,10 +1340,7 @@ def add_flags(self, ext):
1325
1340
class BackendGtk (OptionalBackendPackage ):
1326
1341
name = "gtk"
1327
1342
1328
- def check (self ):
1329
- if self .get_config () is False :
1330
- raise CheckFailed ("skipping due to configuration" )
1331
-
1343
+ def check_requirements (self ):
1332
1344
try :
1333
1345
import gtk
1334
1346
except ImportError :
@@ -1483,7 +1495,7 @@ def backend_gtk3agg_internal_check(x):
1483
1495
class BackendGtk3Agg (OptionalBackendPackage ):
1484
1496
name = "gtk3agg"
1485
1497
1486
- def check (self ):
1498
+ def check_requirements (self ):
1487
1499
if 'TRAVIS' in os .environ :
1488
1500
raise CheckFailed ("Can't build with Travis" )
1489
1501
@@ -1548,7 +1560,7 @@ def backend_gtk3cairo_internal_check(x):
1548
1560
class BackendGtk3Cairo (OptionalBackendPackage ):
1549
1561
name = "gtk3cairo"
1550
1562
1551
- def check (self ):
1563
+ def check_requirements (self ):
1552
1564
if 'TRAVIS' in os .environ :
1553
1565
raise CheckFailed ("Can't build with Travis" )
1554
1566
@@ -1576,7 +1588,7 @@ def get_package_data(self):
1576
1588
class BackendWxAgg (OptionalBackendPackage ):
1577
1589
name = "wxagg"
1578
1590
1579
- def check (self ):
1591
+ def check_requirements (self ):
1580
1592
try :
1581
1593
import wxversion
1582
1594
except ImportError :
@@ -1614,10 +1626,7 @@ def check(self):
1614
1626
class BackendMacOSX (OptionalBackendPackage ):
1615
1627
name = 'macosx'
1616
1628
1617
- def check (self ):
1618
- if self .get_config () is False :
1619
- raise CheckFailed ("skipping due to configuration" )
1620
-
1629
+ def check_requirements (self ):
1621
1630
if sys .platform != 'darwin' :
1622
1631
raise CheckFailed ("Mac OS-X only" )
1623
1632
@@ -1644,7 +1653,7 @@ class Windowing(OptionalBackendPackage):
1644
1653
"""
1645
1654
name = "windowing"
1646
1655
1647
- def check (self ):
1656
+ def check_requirements (self ):
1648
1657
if sys .platform != 'win32' :
1649
1658
raise CheckFailed ("Microsoft Windows only" )
1650
1659
config = self .get_config ()
@@ -1675,7 +1684,7 @@ def convert_qt_version(self, version):
1675
1684
temp .insert (0 , str (int (chunk , 16 )))
1676
1685
return '.' .join (temp )
1677
1686
1678
- def check (self ):
1687
+ def check_requirements (self ):
1679
1688
try :
1680
1689
from PyQt4 import pyqtconfig
1681
1690
except ImportError :
@@ -1695,7 +1704,7 @@ def check(self):
1695
1704
class BackendPySide (OptionalBackendPackage ):
1696
1705
name = "pyside"
1697
1706
1698
- def check (self ):
1707
+ def check_requirements (self ):
1699
1708
try :
1700
1709
from PySide import __version__
1701
1710
from PySide import QtCore
@@ -1711,7 +1720,7 @@ def check(self):
1711
1720
class BackendCairo (OptionalBackendPackage ):
1712
1721
name = "cairo"
1713
1722
1714
- def check (self ):
1723
+ def check_requirements (self ):
1715
1724
try :
1716
1725
import cairo
1717
1726
except ImportError :
0 commit comments