10000 Merge pull request #2331 from megies/optional_backend_config_check · matplotlib/matplotlib@8607047 · GitHub
[go: up one dir, main page]

Skip to content

Commit 8607047

Browse files
committed
Merge pull request #2331 from megies/optional_backend_config_check
Make optional backends respect setup.cfg
2 parents 637a565 + 829597b commit 8607047

File tree

2 files changed

+71
-57
lines changed

2 files changed

+71
-57
lines changed

setup.cfg.template

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,18 @@
5454
# otherwise skip silently. This is the default
5555
# behavior
5656
#
57+
#agg = auto
58+
#cairo = auto
5759
#gtk = auto
60+
#gtk3agg = auto
61+
#gtk3cairo = auto
5862
#gtkagg = auto
59-
#tkagg = auto
6063
#macosx = auto
64+
#pyside = auto
65+
#qt4agg = auto
66+
#tkagg = auto
6167
#windowing = auto
62-
#gtk3cairo = auto
63-
#gtk3agg = auto
68+
#wxagg = auto
6469

6570
[rc_options]
6671
# User-configurable options

setupext.py

Lines changed: 63 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -435,38 +435,66 @@ def _check_for_pkg_config(self, package, include_file, min_version=None,
435435

436436
class 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

472500
class Platform(SetupPackage):
@@ -1005,16 +1033,6 @@ def get_install_requires(self):
10051033

10061034
class 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):
13251340
class 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):
14831495
class 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):
15481560
class 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):
15761588
class 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):
16141626
class 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):
16951704
class 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):
17111720
class 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

Comments
 (0)
0