[Checkins] SVN: manuel/trunk/src/manuel/ rework the evaluaters to work region-by-region instead of on the
Benji York
benji at zope.com
Mon Apr 27 08:56:24 EDT 2009
Log message for revision 99534:
rework the evaluaters to work region-by-region instead of on the
entire document
Changed:
U manuel/trunk/src/manuel/README.txt
U manuel/trunk/src/manuel/__init__.py
U manuel/trunk/src/manuel/doctest.py
-=-
Modified: manuel/trunk/src/manuel/README.txt
===================================================================
--- manuel/trunk/src/manuel/README.txt 2009-04-27 12:36:49 UTC (rev 99533)
+++ manuel/trunk/src/manuel/README.txt 2009-04-27 12:56:23 UTC (rev 99534)
@@ -152,25 +152,27 @@
Evaluation
----------
-After a document has been parsed the resulting tests are evaluated. Manuel
-provides another method to evaluate tests. Lets define a function to evaluate
-NumberTests. The function determines whether or not the numbers are in sorted
-order and records the result along with the description of the list of numbers.
+After a document has been parsed the resulting tests are evaluated. Unlike
+parsing and formatting, evaluation is done one region at a time, in the order
+that the regions appear in the document. Manuel provides another method to
+evaluate tests. Lets define a function to evaluate NumberTests. The function
+determines whether or not the numbers are in sorted order and records the
+result along with the description of the list of numbers.
>>> class NumbersResult(object):
... def __init__(self, test, passed):
... self.test = test
... self.passed = passed
- >>> def evaluate(document):
- ... for region in document:
- ... if not isinstance(region.parsed, NumbersTest):
- ... continue
- ... test = region.parsed
- ... passed = sorted(test.numbers) == test.numbers
- ... region.evaluated = NumbersResult(test, passed)
+ >>> def evaluate(region, document):
+ ... if not isinstance(region.parsed, NumbersTest):
+ ... return
+ ... test = region.parsed
+ ... passed = sorted(test.numbers) == test.numbers
+ ... region.evaluated = NumbersResult(test, passed)
- >>> evaluate(document)
+ >>> for region in document:
+ ... evaluate(region, document)
>>> [region.evaluated for region in document]
[None,
<NumbersResult object at 0x...>,
Modified: manuel/trunk/src/manuel/__init__.py
===================================================================
--- manuel/trunk/src/manuel/__init__.py 2009-04-27 12:36:49 UTC (rev 99533)
+++ manuel/trunk/src/manuel/__init__.py 2009-04-27 12:56:23 UTC (rev 99534)
@@ -109,6 +109,14 @@
return new_regions
+def sort_handlers(handlers):
+ def key(f):
+ # "j" was chosen because it sorts between "early" and "late"
+ return getattr(f, 'manuel_timing', 'j')
+
+ return sorted(handlers, key=key)
+
+
class Document(object):
def __init__(self, source, location='<memory>'):
@@ -230,24 +238,18 @@
def insert_region_after(self, marker_region, new_region):
self.insert_region('after', marker_region, new_region)
- def do_with(self, things):
- """Private helper for other do_* functions.
- """
- def key(f):
- # "j" was chosen because it sorts between "early" and "late"
- return getattr(f, 'manuel_timing', 'j')
-
- for thing in sorted(things, key=key):
- thing(self)
-
def parse_with(self, m):
- self.do_with(m.parsers)
+ for parser in sort_handlers(m.parsers):
+ parser(self)
def evaluate_with(self, m):
- self.do_with(m.evaluaters)
+ for evaluater in sort_handlers(m.evaluaters):
+ for region in list(self):
+ evaluater(region, self)
def format_with(self, m):
- self.do_with(m.formatters)
+ for formatter in sort_handlers(m.formatters):
+ formatter(self)
def process_with(self, m):
"""Run all phases of document processing using a Manuel instance.
Modified: manuel/trunk/src/manuel/doctest.py
===================================================================
--- manuel/trunk/src/manuel/doctest.py 2009-04-27 12:36:49 UTC (rev 99533)
+++ manuel/trunk/src/manuel/doctest.py 2009-04-27 12:56:23 UTC (rev 99534)
@@ -41,23 +41,22 @@
assert region in document
-def evaluate(m, document):
- for region in document:
- if not isinstance(region.parsed, doctest.Example):
- continue
- result = DocTestResult()
- test_name = os.path.split(document.location)[1]
- if m.debug:
- runner = m.debug_runner
- else:
- runner = m.runner
+def evaluate(m, region, document):
+ if not isinstance(region.parsed, doctest.Example):
+ return
+ result = DocTestResult()
+ test_name = os.path.split(document.location)[1]
+ if m.debug:
+ runner = m.debug_runner
+ else:
+ runner = m.runner
- runner.DIVIDER = '' # disable unwanted result formatting
- runner.run(
- doctest.DocTest([region.parsed], m.globs, test_name,
- document.location, 0, None),
- out=result.write, clear_globs=False)
- region.evaluated = result
+ runner.DIVIDER = '' # disable unwanted result formatting
+ runner.run(
+ doctest.DocTest([region.parsed], m.globs, test_name,
+ document.location, 0, None),
+ out=result.write, clear_globs=False)
+ region.evaluated = result
def format(document):
@@ -75,6 +74,7 @@
self.debug_runner = doctest.DebugRunner(optionflags=optionflags)
self.globs = SharedGlobs()
self.debug = False
- def evaluate_closure(document):
- evaluate(self, document)
+ def evaluate_closure(region, document):
+ # capture "self"
+ evaluate(self, region, document)
manuel.Manuel.__init__(self, [parse], [evaluate_closure], [format])
More information about the Checkins
mailing list