Skip to content
This repository was archived by the owner on Jan 30, 2023. It is now read-only.

Commit 2b45b77

Browse files
author
Matthias Koeppe
committed
sage.feature.join_feature: New, factored out from LatteFeature; use it to implement FourTi2Feature
1 parent 56016ce commit 2b45b77

File tree

3 files changed

+108
-38
lines changed

3 files changed

+108
-38
lines changed

src/sage/features/four_ti_2.py

+21-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from sage.env import SAGE_ENV
22

3-
from sage.features import Executable
3+
from . import Executable
4+
from .join_feature import JoinFeature
5+
46

57
class FourTi2Executable(Executable):
68
r"""
@@ -11,3 +13,21 @@ def __init__(self, name):
1113
name="4ti2-" + name,
1214
executable=SAGE_ENV.get("FOURTITWO_" + name.upper(), None) or name,
1315
spkg="4ti2")
16+
17+
18+
class FourTi2(JoinFeature):
19+
r"""
20+
A :class:`sage.features.Feature` describing the presence of the ``4ti2`` executables.
21+
22+
EXAMPLES::
23+
24+
sage: from sage.features.four_ti_2 import FourTi2
25+
sage: FourTi2().is_present() # optional - 4ti2
26+
FeatureTestResult('4ti2', True)
27+
"""
28+
def __init__(self):
29+
JoinFeature.__init__(self, '4ti2',
30+
[FourTi2Executable(x)
31+
# same list is tested in build/pkgs/4ti2/spkg-configure.m4
32+
for x in ('hilbert', 'markov', 'graver', 'zsolve', 'qsolve',
33+
'rays', 'ppi', 'circuits', 'groebner')])

src/sage/features/join_feature.py

+82
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
r"""
2+
Join features
3+
"""
4+
5+
from . import Feature, FeatureTestResult
6+
7+
8+
class JoinFeature(Feature):
9+
r"""
10+
Join of several :class:`sage.features.Feature` instances.
11+
12+
EXAMPLES::
13+
14+
sage: from sage.features import Executable
15+
sage: from sage.features.join_feature import JoinFeature
16+
sage: F = JoinFeature("shell-boolean",
17+
....: (Executable('shell-true', 'true'),
18+
....: Executable('shell-false', 'false')))
19+
sage: F.is_present()
20+
FeatureTestResult('shell-boolean', True)
21+
sage: F = JoinFeature("asdfghjkl",
22+
....: (Executable('shell-true', 'true'),
23+
....: Executable('xxyyyy', 'xxyyyy-does-not-exist')))
24+
sage: F.is_present()
25+
FeatureTestResult('xxyyyy', False)
26+
"""
27+
def __init__(self, name, features, spkg=None, url=None):
28+
"""
29+
TESTS:
30+
31+
The empty join feature is present::
32+
33+
sage: from sage.features.join_feature import JoinFeature
34+
sage: JoinFeature("empty", ()).is_present()
35+
FeatureTestResult('empty', True)
36+
"""
37+
if spkg is None:
38+
spkgs = set(f.spkg for f in features if f.spkg)
39+
if len(spkgs) > 1:
40+
raise ValueError('given features have more than one spkg; provide spkg argument')
41+
elif len(spkgs) == 1:
42+
spkg = next(iter(spkgs))
43+
if url is None:
44+
urls = set(f.url for f in features if f.url)
45+
if len(urls) > 1:
46+
raise ValueError('given features have more than one url; provide url argument')
47+
elif len(urls) == 1:
48+
url = next(iter(urls))
49+
super().__init__(name, spkg=spkg, url=url)
50+
self._features = features
51+
52+
def _is_present(self):
53+
r"""
54+
Test for the presence of the join feature.
55+
56+
EXAMPLES::
57+
58+
sage: from sage.features.latte import Latte
59+
sage: Latte()._is_present() # optional - latte_int
60+
FeatureTestResult('LattE', True)
61+
"""
62+
for f in self._features:
63+
test = f._is_present()
64+
if not test:
65+
return test
66+
return FeatureTestResult(self, True)
67+
68+
def is_functional(self):
69+
r"""
70+
Test whether the join feature is functional.
71+
72+
EXAMPLES::
73+
74+
sage: from sage.features.latte import Latte
75+
sage: Latte().is_functional() # optional - latte_int
76+
FeatureTestResult('LattE', True)
77+
"""
78+
for f in self._features:
79+
test = f.is_functional()
80+
if not test:
81+
return test
82+
return FeatureTestResult(self, True)

src/sage/features/latte.py

+5-37
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
Check for LattE
44
"""
55
from . import Executable, Feature, FeatureTestResult
6+
from .join_feature import JoinFeature
7+
68

79
LATTE_URL = "https://www.math.ucdavis.edu/~latte/software.php"
810

@@ -27,7 +29,7 @@ def __init__(self):
2729
url=LATTE_URL)
2830

2931

30-
class Latte(Feature):
32+
class Latte(JoinFeature):
3133
r"""
3234
A :class:`sage.features.Feature` describing the presence of the ``LattE``
3335
binaries which comes as a part of ``latte_int``.
@@ -46,39 +48,5 @@ def __init__(self):
4648
sage: isinstance(Latte(), Latte)
4749
True
4850
"""
49-
Feature.__init__(self, "LattE")
50-
51-
def _is_present(self):
52-
r"""
53-
Test for the presence of LattE binaries.
54-
55-
EXAMPLES::
56-
57-
sage: from sage.features.latte import Latte
58-
sage: Latte()._is_present() # optional - latte_int
59-
FeatureTestResult('LattE', True)
60-
"""
61-
62-
test = (Latte_count()._is_present() and
63-
Latte_integrate()._is_present())
64-
if not test:
65-
return test
66-
67-
return FeatureTestResult(self, True)
68-
69-
def is_functional(self):
70-
r"""
71-
Test whether count and integrate are functionals.
72-
73-
EXAMPLES::
74-
75-
sage: from sage.features.latte import Latte
76-
sage: Latte().is_functional() # optional - latte_int
77-
FeatureTestResult('LattE', True)
78-
"""
79-
test = (Latte_count().is_functional() and
80-
Latte_integrate().is_functional())
81-
if not test:
82-
return test
83-
84-
return FeatureTestResult(self, True)
51+
JoinFeature.__init__(self, "LattE",
52+
(Latte_count(), Latte_integrate()))

0 commit comments

Comments
 (0)