Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 8607047

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

File tree

2 files changed

+71
-57
lines changed
Filter options

2 files changed

+71
-57
lines changed

‎setup.cfg.template

Copy file name to clipboardExpand all lines: setup.cfg.template
+8-3Lines 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

Copy file name to clipboardExpand all lines: setupext.py
+63-54Lines 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)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.