1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
|
#!/usr/bin/env python
from __future__ import print_function
DESCRIPTION = """
Runs all the examples for testing purposes and reports successes and failures
to stderr. An example is marked successful if the running thread does not
throw an exception, for threaded examples, such as plotting, one needs to
check the stderr messages as well.
"""
EPILOG = """
Example Usage:
When no examples fail:
$ ./all.py > out
SUCCESSFUL:
- beginner.basic
[...]
NO FAILED EXAMPLES
$
When examples fail:
$ ./all.py -w > out
Traceback (most recent call last):
File "./all.py", line 111, in run_examples
[...]
SUCCESSFUL:
- beginner.basic
[...]
FAILED:
- intermediate.mplot2D
[...]
$
Obviously, we want to achieve the first result.
"""
import imp
import optparse
import os
import sys
import traceback
# add local sympy to the module path
this_file = os.path.abspath(__file__)
sympy_dir = os.path.join(os.path.dirname(this_file), "..")
sympy_dir = os.path.normpath(sympy_dir)
sys.path.insert(0, sympy_dir)
import sympy
TERMINAL_EXAMPLES = [
"beginner.basic",
"beginner.differentiation",
"beginner.expansion",
"beginner.functions",
"beginner.limits_examples",
"beginner.precision",
"beginner.print_pretty",
"beginner.series",
"beginner.substitution",
"intermediate.coupled_cluster",
"intermediate.differential_equations",
"intermediate.infinite_1d_box",
"intermediate.partial_differential_eqs",
"intermediate.trees",
"intermediate.vandermonde",
"advanced.curvilinear_coordinates",
"advanced.dense_coding_example",
"advanced.fem",
"advanced.gibbs_phenomenon",
"advanced.grover_example",
"advanced.hydrogen",
"advanced.pidigits",
"advanced.qft",
"advanced.relativity",
"galgebra.eval_check",
"galgebra.exp_check",
"galgebra.manifold_check",
"galgebra.mv_setup_options",
"galgebra.prob_not_solenoidal",
"galgebra.simple_check",
"galgebra.terminal_check",
]
WINDOWED_EXAMPLES = [
"beginner.plotting_nice_plot",
"intermediate.mplot2d",
"intermediate.mplot3d",
"intermediate.print_gtk",
"advanced.autowrap_integrators",
"advanced.autowrap_ufuncify",
"advanced.pyglet_plotting",
"galgebra.latex_check",
"galgebra.manifold_check_latex",
"galgebra.matrix_latex",
"galgebra.physics_check_latex",
"galgebra.print_check_latex",
"galgebra.products_latex",
"galgebra.simple_check_latex",
"galgebra.spherical_latex",
]
EXAMPLE_DIR = os.path.dirname(__file__)
def __import__(name, globals=None, locals=None, fromlist=None):
"""An alternative to the import function so that we can import
modules defined as strings.
This code was taken from: http://docs.python.org/lib/examples-imp.html
"""
# Fast path: see if the module has already been imported.
try:
return sys.modules[name]
except KeyError:
pass
# If any of the following calls raises an exception,
# there's a problem we can't handle -- let the caller handle it.
module_name = name.split('.')[-1]
module_path = os.path.join(EXAMPLE_DIR, *name.split('.')[:-1])
fp, pathname, description = imp.find_module(module_name, [module_path])
try:
return imp.load_module(module_name, fp, pathname, description)
finally:
# Since we may exit via an exception, close fp explicitly.
if fp:
fp.close()
def load_example_module(example):
"""Loads modules based upon the given package name"""
mod = __import__(example)
return mod
def run_examples(windowed=False, quiet=False, summary=True):
"""Run all examples in the list of modules.
Returns a boolean value indicating whether all the examples were
successful.
"""
successes = []
failures = []
examples = TERMINAL_EXAMPLES
if windowed:
examples += WINDOWED_EXAMPLES
if quiet:
from sympy.utilities.runtests import PyTestReporter
reporter = PyTestReporter()
reporter.write("Testing Examples\n")
reporter.write("-" * reporter.terminal_width)
else:
reporter = None
for example in examples:
if run_example(example, reporter=reporter):
successes.append(example)
else:
failures.append(example)
if summary:
show_summary(successes, failures, reporter=reporter)
return len(failures) == 0
def run_example(example, reporter=None):
"""Run a specific example.
Returns a boolean value indicating whether the example was successful.
"""
if reporter:
reporter.write(example)
else:
print("=" * 79)
print("Running: ", example)
try:
mod = load_example_module(example)
if reporter:
suppress_output(mod.main)
reporter.write("[PASS]", "Green", align="right")
else:
mod.main()
return True
except:
if reporter:
reporter.write("[FAIL]", "Red", align="right")
traceback.print_exc()
return False
class DummyFile(object):
def write(self, x):
pass
def suppress_output(fn):
"""Suppresses the output of fn on sys.stdout."""
save_stdout = sys.stdout
try:
sys.stdout = DummyFile()
fn()
finally:
sys.stdout = save_stdout
def show_summary(successes, failures, reporter=None):
"""Shows a summary detailing which examples were successful and which failed."""
if reporter:
reporter.write("-" * reporter.terminal_width)
if failures:
reporter.write("FAILED:\n", "Red")
for example in failures:
reporter.write(" %s\n" % example)
else:
reporter.write("ALL EXAMPLES PASSED\n", "Green")
else:
if successes:
print("SUCCESSFUL: ", file=sys.stderr)
for example in successes:
print(" -", example, file=sys.stderr)
else:
print("NO SUCCESSFUL EXAMPLES", file=sys.stderr)
if failures:
print("FAILED: ", file=sys.stderr)
for example in failures:
print(" -", example, file=sys.stderr)
else:
print("NO FAILED EXAMPLES", file=sys.stderr)
def main(*args, **kws):
"""Main script runner"""
parser = optparse.OptionParser()
parser.add_option('-w', '--windowed', action="store_true", dest="windowed",
help="also run examples requiring windowed environment")
parser.add_option('-q', '--quiet', action="store_true", dest="quiet",
help="runs examples in 'quiet mode' suppressing example output and \
showing simple status messages.")
parser.add_option('--no-summary', action="store_true", dest="no_summary",
help="hides the summary at the end of testing the examples")
(options, _) = parser.parse_args()
return 0 if run_examples(windowed=options.windowed, quiet=options.quiet,
summary=not options.no_summary) else 1
if __name__ == "__main__":
sys.exit(main(*sys.argv[1:]))
|