[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