File: testdocs.py

package info (click to toggle)
pynn 0.10.1-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 6,156 kB
  • sloc: python: 25,612; cpp: 320; makefile: 117; sh: 80
file content (113 lines) | stat: -rw-r--r-- 4,023 bytes parent folder | download | duplicates (2)
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
#!/usr/bin/env python
"""
Script to run doctests.
"""

import doctest
import sys
import os
from optparse import OptionParser

optionflags = doctest.IGNORE_EXCEPTION_DETAIL + doctest.NORMALIZE_WHITESPACE
optionflags = doctest.NORMALIZE_WHITESPACE


class MyOutputChecker(doctest.OutputChecker):
    """
    Modification of doctest.OutputChecker to work better with the PyNN
    users' manual:
      * Often, we don't want to have the output that is printed
    by Python in the manual, as it just takes up space without adding any
    useful information.
    """

    def __init__(self, strict):
        self.strict = strict

    def check_output(self, want, got, optionflags):
        if self.strict:
            return doctest.OutputChecker.check_output(self, want, got, optionflags)
        else:
            if want == '':
                return True
            else:
                try:
                    long(want) and long(got)  # where the output is an id
                    return True
                except ValueError:
                    try:
                        if round(float(want), 8) == round(float(got), 8):
                            return True
                        else:
                            return doctest.OutputChecker.check_output(self, want, got, optionflags)
                    except ValueError:
                        return doctest.OutputChecker.check_output(self, want, got, optionflags)


def mytestfile(filename, globs, optionflags, strict=False):
    parser = doctest.DocTestParser()
    if globs is None:
        globs = {}
    else:
        globs = globs.copy()
    name = os.path.basename(filename)

    runner = doctest.DocTestRunner(checker=MyOutputChecker(strict=strict), optionflags=optionflags)
    # Read the file, convert it to a test, and run it.
    s = open(filename).read()
    test = parser.get_doctest(s, globs, name, filename, 0)
    runner.run(test)
    runner.summarize()
    return runner.failures, runner.tries


def print_script(filename, simulator):
    parser = doctest.DocTestParser()
    s = open(filename).read()
    script = "".join([ex.source for ex in parser.get_examples(s) if "+SKIP" not in ex.source])
    print("from pyNN.%s import *\nsetup(max_delay=10.0, debug=True)\n%s" % (simulator, script))


def remove_data_files():
    import glob
    for pattern in ("*.dat", "*.npz", "*.h5", "*.conn", "logfile"):
        for filename in glob.glob(pattern):
            os.remove(filename)


# ==============================================================================
if __name__ == "__main__":

    # Process command line
    parser = OptionParser(usage="usage: %prog [options] FILE")
    parser.add_option("-s", "--simulator", dest="simulator",
                      type="choice", choices=('nest', 'neuron', 'brian'),
                      help="run doctests with SIMULATOR", metavar="SIMULATOR",
                      default='nest')
    parser.add_option("--strict", action="store_true", dest="strict", default=False,
                      help="Use the original doctest output checker, not the more lax local version.")
    parser.add_option("-p", "--print", action="store_true", default=False, dest="dump",
                      help="Just print out the script extracted from the document, don't run the test.")

    if 'nrniv' in sys.argv[0]:
        (options, args) = parser.parse_args(sys.argv[5:])
    else:
        (options, args) = parser.parse_args()
    if len(args) == 1:
        docfile = args[0]
    else:
        parser.print_help()
        sys.exit(1)

    # Run test
    if options.dump:
        print_script(docfile, options.simulator)
    else:
        exec("from pyNN.%s import *" % options.simulator)
        setup(max_delay=10.0, debug=True)
        if options.simulator == "neuron":
            create(IF_curr_alpha)  # this is to use up ID 0, making the IDs agree with NEST.
        mytestfile(docfile, globs=globals(), optionflags=optionflags, strict=options.strict)

    remove_data_files()
    sys.exit(0)