diff options
154 files changed, 15399 insertions, 10604 deletions
@@ -3,6 +3,7 @@ syntax: glob # Files that can appear anywhere in the tree.
*.pyc
*.pyo
+*$py.class
*.pyd
*.so
*.bak
@@ -13,3 +13,10 @@ ad991769ad4f685089bacc594e689bab50a6db90 coverage-3.0b3 9231251c603ef0d491b01799b3d1da7af54dd083 coverage-3.2b1 da052544181e335a18b4141b8b7a47e8246aa9e8 coverage-3.2b1 11f0fbec2bc9b22a5fd8687d8b94338a4a363e6c coverage-3.2b2 +d42ad49a0aaca90867644876948a7bdab0aa9970 coverage-3.2b3 +3e21d5dc7e9d9c64db56d84b245618ad5c1a4743 coverage-3.2b4 +e3a46ca12bda98e81329300994ca7573dc3af86e coverage-3.2 +e3a46ca12bda98e81329300994ca7573dc3af86e coverage-3.2 +2e1628da1ffce31ed5c58bcad657882de282c858 coverage-3.2 +f63624fedea89b2acb361e1d7d6c5375ebced2aa coverage-3.3 +91bf9589714b14ac4a2ab5995635736994b97348 coverage-3.3.1 diff --git a/AUTHORS.txt b/AUTHORS.txt new file mode 100644 index 00000000..7e3efe52 --- /dev/null +++ b/AUTHORS.txt @@ -0,0 +1,29 @@ +Coverage.py was originally written by Gareth Rees, and since 2004 has been +extended and maintained by Ned Batchelder. + +Other contributions have been made by: + +Chris Adams +Danek Duvall +Ross Lawley +Ben Finney +Bill Hart +Christian Heimes +Detlev Offenbach +George Song +David Christian +Imri Goldberg +Patrick Mezard +Edward Loper +Guillaume Chazarain +Titus Brown +Noel O'Boyle +Catherine Proulx +Joseph Tate +Sigve Tjora +Mark van der Wal +Geoff Bache +Martin Fuzzey +Greg Rogers +Christoph Zwerschke +Zooko Wilcox-O'Hearn diff --git a/CHANGES.txt b/CHANGES.txt index be3e7530..d5bdce72 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,357 +1,481 @@ -------------------------------
-Change history for Coverage.py
-------------------------------
-
-Version 3.2b3
--------------
-
-- The table of contents in the HTML report is now sortable. Thanks,
- `Chris Adams`_.
-
-.. _Chris Adams: http://improbable.org/chris/
-
-
-Version 3.2b2, 19 November 2009
--------------------------------
-
-- Branch coverage improvements:
-
- - Classes are no longer incorrectly marked as branches: `issue 32`_.
-
- - "except" clauses with types are no longer incorrectly marked as branches:
- `issue 35`_.
-
-- Fixed some problems syntax coloring sources with line continuations and
- source with tabs: `issue 30`_ and `issue 31`_.
-
-- The --omit option now works much better than before, fixing `issue 14` and
- `issue 33`_. Thanks, Danek Duvall.
-
-.. _issue 14: http://bitbucket.org/ned/coveragepy/issue/14
-.. _issue 30: http://bitbucket.org/ned/coveragepy/issue/30
-.. _issue 31: http://bitbucket.org/ned/coveragepy/issue/31
-.. _issue 32: http://bitbucket.org/ned/coveragepy/issue/32
-.. _issue 33: http://bitbucket.org/ned/coveragepy/issue/33
-.. _issue 35: http://bitbucket.org/ned/coveragepy/issue/35
-
-
-Version 3.2b1, 10 November 2009
--------------------------------
-
-- Branch coverage!
-
-- XML reporting has file paths that let Cobertura find the source code.
-
-- The tracer code has changed, it's a few percent faster.
-
-- Some exceptions reported by the command line interface have been cleaned up
- so that tracebacks inside coverage.py aren't shown. Fixes `issue 23`_.
-
-.. _issue 23: http://bitbucket.org/ned/coveragepy/issue/23
-
-
-Version 3.1, 4 October 2009
----------------------------
-
-- Source code can now be read from eggs. Thanks, Ross Lawley. Fixes
- `issue 25`_.
-
-.. _issue 25: http://bitbucket.org/ned/coveragepy/issue/25
-
-
-Version 3.1b1, 27 September 2009
---------------------------------
-
-- Python 3.1 is now supported.
-
-- Coverage.py has a new command line syntax with sub-commands. This expands
- the possibilities for adding features and options in the future. The old
- syntax is still supported. Try "coverage help" to see the new commands.
- Thanks to Ben Finney for early help.
-
-- Added an experimental "coverage xml" command for producing coverage reports
- in a Cobertura-compatible XML format. Thanks, Bill Hart.
-
-- Added the --timid option to enable a simpler slower trace function that works
- for DecoratorTools projects, including TurboGears. Fixed `issue 12`_ and
- `issue 13`_.
-
-- HTML reports show modules from other directories. Fixed `issue 11`_.
-
-- HTML reports now display syntax-colored Python source.
-
-- Programs that change directory will still write .coverage files in the
- directory where execution started. Fixed `issue 24`_.
-
-- Added a "coverage debug" command for getting diagnostic information about the
- coverage.py installation.
-
-.. _issue 11: http://bitbucket.org/ned/coveragepy/issue/11
-.. _issue 12: http://bitbucket.org/ned/coveragepy/issue/12
-.. _issue 13: http://bitbucket.org/ned/coveragepy/issue/13
-.. _issue 24: http://bitbucket.org/ned/coveragepy/issue/24
-
-
-Version 3.0.1, 7 July 2009
---------------------------
-
-- Removed the recursion limit in the tracer function. Previously, code that
- ran more than 500 frames deep would crash. Fixed `issue 9`.
-
-- Fixed a bizarre problem involving pyexpat, whereby lines following XML parser
- invocations could be overlooked. Fixed `issue 10`.
-
-- On Python 2.3, coverage.py could mis-measure code with exceptions being
- raised. This is now fixed.
-
-- The coverage.py code itself will now not be measured by coverage.py, and no
- coverage modules will be mentioned in the nose --with-cover plug-in. Fixed
- `issue 8`.
-
-- When running source files, coverage.py now opens them in universal newline
- mode just like Python does. This lets it run Windows files on Mac, for
- example.
-
-.. _issue 9: http://bitbucket.org/ned/coveragepy/issue/9
-.. _issue 10: http://bitbucket.org/ned/coveragepy/issue/10
-.. _issue 8: http://bitbucket.org/ned/coveragepy/issue/8
-
-
-Version 3.0, 13 June 2009
--------------------------
-
-- Fixed the way the Python library was ignored. Too much code was being
- excluded the old way.
-
-- Tabs are now properly converted in HTML reports. Previously indentation was
- lost. Fixed `issue 6`.
-
-- Nested modules now get a proper flat_rootname. Thanks, Christian Heimes.
-
-.. _issue 6: http://bitbucket.org/ned/coveragepy/issue/6
-
-
-Version 3.0b3, 16 May 2009
---------------------------
-
-- Added parameters to coverage.__init__ for options that had been set on the
- coverage object itself.
-
-- Added clear_exclude() and get_exclude_list() methods for programmatic
- manipulation of the exclude regexes.
-
-- Added coverage.load() to read previously-saved data from the data file.
-
-- Improved the finding of code files. For example, .pyc files that have been
- installed after compiling are now located correctly. Thanks, Detlev
- Offenbach.
-
-- When using the object API (that is, constructing a coverage() object), data
- is no longer saved automatically on process exit. You can re-enable it with
- the auto_data=True parameter on the coverage() constructor. The module-level
- interface still uses automatic saving.
-
-
-Version 3.0b2, 30 April 2009
-----------------------------
-
-HTML reporting, and continued refactoring.
-
-- HTML reports and annotation of source files: use the new -b (browser) switch.
- Thanks to George Song for code, inspiration and guidance.
-
-- Code in the Python standard library is not measured by default. If you need
- to measure standard library code, use the -L command-line switch during
- execution, or the cover_pylib=True argument to the coverage() constructor.
-
-- Source annotation into a directory (-a -d) behaves differently. The
- annotated files are named with their hierarchy flattened so that same-named
- files from different directories no longer collide. Also, only files in the
- current tree are included.
-
-- coverage.annotate_file is no longer available.
-
-- Programs executed with -x now behave more as they should, for example,
- __file__ has the correct value.
-
-- .coverage data files have a new pickle-based format designed for better
- extensibility.
-
-- Removed the undocumented cache_file argument to coverage.usecache().
-
-
-Version 3.0b1, 7 March 2009
----------------------------
-
-Major overhaul.
-
-- Coverage is now a package rather than a module. Functionality has been split
- into classes.
-
-- The trace function is implemented in C for speed. Coverage runs are now
- much faster. Thanks to David Christian for productive micro-sprints and
- other encouragement.
-
-- Executable lines are identified by reading the line number tables in the
- compiled code, removing a great deal of complicated analysis code.
-
-- Precisely which lines are considered executable has changed in some cases.
- Therefore, your coverage stats may also change slightly.
-
-- The singleton coverage object is only created if the module-level functions
- are used. This maintains the old interface while allowing better
- programmatic use of Coverage.
-
-- The minimum supported Python version is 2.3.
-
-
-Version 2.85, 14 September 2008
--------------------------------
-
-- Add support for finding source files in eggs. Don't check for
- morf's being instances of ModuleType, instead use duck typing so that
- pseudo-modules can participate. Thanks, Imri Goldberg.
-
-- Use os.realpath as part of the fixing of file names so that symlinks won't
- confuse things. Thanks, Patrick Mezard.
-
-
-Version 2.80, 25 May 2008
--------------------------
-
-- Open files in rU mode to avoid line ending craziness. Thanks, Edward Loper.
-
-
-Version 2.78, 30 September 2007
--------------------------------
-
-- Don't try to predict whether a file is Python source based on the extension.
- Extension-less files are often Pythons scripts. Instead, simply parse the file
- and catch the syntax errors. Hat tip to Ben Finney.
-
-
-Version 2.77, 29 July 2007
---------------------------
-
-- Better packaging.
-
-
-Version 2.76, 23 July 2007
---------------------------
-
-- Now Python 2.5 is *really* fully supported: the body of the new with
- statement is counted as executable.
-
-
-Version 2.75, 22 July 2007
---------------------------
-
-- Python 2.5 now fully supported. The method of dealing with multi-line
- statements is now less sensitive to the exact line that Python reports during
- execution. Pass statements are handled specially so that their disappearance
- during execution won't throw off the measurement.
-
-
-Version 2.7, 21 July 2007
--------------------------
-
-- "#pragma: nocover" is excluded by default.
-
-- Properly ignore docstrings and other constant expressions that appear in the
- middle of a function, a problem reported by Tim Leslie.
-
-- coverage.erase() shouldn't clobber the exclude regex. Change how parallel
- mode is invoked, and fix erase() so that it erases the cache when called
- programmatically.
-
-- In reports, ignore code executed from strings, since we can't do anything
- useful with it anyway.
-
-- Better file handling on Linux, thanks Guillaume Chazarain.
-
-- Better shell support on Windows, thanks Noel O'Boyle.
-
-- Python 2.2 support maintained, thanks Catherine Proulx.
-
-- Minor changes to avoid lint warnings.
-
-
-Version 2.6, 23 August 2006
----------------------------
-
-- Applied Joseph Tate's patch for function decorators.
-
-- Applied Sigve Tjora and Mark van der Wal's fixes for argument handling.
-
-- Applied Geoff Bache's parallel mode patch.
-
-- Refactorings to improve testability. Fixes to command-line logic for parallel
- mode and collect.
-
-
-Version 2.5, 4 December 2005
-----------------------------
-
-- Call threading.settrace so that all threads are measured. Thanks Martin
- Fuzzey.
-
-- Add a file argument to report so that reports can be captured to a different
- destination.
-
-- coverage.py can now measure itself.
-
-- Adapted Greg Rogers' patch for using relative file names, and sorting and
- omitting files to report on.
-
-
-Version 2.2, 31 December 2004
------------------------------
-
-- Allow for keyword arguments in the module global functions. Thanks, Allen.
-
-
-Version 2.1, 14 December 2004
------------------------------
-
-- Return 'analysis' to its original behavior and add 'analysis2'. Add a global
- for 'annotate', and factor it, adding 'annotate_file'.
-
-
-Version 2.0, 12 December 2004
------------------------------
-
-Significant code changes.
-
-- Finding executable statements has been rewritten so that docstrings and
- other quirks of Python execution aren't mistakenly identified as missing
- lines.
-
-- Lines can be excluded from consideration, even entire suites of lines.
-
-- The file system cache of covered lines can be disabled programmatically.
-
-- Modernized the code.
-
-
-Earlier History
----------------
-
-2001-12-04 GDR Created.
-
-2001-12-06 GDR Added command-line interface and source code annotation.
-
-2001-12-09 GDR Moved design and interface to separate documents.
-
-2001-12-10 GDR Open cache file as binary on Windows. Allow simultaneous -e and
--x, or -a and -r.
-
-2001-12-12 GDR Added command-line help. Cache analysis so that it only needs to
-be done once when you specify -a and -r.
-
-2001-12-13 GDR Improved speed while recording. Portable between Python 1.5.2
-and 2.1.1.
-
-2002-01-03 GDR Module-level functions work correctly.
-
-2002-01-07 GDR Update sys.path when running a file with the -x option, so that
-it matches the value the program would get if it were run on its own.
+------------------------------ +Change history for Coverage.py +------------------------------ + + +Next version +------------ + +- The reporting commands (report, annotate, html, and xml) now have a --include + switch to restrict reporting to modules beginning with those prefixes, + similar to the existing --omit switch. Thanks, Zooko. + +- The run command now supports --include and --omit to control what modules it + measures. This can speed execution and reduce the amount of data during + reporting. Thanks Zooko. + +- Reports now have a column of missed line counts rather than executed line + counts, since developers should focus on reducing the missed lines to zero, + rather than increasing the executed lines to varying targets. Once + suggested, this seemed blindingly obvious. + +- Line numbers in HTML source pages are clickable, linking directly to that + line, which is highlighted on arrival. Added a link back to the index page + at the bottom of each HTML page. + +- Programs that call ``os.fork`` will properly collect data from both the child + and parent processes. Use ``coverage run -p`` to get two data files that can + be combined with ``coverage combine``. Fixes `issue 56`_. + +- Doctest text files are no longer recorded in the coverage data, since they + can't be reported anyway. Fixes `issue 61`_. + +- Source files can have more than one dot in them (foo.test.py), and will be + treated properly while reporting. Fixes `issue 46`_. + +- Source files with DOS line endings are now properly tokenized for syntax + coloring on non-DOS machines. Fixes `issue 53`_. + +- Unusual code structure that confused exits from methods with exits from + classes is now properly analyzed. See `issue 62`_. + +.. _issue 46: http://bitbucket.org/ned/coveragepy/issue/46 +.. _issue 53: http://bitbucket.org/ned/coveragepy/issue/53 +.. _issue 56: http://bitbucket.org/ned/coveragepy/issue/56 +.. _issue 61: http://bitbucket.org/ned/coveragepy/issue/61 +.. _issue 62: http://bitbucket.org/ned/coveragepy/issue/62 + + +Version 3.3.1, 6 March 2010 +--------------------------- + +- Using `parallel=True` in .coveragerc file prevented reporting, but now does + not, fixing `issue 49`_. + +- When running your code with "coverage run", if you call `sys.exit()`, + coverage.py will exit with that status code, fixing `issue 50`_. + +.. _issue 49: http://bitbucket.org/ned/coveragepy/issue/49 +.. _issue 50: http://bitbucket.org/ned/coveragepy/issue/50 + + +Version 3.3, 24 February 2010 +----------------------------- + +- Settings are now read from a .coveragerc file. A specific file can be + specified on the command line with --rcfile=FILE. The name of the file can + be programmatically set with the `config_file` argument to the coverage() + constructor, or reading a config file can be disabled with + `config_file=False`. + +- Fixed a problem with nested loops having their branch possibilities + mischaracterized: `issue 39`_. + +- Added coverage.process_start to enable coverage measurement when Python + starts. + +- Parallel data file names now have a random number appended to them in + addition to the machine name and process id. + +- Parallel data files combined with "coverage combine" are deleted after + they're combined, to clean up unneeded files. Fixes `issue 40`_. + +- Exceptions thrown from product code run with "coverage run" are now displayed + without internal coverage.py frames, so the output is the same as when the + code is run without coverage.py. + +- The `data_suffix` argument to the coverage constructor is now appended with + an added dot rather than simply appended, so that .coveragerc files will not + be confused for data files. + +- Python source files that don't end with a newline can now be executed, fixing + `issue 47`_. + +- Added an AUTHORS.txt file. + +.. _issue 39: http://bitbucket.org/ned/coveragepy/issue/39 +.. _issue 40: http://bitbucket.org/ned/coveragepy/issue/40 +.. _issue 47: http://bitbucket.org/ned/coveragepy/issue/47 + + +Version 3.2, 5 December 2009 +---------------------------- + +- Added a --version options on the command line. + + +Version 3.2b4, 1 December 2009 +------------------------------ + +- Branch coverage improvements: + + - The XML report now includes branch information. + +- Click-to-sort HTML report columns are now persisted in a cookie. Viewing + a report will sort it first the way you last had a coverage report sorted. + Thanks, `Chris Adams`_. + +- On Python 3.x, setuptools has been replaced by `Distribute`_. + +.. _Distribute: http://packages.python.org/distribute/ + + +Version 3.2b3, 23 November 2009 +------------------------------- + +- Fixed a memory leak in the C tracer that was introduced in 3.2b1. + +- Branch coverage improvements: + + - Branches to excluded code are ignored. + +- The table of contents in the HTML report is now sortable: click the headers + on any column. Thanks, `Chris Adams`_. + +.. _Chris Adams: http://improbable.org/chris/ + + +Version 3.2b2, 19 November 2009 +------------------------------- + +- Branch coverage improvements: + + - Classes are no longer incorrectly marked as branches: `issue 32`_. + + - "except" clauses with types are no longer incorrectly marked as branches: + `issue 35`_. + +- Fixed some problems syntax coloring sources with line continuations and + source with tabs: `issue 30`_ and `issue 31`_. + +- The --omit option now works much better than before, fixing `issue 14` and + `issue 33`_. Thanks, Danek Duvall. + +.. _issue 14: http://bitbucket.org/ned/coveragepy/issue/14 +.. _issue 30: http://bitbucket.org/ned/coveragepy/issue/30 +.. _issue 31: http://bitbucket.org/ned/coveragepy/issue/31 +.. _issue 32: http://bitbucket.org/ned/coveragepy/issue/32 +.. _issue 33: http://bitbucket.org/ned/coveragepy/issue/33 +.. _issue 35: http://bitbucket.org/ned/coveragepy/issue/35 + + +Version 3.2b1, 10 November 2009 +------------------------------- + +- Branch coverage! + +- XML reporting has file paths that let Cobertura find the source code. + +- The tracer code has changed, it's a few percent faster. + +- Some exceptions reported by the command line interface have been cleaned up + so that tracebacks inside coverage.py aren't shown. Fixes `issue 23`_. + +.. _issue 23: http://bitbucket.org/ned/coveragepy/issue/23 + + +Version 3.1, 4 October 2009 +--------------------------- + +- Source code can now be read from eggs. Thanks, Ross Lawley. Fixes + `issue 25`_. + +.. _issue 25: http://bitbucket.org/ned/coveragepy/issue/25 + + +Version 3.1b1, 27 September 2009 +-------------------------------- + +- Python 3.1 is now supported. + +- Coverage.py has a new command line syntax with sub-commands. This expands + the possibilities for adding features and options in the future. The old + syntax is still supported. Try "coverage help" to see the new commands. + Thanks to Ben Finney for early help. + +- Added an experimental "coverage xml" command for producing coverage reports + in a Cobertura-compatible XML format. Thanks, Bill Hart. + +- Added the --timid option to enable a simpler slower trace function that works + for DecoratorTools projects, including TurboGears. Fixed `issue 12`_ and + `issue 13`_. + +- HTML reports show modules from other directories. Fixed `issue 11`_. + +- HTML reports now display syntax-colored Python source. + +- Programs that change directory will still write .coverage files in the + directory where execution started. Fixed `issue 24`_. + +- Added a "coverage debug" command for getting diagnostic information about the + coverage.py installation. + +.. _issue 11: http://bitbucket.org/ned/coveragepy/issue/11 +.. _issue 12: http://bitbucket.org/ned/coveragepy/issue/12 +.. _issue 13: http://bitbucket.org/ned/coveragepy/issue/13 +.. _issue 24: http://bitbucket.org/ned/coveragepy/issue/24 + + +Version 3.0.1, 7 July 2009 +-------------------------- + +- Removed the recursion limit in the tracer function. Previously, code that + ran more than 500 frames deep would crash. Fixed `issue 9`. + +- Fixed a bizarre problem involving pyexpat, whereby lines following XML parser + invocations could be overlooked. Fixed `issue 10`. + +- On Python 2.3, coverage.py could mis-measure code with exceptions being + raised. This is now fixed. + +- The coverage.py code itself will now not be measured by coverage.py, and no + coverage modules will be mentioned in the nose --with-cover plug-in. Fixed + `issue 8`. + +- When running source files, coverage.py now opens them in universal newline + mode just like Python does. This lets it run Windows files on Mac, for + example. + +.. _issue 9: http://bitbucket.org/ned/coveragepy/issue/9 +.. _issue 10: http://bitbucket.org/ned/coveragepy/issue/10 +.. _issue 8: http://bitbucket.org/ned/coveragepy/issue/8 + + +Version 3.0, 13 June 2009 +------------------------- + +- Fixed the way the Python library was ignored. Too much code was being + excluded the old way. + +- Tabs are now properly converted in HTML reports. Previously indentation was + lost. Fixed `issue 6`. + +- Nested modules now get a proper flat_rootname. Thanks, Christian Heimes. + +.. _issue 6: http://bitbucket.org/ned/coveragepy/issue/6 + + +Version 3.0b3, 16 May 2009 +-------------------------- + +- Added parameters to coverage.__init__ for options that had been set on the + coverage object itself. + +- Added clear_exclude() and get_exclude_list() methods for programmatic + manipulation of the exclude regexes. + +- Added coverage.load() to read previously-saved data from the data file. + +- Improved the finding of code files. For example, .pyc files that have been + installed after compiling are now located correctly. Thanks, Detlev + Offenbach. + +- When using the object API (that is, constructing a coverage() object), data + is no longer saved automatically on process exit. You can re-enable it with + the auto_data=True parameter on the coverage() constructor. The module-level + interface still uses automatic saving. + + +Version 3.0b2, 30 April 2009 +---------------------------- + +HTML reporting, and continued refactoring. + +- HTML reports and annotation of source files: use the new -b (browser) switch. + Thanks to George Song for code, inspiration and guidance. + +- Code in the Python standard library is not measured by default. If you need + to measure standard library code, use the -L command-line switch during + execution, or the cover_pylib=True argument to the coverage() constructor. + +- Source annotation into a directory (-a -d) behaves differently. The + annotated files are named with their hierarchy flattened so that same-named + files from different directories no longer collide. Also, only files in the + current tree are included. + +- coverage.annotate_file is no longer available. + +- Programs executed with -x now behave more as they should, for example, + __file__ has the correct value. + +- .coverage data files have a new pickle-based format designed for better + extensibility. + +- Removed the undocumented cache_file argument to coverage.usecache(). + + +Version 3.0b1, 7 March 2009 +--------------------------- + +Major overhaul. + +- Coverage is now a package rather than a module. Functionality has been split + into classes. + +- The trace function is implemented in C for speed. Coverage runs are now + much faster. Thanks to David Christian for productive micro-sprints and + other encouragement. + +- Executable lines are identified by reading the line number tables in the + compiled code, removing a great deal of complicated analysis code. + +- Precisely which lines are considered executable has changed in some cases. + Therefore, your coverage stats may also change slightly. + +- The singleton coverage object is only created if the module-level functions + are used. This maintains the old interface while allowing better + programmatic use of Coverage. + +- The minimum supported Python version is 2.3. + + +Version 2.85, 14 September 2008 +------------------------------- + +- Add support for finding source files in eggs. Don't check for + morf's being instances of ModuleType, instead use duck typing so that + pseudo-modules can participate. Thanks, Imri Goldberg. + +- Use os.realpath as part of the fixing of file names so that symlinks won't + confuse things. Thanks, Patrick Mezard. + + +Version 2.80, 25 May 2008 +------------------------- + +- Open files in rU mode to avoid line ending craziness. Thanks, Edward Loper. + + +Version 2.78, 30 September 2007 +------------------------------- + +- Don't try to predict whether a file is Python source based on the extension. + Extension-less files are often Pythons scripts. Instead, simply parse the file + and catch the syntax errors. Hat tip to Ben Finney. + + +Version 2.77, 29 July 2007 +-------------------------- + +- Better packaging. + + +Version 2.76, 23 July 2007 +-------------------------- + +- Now Python 2.5 is *really* fully supported: the body of the new with + statement is counted as executable. + + +Version 2.75, 22 July 2007 +-------------------------- + +- Python 2.5 now fully supported. The method of dealing with multi-line + statements is now less sensitive to the exact line that Python reports during + execution. Pass statements are handled specially so that their disappearance + during execution won't throw off the measurement. + + +Version 2.7, 21 July 2007 +------------------------- + +- "#pragma: nocover" is excluded by default. + +- Properly ignore docstrings and other constant expressions that appear in the + middle of a function, a problem reported by Tim Leslie. + +- coverage.erase() shouldn't clobber the exclude regex. Change how parallel + mode is invoked, and fix erase() so that it erases the cache when called + programmatically. + +- In reports, ignore code executed from strings, since we can't do anything + useful with it anyway. + +- Better file handling on Linux, thanks Guillaume Chazarain. + +- Better shell support on Windows, thanks Noel O'Boyle. + +- Python 2.2 support maintained, thanks Catherine Proulx. + +- Minor changes to avoid lint warnings. + + +Version 2.6, 23 August 2006 +--------------------------- + +- Applied Joseph Tate's patch for function decorators. + +- Applied Sigve Tjora and Mark van der Wal's fixes for argument handling. + +- Applied Geoff Bache's parallel mode patch. + +- Refactorings to improve testability. Fixes to command-line logic for parallel + mode and collect. + + +Version 2.5, 4 December 2005 +---------------------------- + +- Call threading.settrace so that all threads are measured. Thanks Martin + Fuzzey. + +- Add a file argument to report so that reports can be captured to a different + destination. + +- coverage.py can now measure itself. + +- Adapted Greg Rogers' patch for using relative file names, and sorting and + omitting files to report on. + + +Version 2.2, 31 December 2004 +----------------------------- + +- Allow for keyword arguments in the module global functions. Thanks, Allen. + + +Version 2.1, 14 December 2004 +----------------------------- + +- Return 'analysis' to its original behavior and add 'analysis2'. Add a global + for 'annotate', and factor it, adding 'annotate_file'. + + +Version 2.0, 12 December 2004 +----------------------------- + +Significant code changes. + +- Finding executable statements has been rewritten so that docstrings and + other quirks of Python execution aren't mistakenly identified as missing + lines. + +- Lines can be excluded from consideration, even entire suites of lines. + +- The file system cache of covered lines can be disabled programmatically. + +- Modernized the code. + + +Earlier History +--------------- + +2001-12-04 GDR Created. + +2001-12-06 GDR Added command-line interface and source code annotation. + +2001-12-09 GDR Moved design and interface to separate documents. + +2001-12-10 GDR Open cache file as binary on Windows. Allow simultaneous -e and +-x, or -a and -r. + +2001-12-12 GDR Added command-line help. Cache analysis so that it only needs to +be done once when you specify -a and -r. + +2001-12-13 GDR Improved speed while recording. Portable between Python 1.5.2 +and 2.1.1. + +2002-01-03 GDR Module-level functions work correctly. + +2002-01-07 GDR Update sys.path when running a file with the -x option, so that +it matches the value the program would get if it were run on its own. diff --git a/MANIFEST.in b/MANIFEST.in index ce340f66..65a60a06 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -2,8 +2,10 @@ include coverage.egg-info/*.* include coverage/*.py include coverage/htmlfiles/*.* +include distribute_setup.py include ez_setup.py include setup.py include README.txt include CHANGES.txt +include AUTHORS.txt prune test @@ -9,10 +9,11 @@ TEST_EGG = test/eggsrc/dist/covtestegg1-0.0.0-py*.egg clean: python test/test_farm.py clean -rm -rf build coverage.egg-info dist htmlcov - -rm -f *.pyd */*.pyd + -rm -f *.pyd */*.pyd -rm -f *.pyc */*.pyc */*/*.pyc */*/*/*.pyc */*/*/*/*.pyc */*/*/*/*/*.pyc -rm -f *.pyo */*.pyo */*/*.pyo */*/*/*.pyo */*/*/*/*.pyo */*/*/*/*/*.pyo -rm -f *.bak */*.bak */*/*.bak */*/*/*.bak */*/*/*/*.bak */*/*/*/*/*.bak + -rm -f *$$py.class */*$$py.class */*/*$$py.class */*/*/*$$py.class */*/*/*/*$$py.class */*/*/*/*/*$$py.class -rm -f coverage/*,cover -rm -f MANIFEST -rm -f .coverage .coverage.* coverage.xml @@ -21,17 +22,16 @@ clean: -rm -f setuptools-*.egg -rm -rf doc/_build/* -LINTABLE = \ - coverage \ - scripts/coverage \ - setup.py \ - test - -lint: +LINTABLE = coverage setup.py test + +lint: -python -x /Python25/Scripts/pylint.bat --rcfile=.pylintrc $(LINTABLE) - python /Python25/Lib/tabnanny.py coverage scripts test setup.py + python /Python25/Lib/tabnanny.py $(LINTABLE) python checkeol.py +pep8: + pep8 --filename=*.py --ignore=E401,E301 --repeat coverage + testready: testdata devinst tests: testready @@ -56,7 +56,7 @@ install: DEVINST_FILE = coverage.egg-info/PKG-INFO devinst: $(DEVINST_FILE) -$(DEVINST_FILE): coverage/tracer.c +$(DEVINST_FILE): coverage/tracer.c -rm coverage/tracer.pyd python setup.py develop @@ -1,9 +1,9 @@ -Coverage: code coverage testing for Python
-
-Coverage measures code coverage, typically during test execution. It uses the
-code analysis tools and tracing hooks provided in the Python standard library
-to determine which lines are executable, and which have been executed.
-
-For more information, see http://nedbatchelder.com/code/coverage
-
-Code repo and issue tracking are at http://bitbucket.org/ned/coveragepy
+Coverage.py: code coverage testing for Python + +Coverage.py measures code coverage, typically during test execution. It uses +the code analysis tools and tracing hooks provided in the Python standard +library to determine which lines are executable, and which have been executed. + +For more information, see http://nedbatchelder.com/code/coverage + +Code repo and issue tracking are at http://bitbucket.org/ned/coveragepy @@ -1,235 +1,241 @@ -Coverage TODO
-
-* 3.2
-
-+ Some kind of indication in the HTML where yellow lines aren't going.
-- Profile the reporting code: it's REALLY slow.
- - parser is doing some redundant work.
-- while TRUE claims to be partial?
-+ Analysis class should do rolling up of stats also (actually Numbers)
-- Update docs for --branch.
-- self.coverage.data.has_arcs is ugly.
-- Branches that never jump to nocover lines shouldn't be marked as partial.
- (see top of test_cogapp for examples)
-- Maybe turning off yellow lines should make those lines green?
-- A missing branch to leave the function shows an annotation of -1.
-- XML report needs to get branch information.
-
-
-* Test-runner plugin
-
-- Support distribute/3k installation, register py.test-entrypoint there
- as well as py-1.1.1 is 2.4-3.1 compatible.
-- Skip registering plugin entrypoints if not running on Jython.
-- Update docs to include a section about the plugin.
-
-
-* Speed
-
-+ C extension collector
-- bitvector in trace extension.
-- Ignore certain modules
-+ Record linenos rather than (file,lineno) pairs in tracer.
-x Tricky swapping of collector like figleaf, pycov, et al. (Don't need to do
- this with C collector).
-- Seems like there should be a faster way to manage all the line number sets in
- CodeParser.raw_parse.
-- If tracing, canonical_filename_cache overlaps with should_trace_cache. Skip
- canonical_filename_cache. Maybe it isn't even worth it...
-
-
-* Accuracy
-
-- Record magic number of module to ensure code hasn't changed
-- Record version of coverage data file, so we can update what's stored there.
-- Record options in coverage data file, so multiple runs are certain to make
- sense together.
-- Do I still need the lines in annotate_file that deal specially with "else"?
-
-
-* Power
-
-+ Branch coverage
- Titus' idea:
- 1: if a:
- 2: b = 2
- 3: c = 3
- if the coverage data shows 1,2,3, it was if-then. if it's 1,3, then the
- missing else was executed.
-- API for getting coverage data.
-- Instruction tracing instead of line tracing.
-- Path tracing (how does this even work?)
-- Count execution of lines
-- Track callers of functions (ala std module trace)
-- Method/Class/Module coverage reporting.
-- .coverage files that can be kept separate, rather than accumulated.
-
-
-* Convenience
-
-- Command line modules should also be directories, meaning all the modules in that
- directory.
-- Why can't a morf also be a string, the name of a module?
-- ignore by module as well as file?
-- Use a .coveragerc file to control Coverage without the programmatic API.
-- Own the nose --with-cover plugin.
-x Why can't you specify execute (-x) and report (-r) in the same invocation?
- Maybe just because -x needs the rest of the command line?
-+ Support 2.3 - 3.1!
- http://pythonology.blogspot.com/2009/02/making-code-run-on-python-20-through-30.html
- http://www.rfk.id.au/blog/entry/preparing-pyenchant-for-python-3
- http://pydev.blogspot.com/2008/11/making-code-work-in-python-2-and-3.html
- + Explicitly set pickle protocol to 2.
-- An inference mode that marks lines as executed if they "must have been" executed:
- class definitions, etc, when coverage is started after the class is defined.
-- Different categories of exclude pragma? So you can enable and disable them
- from the command line, to reconsider exclusions.
-- Reporting on files never touched by coverage (package completeness)
-
-
-* Beauty
-
-+ HTML report
- - Colored bars indicating coverage per file.
- - Package navigation.
- - Rolled-up statistics.
- - Some way to focus in on red and yellow
- - Show only lines near highlights?
- - Jump to next highlight?
- - Clickable column headers on the index page.
- + Syntax coloring in HTML report.
- + Dynamic effects in HTML report.
- + Footer in reports pointing to coverage home page.
- + Baseline grid for linenumber font.
- + Separate out css and HTML.
- - Does it work right with utf-8 source files? http://www.python.org/dev/peps/pep-0263/
-
-
-* Community
-
-+ New docs, rather than pointing to Gareth's
- + Min python version is 2.3.
- - Three phases of work:
- - Collection
- - Analysis
- - Reporting
- - Distinction between:
- - ignore (files not to collect)
- - exclude (lines not to report as missed)
- - omit (files not to report)
- - Changes from coverage 2.x:
- - Bare "except:" lines now count as executable code.
- - Double function decorators: all decorator lines count as executable code.
- - Document the .coverage file format.
- + HTML reporting.
- - References between pages are off:
- - They have <em> tags around them.
- - They use #anchors that don't survive the px->html conversion.
-+ Be sure --help text is complete (-i is missing).
-+ Host the project somewhere with a real bug tracker: bitbucket.org
-+ Point discussion to TIP
-- PEP 8 compliance?
-
-
-* Programmability
-
-+ Don't use sys.exit in CoverageScript.
-+ Remove singleton
- + Initialization of instance variables in the class.
-
-
-* Installation
-
-- How will Coverage package install over coverage.py module?
-- pip can't install it: it reads the coverage html page, and finds the kit link,
- but then can't handle the root-relative link.
-
-
-* Modernization
-
-+ Decide on minimum supported version
- + 2.3
- + Get rid of the basestring protection
- + Use enumerate
- + Use sets instead of dicts
-+ Switch from getopt to optparse.
-+ Get rid of the recursive nonsense.
-+ Docstrings.
-+ Remove huge document-style comments.
-- Better names:
- + self.cache -> self.cache_filename -> CoverageData.filename
- + self.usecache -> CoverageData.use_file
-- More classes:
- - Module munging
- + Coverage data files
-+ Why are some imports at the top of the file, and some in functions?
-+ Get rid of sys.exitfunc use.
-+ True and False (with no backward adaptation: the constants are new in 2.2.1)
-+ Get rid of compiler module
- + In analyzing code
- + In test_coverage.py
-+ Style:
- + lineno
- + filename
-
-
-* Correctness
-
-- What does -p (parallel mode) mean with -e (erase data)?
-
-
-* Tests
-
-+ Switch to a real test runner, like nose.
-+ Test both the C trace function and the Python trace function.
-+ parser.py has no direct tests.
-- Tests about the .coverage file.
-+ Tests about the --long-form of arguments.
-+ Tests about overriding the .coverage filename.
-- Tests about parallel mode.
-+ Tests about assigning a multi-line string.
-- Tests about tricky docstrings.
-+ Coverage test Coverage!
-- Tests that tracing stops after calling stop()
-- More intensive thread testing.
-x Tests about the "import __main__" in cmdline.py
-- What happens if the -x script raises an exception?
-- Test that the kit has all the proper contents.
-
-
-* Release checklist
-
-- Test on:
- - Windows
- - Ubuntu
- - Mac
- - Pythons 2.3, 2.4, 2.5, 2.6, 3.1
-- Version number in coverage/__init__.py
- - 3.1a1, 3.1b1, 3.1c1, 3.1
-- Update CHANGES, including release date.
-- Update docstring in setup.py, including "New in x.y:"
-- Update docs
- - Version, date, and changes in doc/changes.rst
- - Version and date in doc/index.rst
- - Generate new sample_html to get the latest, incl footer version number:
- cd C:\ned\cog\trunk
- rmdir/s/q htmlcov
- coverage run cogapp\test_cogapp.py CogTestsInMemory
- coverage html -i -d htmlcov
- copy htmlcov\*.* C:\ned\coverage\trunk\doc\sample_html
- - Build and publish docs:
- $ make px publish
-- Kits:
- - source .tgz and windows .exe for each Python
- - $ allkits.cmd
-- Update PyPi:
- - $ make pypi
- - Visit http://pypi.python.org/pypi?%3Aaction=pkg_edit&name=coverage and show/hide the proper versions.
- - Upload kits
-- Tag the tree
- - hg tag -m "Coverage 3.0.1" coverage-3.0.1
-- Update nedbatchelder.com
- - Blog post?
-- Update bitbucket:
- - Issue tracker should get new version number in picker.
-- Announce on TIP.
+Coverage TODO + +* Zooko's code + ++ How do include and omit interact? + Include, then omit. ++ Test include and omit during run. +- How do coverage.__init__(omit, include) interact with coverage.report(omit, include)? + - Should cmdline pass omit and include to report/annotate/html/xml? + They've already been given to the constructor. ++ Can you use both omit and include together? + yes. ++ Fix up docstrings. How to deal well with the commonality among all the methods that take omit and include? + +* 3.3 + +- Config file + + A command switch to point to the rc file. + - Write docs + +* Soon + +- Ship the nose and py.test plugin. ++ Better omit handling that ignores files during measurement. + - Deal with ~ in specified paths correctly. +- while TRUE claims to be partial. + - A way to mark lines as partial branches, with a regex? + - Default to "while True:", "while 1:" +- HTML keyboard short cuts + + +* 3.2 + ++ Some kind of indication in the HTML where yellow lines aren't going. +- Profile the reporting code: it's REALLY slow. + - parser is doing some redundant work. ++ Analysis class should do rolling up of stats also (actually Numbers) ++ Update docs for --branch. +- self.coverage.data.has_arcs is ugly. ++ Branches that never jump to nocover lines shouldn't be marked as partial. + (see top of test_cogapp for examples) ++ Maybe turning off yellow lines should make those lines green? ++ A missing branch to leave the function shows an annotation of -1. Now "exit". ++ XML report needs to get branch information. ++ Add branch info to "coverage debug data" ++ Polish up the help, and double-check the docs. + + + +* Test-runner plugin + +- Support distribute/3k installation, register py.test-entrypoint there + as well as py-1.1.1 is 2.4-3.1 compatible. +- Skip registering plugin entrypoints if not running on Jython. +- Update docs to include a section about the plugin. + + +* Speed + ++ C extension collector +- bitvector in trace extension. +- Ignore certain modules ++ Record linenos rather than (file,lineno) pairs in tracer. +x Tricky swapping of collector like figleaf, pycov, et al. (Don't need to do + this with C collector). +- Seems like there should be a faster way to manage all the line number sets in + CodeParser.raw_parse. +- If tracing, canonical_filename_cache overlaps with should_trace_cache. Skip + canonical_filename_cache. Maybe it isn't even worth it... +- Would pre-allocating line number integers make the C tracer faster? It would + use less memory. + + +* Accuracy + +- Record magic number of module to ensure code hasn't changed +- Record version of coverage data file, so we can update what's stored there. +- Record options in coverage data file, so multiple runs are certain to make + sense together. +- Do I still need the lines in annotate_file that deal specially with "else"? + + +* Power + ++ Branch coverage + Titus' idea: + 1: if a: + 2: b = 2 + 3: c = 3 + if the coverage data shows 1,2,3, it was if-then. if it's 1,3, then the + missing else was executed. +- API for getting coverage data. +- Instruction tracing instead of line tracing. +- Path tracing (how does this even work?) +- Count execution of lines +- Track callers of functions (ala std module trace) +- Method/Class/Module coverage reporting. +- .coverage files that can be kept separate, rather than accumulated. +- test/coverage map: http://rbtcollins.wordpress.com/2009/09/16/back-from-hiatus/ + - Similar to figleaf's sections. + + +* Convenience + +- Command line modules should also be directories, meaning all the modules in that + directory. +- Why can't a morf also be a string, the name of a module? +- ignore by module as well as file? ++ Use a .coveragerc file to control Coverage without the programmatic API. +- Own the nose --with-cover plugin. +- Add a --data switch to explicitly control the data file on the command line. +x Why can't you specify execute (-x) and report (-r) in the same invocation? + Maybe just because -x needs the rest of the command line? ++ Support 2.3 - 3.1! + http://pythonology.blogspot.com/2009/02/making-code-run-on-python-20-through-30.html + http://www.rfk.id.au/blog/entry/preparing-pyenchant-for-python-3 + http://pydev.blogspot.com/2008/11/making-code-work-in-python-2-and-3.html + + Explicitly set pickle protocol to 2. +- An inference mode that marks lines as executed if they "must have been" executed: + class definitions, etc, when coverage is started after the class is defined. +- Different categories of exclude pragma? So you can enable and disable them + from the command line, to reconsider exclusions. +- Reporting on files never touched by coverage (package completeness) +- A setup.py command? http://jeetworks.org/node/50 +- Deltas: indicate the change in coverage percentage from the last run. ++ Show lines missing rather than lines run in the reporting, since that's what + you need to focus on. + + +* Beauty + ++ HTML report + - Colored bars indicating coverage per file. + - Package navigation. + - Rolled-up statistics. + - Some way to focus in on red and yellow + - Show only lines near highlights? + - Jump to next highlight? + - Keyboard navigation: N and P + - Cookie for changes to pyfile.html state. + + Clickable column headers on the index page. + + Syntax coloring in HTML report. + + Dynamic effects in HTML report. + + Footer in reports pointing to coverage home page. + + Baseline grid for linenumber font. + + Separate out css and HTML. + - Does it work right with utf-8 source files? http://www.python.org/dev/peps/pep-0263/ + - Use vim modeline to determine tab width: http://vimdoc.sourceforge.net/htmldoc/options.html#modeline + + +* Community + ++ New docs, rather than pointing to Gareth's + + Min python version is 2.3. + - Three phases of work: + - Collection + - Analysis + - Reporting + - Distinction between: + - ignore (files not to collect) + - exclude (lines not to report as missed) + - omit (files not to report) + - Changes from coverage 2.x: + - Bare "except:" lines now count as executable code. + - Double function decorators: all decorator lines count as executable code. + - Document the .coverage file format. + + HTML reporting. + - Much more detail about what's in the report. + - References between pages are off: + - They have <em> tags around them. + - They use #anchors that don't survive the px->html conversion. ++ Be sure --help text is complete (-i is missing). ++ Host the project somewhere with a real bug tracker: bitbucket.org ++ Point discussion to TIP +- PEP 8 compliance? + + +* Programmability + ++ Don't use sys.exit in CoverageScript. ++ Remove singleton + + Initialization of instance variables in the class. + + +* Installation + +- How will Coverage package install over coverage.py module? +- pip can't install it: it reads the coverage html page, and finds the kit link, + but then can't handle the root-relative link. + + +* Modernization + ++ Decide on minimum supported version + + 2.3 + + Get rid of the basestring protection + + Use enumerate + + Use sets instead of dicts ++ Switch from getopt to optparse. ++ Get rid of the recursive nonsense. ++ Docstrings. ++ Remove huge document-style comments. +- Better names: + + self.cache -> self.cache_filename -> CoverageData.filename + + self.usecache -> CoverageData.use_file +- More classes: + - Module munging + + Coverage data files ++ Why are some imports at the top of the file, and some in functions? ++ Get rid of sys.exitfunc use. ++ True and False (with no backward adaptation: the constants are new in 2.2.1) ++ Get rid of compiler module + + In analyzing code + + In test_coverage.py ++ Style: + + lineno + + filename + + +* Correctness + +- What does -p (parallel mode) mean with -e (erase data)? + + +* Tests + ++ Switch to a real test runner, like nose. ++ Test both the C trace function and the Python trace function. ++ parser.py has no direct tests. +- Tests about the .coverage file. ++ Tests about the --long-form of arguments. ++ Tests about overriding the .coverage filename. +- Tests about parallel mode. ++ Tests about assigning a multi-line string. +- Tests about tricky docstrings. ++ Coverage test Coverage! +- Tests that tracing stops after calling stop() +- More intensive thread testing. +x Tests about the "import __main__" in cmdline.py ++ What happens if the -x script raises an exception? +- Test that the kit has all the proper contents. diff --git a/allcoverage.cmd b/allcoverage.cmd new file mode 100644 index 00000000..5d80b4f3 --- /dev/null +++ b/allcoverage.cmd @@ -0,0 +1,19 @@ +@echo off
+make --quiet testdata
+
+del .coverage.*
+set COVERAGE_PROCESS_START=c:\ned\coverage\trunk\covcov.ini
+set COVERAGE_COVERAGE=1
+
+for %%v in (23 24 25 26 27 31) do (
+ call \ned\bin\switchpy %%v
+ python setup.py -q develop
+ set COVERAGE_TEST_TRACER=c
+ python test\coverage_coverage.py run %1 %2 %3 %4 %5 %6 %7 %8 %9
+ del coverage\tracer.pyd
+ )
+
+set COVERAGE_PROCESS_START=
+set COVERAGE_COVERAGE=
+
+python test\coverage_coverage.py report
diff --git a/allkits.cmd b/allkits.cmd index fa75988e..0d000a48 100644 --- a/allkits.cmd +++ b/allkits.cmd @@ -1,17 +1,11 @@ @REM Build all the kits for coverage.py
-call \ned\bin\switchpy 23
-python setup.py bdist_wininst
-call \ned\bin\switchpy 24
-python setup.py bdist_wininst
-call \ned\bin\switchpy 25
-python setup.py bdist_wininst
-call \ned\bin\switchpy 26
-python setup.py bdist_wininst
+@REM Add "upload" onto the command line to also upload.
+for %%v in (23 24 25 26 27 31) do (
+ call \ned\bin\switchpy %%v
+ python setup.py bdist_wininst %1
+ )
+call \ned\bin\switchpy 26
set TAR_OPTIONS=--group=100
-python setup.py sdist --formats=gztar
+python setup.py sdist --formats=gztar %1
set TAR_OPTIONS=
-
-@REM Py3k
-call \ned\bin\switchpy 31
-python setup.py bdist_wininst
diff --git a/alltests.cmd b/alltests.cmd index 73de80ed..759a4f5a 100644 --- a/alltests.cmd +++ b/alltests.cmd @@ -1,44 +1,25 @@ @echo off
+@rem all the Python installs have a .pth pointing to the egg file created by
+@rem 2.5, so install the testdata in 2.5
+call \ned\bin\switchpy 25 quiet
make --quiet testdata
-call \ned\bin\switchpy 23
-python setup.py -q develop
-set COVERAGE_TEST_TRACER=c
-nosetests %1
-del coverage\tracer.pyd
-set COVERAGE_TEST_TRACER=py
-nosetests %1
-
-call \ned\bin\switchpy 24
-python setup.py -q develop
-set COVERAGE_TEST_TRACER=c
-nosetests %1
-del coverage\tracer.pyd
-set COVERAGE_TEST_TRACER=py
-nosetests %1
+for %%v in (23 24 25 26 27) do (
+ call \ned\bin\switchpy %%v
+ python setup.py -q develop
+ set COVERAGE_TEST_TRACER=c
+ nosetests %1 %2 %3 %4 %5 %6 %7 %8 %9
+ del coverage\tracer.pyd
+ set COVERAGE_TEST_TRACER=py
+ nosetests %1 %2 %3 %4 %5 %6 %7 %8 %9
+ )
-call \ned\bin\switchpy 25
-python setup.py -q develop
-set COVERAGE_TEST_TRACER=c
-nosetests %1
-del coverage\tracer.pyd
-set COVERAGE_TEST_TRACER=py
-nosetests %1
-
-call \ned\bin\switchpy 26
+call \ned\bin\switchpy 31
python setup.py -q develop
set COVERAGE_TEST_TRACER=c
-nosetests %1
+python \python31\Scripts\nosetests3 %1 %2 %3 %4 %5 %6 %7 %8 %9
del coverage\tracer.pyd
set COVERAGE_TEST_TRACER=py
-nosetests %1
-
-call \ned\bin\switchpy 31
-python setup.py -q install
-set COVERAGE_TEST_TRACER=c
-python \python31\Scripts\nosetests3 %1
-del \python31\lib\site-packages\coverage\tracer.pyd
-set COVERAGE_TEST_TRACER=py
-python \python31\Scripts\nosetests3 %1
+python \python31\Scripts\nosetests3 %1 %2 %3 %4 %5 %6 %7 %8 %9
make --quiet clean
diff --git a/checkeol.py b/checkeol.py index 8b6f60c0..6464893c 100644 --- a/checkeol.py +++ b/checkeol.py @@ -1,25 +1,37 @@ -# Check files for incorrect newlines +# Check files for incorrect newlines and trailing whitespace. import fnmatch, os -def check_file(fname): +def check_file(fname, crlf=True, trail_white=True): for n, line in enumerate(open(fname, "rb")): - if "\r" in line: - print "%s@%d: CR found" % (fname, n) - return + if crlf: + if "\r" in line: + print "%s@%d: CR found" % (fname, n+1) + return + if trail_white: + line = line[:-1] + if line.rstrip() != line: + print "%s@%d: trailing whitespace found" % (fname, n+1) + return -def check_files(root, patterns): + +def check_files(root, patterns, **kwargs): for root, dirs, files in os.walk(root): for f in files: fname = os.path.join(root, f) for p in patterns: if fnmatch.fnmatch(fname, p): - check_file(fname) + check_file(fname, **kwargs) break - if '.svn' in dirs: - dirs.remove('.svn') + for pattern in ['.svn', '.hg']: + if pattern in dirs: + dirs.remove(pattern) + check_files("coverage", ["*.py"]) -check_files("scripts", ["*"]) -check_files("test", ["*.py", "*,cover"]) +check_files("coverage/htmlfiles", ["*.html", "*.css", "*.js"]) +check_files("test", ["*.py"]) +check_files("test", ["*,cover"], trail_white=False) check_file("setup.py") +check_files("doc", ["*.rst"]) +check_files(".", ["*.txt"]) diff --git a/covcov.ini b/covcov.ini new file mode 100644 index 00000000..9e1733f3 --- /dev/null +++ b/covcov.ini @@ -0,0 +1,16 @@ +# Settings to use when using coverage.py to measure itself.
+[run]
+branch = true
+data_file = c:\ned\coverage\trunk\.coverage
+parallel = true
+
+[report]
+exclude_lines =
+ # pragma: no cover
+ # pragma: recursive coverage
+ def __repr__
+ if __name__ == .__main__.:
+ raise AssertionError
+
+omit = mock, ez_setup, distribute
+ignore_errors = true
diff --git a/coverage/__init__.py b/coverage/__init__.py index 7deeff50..9fd4a8d2 100644 --- a/coverage/__init__.py +++ b/coverage/__init__.py @@ -5,11 +5,11 @@ http://nedbatchelder.com/code/coverage """ -__version__ = "3.2b3" # see detailed history in CHANGES.txt +__version__ = "3.3.2a1" # see detailed history in CHANGES.txt __url__ = "http://nedbatchelder.com/code/coverage" -from coverage.control import coverage +from coverage.control import coverage, process_startup from coverage.data import CoverageData from coverage.cmdline import main, CoverageScript from coverage.misc import CoverageException @@ -26,10 +26,10 @@ _the_coverage = None def _singleton_method(name): """Return a function to the `name` method on a singleton `coverage` object. - + The singleton object is created the first time one of these functions is called. - + """ def wrapper(*args, **kwargs): """Singleton wrapper around a coverage method.""" @@ -55,7 +55,7 @@ annotate = _singleton_method('annotate') # COPYRIGHT AND LICENSE # # Copyright 2001 Gareth Rees. All rights reserved. -# Copyright 2004-2009 Ned Batchelder. All rights reserved. +# Copyright 2004-2010 Ned Batchelder. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are diff --git a/coverage/annotate.py b/coverage/annotate.py index 2fa9d5cf..5cbdd6a0 100644 --- a/coverage/annotate.py +++ b/coverage/annotate.py @@ -6,11 +6,11 @@ from coverage.report import Reporter class AnnotateReporter(Reporter): """Generate annotated source files showing line coverage. - + This reporter creates annotated copies of the measured source files. Each .py file is copied as a .py,cover file, with a left-hand margin annotating each line:: - + > def h(x): - if 0: #pragma: no cover - pass @@ -18,30 +18,38 @@ class AnnotateReporter(Reporter): ! a = 1 > else: > a = 2 - + > h(2) Executed lines use '>', lines not executed use '!', lines excluded from consideration use '-'. - + """ def __init__(self, coverage, ignore_errors=False): super(AnnotateReporter, self).__init__(coverage, ignore_errors) self.directory = None - + blank_re = re.compile(r"\s*(#|$)") else_re = re.compile(r"\s*else\s*:\s*(#|$)") - def report(self, morfs, directory=None, omit_prefixes=None): - """Run the report.""" - self.report_files(self.annotate_file, morfs, directory, omit_prefixes) - + def report(self, morfs, directory=None, omit_prefixes=None, + include_prefixes=None): + """Run the report. + + See `coverage.report()` for arguments. + + """ + self.report_files( + self.annotate_file, morfs, directory, omit_prefixes, + include_prefixes + ) + def annotate_file(self, cu, analysis): """Annotate a single file. - + `cu` is the CodeUnit for the file to annotate. - + """ if not cu.relative: return @@ -77,7 +85,7 @@ class AnnotateReporter(Reporter): if self.blank_re.match(line): dest.write(' ') elif self.else_re.match(line): - # Special logic for lines containing only 'else:'. + # Special logic for lines containing only 'else:'. if i >= len(statements) and j >= len(missing): dest.write('! ') elif i >= len(statements) or j >= len(missing): diff --git a/coverage/backward.py b/coverage/backward.py index 66cfbb96..425bcc6e 100644 --- a/coverage/backward.py +++ b/coverage/backward.py @@ -14,7 +14,6 @@ try: except NameError: from sets import Set as set - # Python 2.3 doesn't have `sorted`. try: sorted = sorted @@ -26,7 +25,6 @@ except NameError: return lst # Pythons 2 and 3 differ on where to get StringIO - try: from cStringIO import StringIO BytesIO = StringIO @@ -34,39 +32,42 @@ except ImportError: from io import StringIO, BytesIO # What's a string called? - try: string_class = basestring except NameError: string_class = str # Where do pickles come from? - try: import cPickle as pickle except ImportError: import pickle # range or xrange? - try: range = xrange except NameError: range = range # Exec is a statement in Py2, a function in Py3 - -if sys.hexversion > 0x03000000: - def exec_function(source, filename, global_map): +if sys.version_info >= (3, 0): + def exec_code_object(code, global_map): """A wrapper around exec().""" - exec(compile(source, filename, "exec"), global_map) + exec(code, global_map) else: # OK, this is pretty gross. In Py2, exec was a statement, but that will # be a syntax error if we try to put it in a Py3 file, even if it is never # executed. So hide it inside an evaluated string literal instead. - eval(compile("""\ -def exec_function(source, filename, global_map): - exec compile(source, filename, "exec") in global_map -""", - "<exec_function>", "exec" - )) + eval( + compile( + "def exec_code_object(code, global_map):\n" + " exec code in global_map\n", + "<exec_function>", "exec" + ) + ) + +# ConfigParser was renamed to the more-standard configparser +try: + import configparser +except ImportError: + import ConfigParser as configparser diff --git a/coverage/bytecode.py b/coverage/bytecode.py index 62a19bae..ab522d6c 100644 --- a/coverage/bytecode.py +++ b/coverage/bytecode.py @@ -14,15 +14,15 @@ class ByteCode(object): class ByteCodes(object): """Iterator over byte codes in `code`. - + Returns `ByteCode` objects. - + """ def __init__(self, code): self.code = code self.offset = 0 - - if sys.hexversion > 0x03000000: + + if sys.version_info >= (3, 0): def __getitem__(self, i): return self.code[i] else: @@ -31,30 +31,30 @@ class ByteCodes(object): def __iter__(self): return self - + def __next__(self): if self.offset >= len(self.code): raise StopIteration - + bc = ByteCode() bc.op = self[self.offset] bc.offset = self.offset - + next_offset = self.offset+1 if bc.op >= opcode.HAVE_ARGUMENT: bc.arg = self[self.offset+1] + 256*self[self.offset+2] next_offset += 2 - + label = -1 if bc.op in opcode.hasjrel: label = next_offset + bc.arg elif bc.op in opcode.hasjabs: label = bc.arg bc.jump_to = label - + bc.next_offset = self.offset = next_offset return bc - + next = __next__ # Py2k uses an old-style non-dunder name. @@ -62,10 +62,10 @@ class CodeObjects(object): """Iterate over all the code objects in `code`.""" def __init__(self, code): self.stack = [code] - + def __iter__(self): return self - + def __next__(self): if self.stack: # We're going to return the code object on the stack, but first diff --git a/coverage/cmdline.py b/coverage/cmdline.py index 1029ad63..cb47690c 100644 --- a/coverage/cmdline.py +++ b/coverage/cmdline.py @@ -1,17 +1,23 @@ """Command-line support for Coverage.""" -import optparse, sys +import optparse, re, sys, traceback +from coverage.backward import sorted # pylint: disable-msg=W0622 from coverage.execfile import run_python_file -from coverage.misc import CoverageException +from coverage.misc import CoverageException, ExceptionDuringRun class Opts(object): """A namespace class for individual options we'll build parsers from.""" - + + append = optparse.Option( + '-a', '--append', action='store_false', dest="erase_first", + help="Append coverage data to .coverage, otherwise it is started " + "clean with each run." + ) branch = optparse.Option( '', '--branch', action='store_true', - help="Measure branch execution. HIGHLY EXPERIMENTAL!" + help="Measure branch coverage in addition to statement coverage." ) directory = optparse.Option( '-d', '--directory', action='store', @@ -26,6 +32,12 @@ class Opts(object): '-i', '--ignore-errors', action='store_true', help="Ignore errors while reading source files." ) + include = optparse.Option( + '', '--include', action='store', + metavar="PRE1,PRE2,...", + help="Include files only when their filename path starts with one of " + "these prefixes." + ) pylib = optparse.Option( '-L', '--pylib', action='store_true', help="Measure coverage even inside the Python installed library, " @@ -55,26 +67,31 @@ class Opts(object): ) parallel_mode = optparse.Option( '-p', '--parallel-mode', action='store_true', - help="Include the machine name and process id in the .coverage " - "data file name." + help="Append the machine name, process id and random number to the " + ".coverage data file name to simplify collecting data from " + "many processes." + ) + rcfile = optparse.Option( + '', '--rcfile', action='store', + help="Specify configuration file. Defaults to '.coveragerc'" ) timid = optparse.Option( '', '--timid', action='store_true', help="Use a simpler but slower trace method. Try this if you get " "seemingly impossible results!" ) - append = optparse.Option( - '-a', '--append', action='store_false', dest="erase_first", - help="Append coverage data to .coverage, otherwise it is started " - "clean with each run." + version = optparse.Option( + '', '--version', action='store_true', + help="Display version information and exit." ) - + + class CoverageOptionParser(optparse.OptionParser, object): """Base OptionParser for coverage. - + Problems don't exit the program. Defaults are initialized for all options. - + """ def __init__(self, *args, **kwargs): @@ -87,26 +104,33 @@ class CoverageOptionParser(optparse.OptionParser, object): directory=None, help=None, ignore_errors=None, + include=None, omit=None, parallel_mode=None, pylib=None, + rcfile=True, show_missing=None, timid=None, erase_first=None, + version=None, ) self.disable_interspersed_args() - self.help_fn = lambda: None + self.help_fn = self.help_noop + + def help_noop(self, error=None, topic=None, parser=None): + """No-op help function.""" + pass class OptionParserError(Exception): """Used to stop the optparse error handler ending the process.""" pass - + def parse_args(self, args=None, options=None): """Call optparse.parse_args, but return a triple: - + (ok, options, args) - + """ try: options, args = \ @@ -114,7 +138,7 @@ class CoverageOptionParser(optparse.OptionParser, object): except self.OptionParserError: return False, None, None return True, options, args - + def error(self, msg): """Override optparse.error so sys.exit doesn't get called.""" self.help_fn(msg) @@ -126,7 +150,7 @@ class ClassicOptionParser(CoverageOptionParser): def __init__(self): super(ClassicOptionParser, self).__init__() - + self.add_action('-a', '--annotate', 'annotate') self.add_action('-b', '--html', 'html') self.add_action('-c', '--combine', 'combine') @@ -143,6 +167,7 @@ class ClassicOptionParser(CoverageOptionParser): Opts.old_omit, Opts.parallel_mode, Opts.timid, + Opts.version, ]) def add_action(self, dash, dashdash, action_code): @@ -151,7 +176,7 @@ class ClassicOptionParser(CoverageOptionParser): callback=self._append_action ) option.action_code = action_code - + def _append_action(self, option, opt_unused, value_unused, parser): """Callback for an option that adds to the `actions` list.""" parser.values.actions.append(option.action_code) @@ -159,19 +184,19 @@ class ClassicOptionParser(CoverageOptionParser): class CmdOptionParser(CoverageOptionParser): """Parse one of the new-style commands for coverage.py.""" - + def __init__(self, action, options=None, defaults=None, usage=None, cmd=None, description=None ): """Create an OptionParser for a coverage command. - + `action` is the slug to put into `options.actions`. `options` is a list of Option's for the command. `defaults` is a dict of default value for options. `usage` is the usage string to display in help. `cmd` is the command name, if different than `action`. `description` is the description of the command, for the help text. - + """ if usage: usage = "%prog " + usage @@ -190,6 +215,10 @@ class CmdOptionParser(CoverageOptionParser): # results, and they will compare equal to objects. return (other == "<CmdOptionParser:%s>" % self.cmd) +GLOBAL_ARGS = [ + Opts.rcfile, + Opts.help, + ] CMDS = { 'annotate': CmdOptionParser("annotate", @@ -197,15 +226,35 @@ CMDS = { Opts.directory, Opts.ignore_errors, Opts.omit, - Opts.help, - ], + Opts.include, + ] + GLOBAL_ARGS, usage = "[options] [modules]", description = "Make annotated copies of the given files, marking " "statements that are executed with > and statements that are " "missed with !." ), - 'help': CmdOptionParser("help", [Opts.help], + 'combine': CmdOptionParser("combine", GLOBAL_ARGS, + usage = " ", + description = "Combine data from multiple coverage files collected " + "with 'run -p'. The combined results are written to a single " + "file representing the union of the data." + ), + + 'debug': CmdOptionParser("debug", GLOBAL_ARGS, + usage = "<topic>", + description = "Display information on the internals of coverage.py, " + "for diagnosing problems. " + "Topics are 'data' to show a summary of the collected data, " + "or 'sys' to show installation information." + ), + + 'erase': CmdOptionParser("erase", GLOBAL_ARGS, + usage = " ", + description = "Erase previously collected coverage data." + ), + + 'help': CmdOptionParser("help", GLOBAL_ARGS, usage = "[command]", description = "Describe how to use coverage.py" ), @@ -215,43 +264,23 @@ CMDS = { Opts.directory, Opts.ignore_errors, Opts.omit, - Opts.help, - ], + Opts.include, + ] + GLOBAL_ARGS, usage = "[options] [modules]", description = "Create an HTML report of the coverage of the files. " "Each file gets its own page, with the source decorated to show " "executed, excluded, and missed lines." ), - - 'combine': CmdOptionParser("combine", [Opts.help], - usage = " ", - description = "Combine data from multiple coverage files collected " - "with 'run -p'. The combined results are stored into a single " - "file representing the union of the coverage." - ), - - 'debug': CmdOptionParser("debug", [Opts.help], - usage = "<topic>", - description = "Display information the internals of coverage.py, " - "for diagnosing problems. " - "Topics are 'data' to show a summary of the data collected in " - ".coverage, or 'sys' to show installation information." - ), - - 'erase': CmdOptionParser("erase", [Opts.help], - usage = " ", - description = "Erase previously collected coverage data." - ), 'report': CmdOptionParser("report", [ Opts.ignore_errors, Opts.omit, + Opts.include, Opts.show_missing, - Opts.help, - ], + ] + GLOBAL_ARGS, usage = "[options] [modules]", - description = "Report coverage stats on modules." + description = "Report coverage statistics on modules." ), 'run': CmdOptionParser("execute", @@ -261,21 +290,22 @@ CMDS = { Opts.pylib, Opts.parallel_mode, Opts.timid, - Opts.help, - ], - defaults = {'erase_first':True}, + Opts.omit, + Opts.include, + ] + GLOBAL_ARGS, + defaults = {'erase_first': True}, cmd = "run", usage = "[options] <pyfile> [program options]", - description = "Run a python program, measuring code execution." + description = "Run a Python program, measuring code execution." ), - + 'xml': CmdOptionParser("xml", [ Opts.ignore_errors, Opts.omit, + Opts.include, Opts.output_xml, - Opts.help, - ], + ] + GLOBAL_ARGS, cmd = "xml", defaults = {'outfile': 'coverage.xml'}, usage = "[options] [modules]", @@ -286,9 +316,10 @@ CMDS = { OK, ERR = 0, 1 + class CoverageScript(object): """The command-line interface to Coverage.""" - + def __init__(self, _covpkg=None, _run_python_file=None, _help_fn=None): # _covpkg is for dependency injection, so we can test this code. if _covpkg: @@ -296,13 +327,13 @@ class CoverageScript(object): else: import coverage self.covpkg = coverage - + # _run_python_file is for dependency injection also. self.run_python_file = _run_python_file or run_python_file - + # _help_fn is for dependency injection. self.help_fn = _help_fn or self.help - + self.coverage = None def help(self, error=None, topic=None, parser=None): @@ -315,7 +346,6 @@ class CoverageScript(object): print(parser.format_help().strip()) else: # Parse out the topic we want from HELP_TOPICS - import re topic_list = re.split("(?m)^=+ (\w+) =+$", HELP_TOPICS) topics = dict(zip(topic_list[1::2], topic_list[2::2])) help_msg = topics.get(topic, '').strip() @@ -326,14 +356,14 @@ class CoverageScript(object): def command_line(self, argv): """The bulk of the command line interface to Coverage. - + `argv` is the argument list to process. Returns 0 if all is well, 1 if something went wrong. """ # Collect the command-line options. - + if not argv: self.help_fn(topic='minimum_help') return OK @@ -375,6 +405,11 @@ class CoverageScript(object): self.help_fn(topic='help') return OK + # Handle version. + if options.version: + self.help_fn(topic='version') + return OK + # Check for conflicts and problems in the options. for i in ['erase', 'execute']: for j in ['annotate', 'html', 'report', 'combine']: @@ -399,17 +434,28 @@ class CoverageScript(object): if not args_allowed and args: self.help_fn("Unexpected arguments: %s" % " ".join(args)) return ERR - + if 'execute' in options.actions and not args: self.help_fn("Nothing to do.") return ERR - + + # Listify the list options. + omit = None + if options.omit: + omit = options.omit.split(',') + include = None + if options.include: + include = options.include.split(',') + # Do something. self.coverage = self.covpkg.coverage( - data_suffix = bool(options.parallel_mode), + data_suffix = options.parallel_mode, cover_pylib = options.pylib, timid = options.timid, branch = options.branch, + config_file = options.rcfile, + omit_prefixes = omit, + include_prefixes = include, ) if 'debug' in options.actions: @@ -429,9 +475,12 @@ class CoverageScript(object): elif info == 'data': print("-- data ---------------------------------------") self.coverage.load() + print("path: %s" % self.coverage.data.filename) + print("has_arcs: %r" % self.coverage.data.has_arcs()) summary = self.coverage.data.summary(fullpath=True) if summary: filenames = sorted(summary.keys()) + print("\n%d files:" % len(filenames)) for f in filenames: print("%s: %d lines" % (f, summary[f])) else: @@ -465,11 +514,9 @@ class CoverageScript(object): 'ignore_errors': options.ignore_errors, } - omit = None - if options.omit: - omit = options.omit.split(',') report_args['omit_prefixes'] = omit - + report_args['include_prefixes'] = include + if 'report' in options.actions: self.coverage.report( show_missing=options.show_missing, **report_args) @@ -481,8 +528,6 @@ class CoverageScript(object): directory=options.directory, **report_args) if 'xml' in options.actions: outfile = options.outfile - if outfile == '-': - outfile = None self.coverage.xml_report(outfile=outfile, **report_args) return OK @@ -491,7 +536,7 @@ class CoverageScript(object): HELP_TOPICS = r""" == classic ==================================================================== -Coverage version %(__version__)s +Coverage.py version %(__version__)s Measure, collect, and report on code coverage in Python programs. Usage: @@ -537,14 +582,14 @@ Coverage data is saved in the file .coverage by default. Set the COVERAGE_FILE environment variable to save it somewhere else. == help ======================================================================= -Coverage version %(__version__)s +Coverage.py, version %(__version__)s Measure, collect, and report on code coverage in Python programs. usage: coverage <command> [options] [args] Commands: annotate Annotate source files with execution information. - combine Combine a number of data files. + combine Combine a number of data files. erase Erase previously collected coverage data. help Get help on using coverage.py. html Create an HTML report. @@ -559,19 +604,36 @@ For more information, see %(__url__)s == minimum_help =============================================================== Code coverage for Python. Use 'coverage help' for help. +== version ==================================================================== +Coverage.py, version %(__version__)s. %(__url__)s + """ -def main(): +def main(argv=None): """The main entrypoint to Coverage. - + This is installed as the script entrypoint. - + """ + if argv is None: + argv = sys.argv[1:] try: - status = CoverageScript().command_line(sys.argv[1:]) + status = CoverageScript().command_line(argv) + except ExceptionDuringRun: + # An exception was caught while running the product code. The + # sys.exc_info() return tuple is packed into an ExceptionDuringRun + # exception. + _, err, _ = sys.exc_info() + traceback.print_exception(*err.args) + status = ERR except CoverageException: + # A controlled error inside coverage.py: print the message to the user. _, err, _ = sys.exc_info() print(err) status = ERR + except SystemExit: + # The user called `sys.exit()`. Exit with their status code. + _, err, _ = sys.exc_info() + status = err.args[0] return status diff --git a/coverage/codeunit.py b/coverage/codeunit.py index 28fa0551..01708957 100644 --- a/coverage/codeunit.py +++ b/coverage/codeunit.py @@ -6,22 +6,27 @@ from coverage.backward import string_class, StringIO from coverage.misc import CoverageException -def code_unit_factory(morfs, file_locator, omit_prefixes=None): +def code_unit_factory( + morfs, file_locator, omit_prefixes=None, include_prefixes=None + ): """Construct a list of CodeUnits from polymorphic inputs. - + `morfs` is a module or a filename, or a list of same. + `file_locator` is a FileLocator that can help resolve filenames. - `omit_prefixes` is a list of prefixes. CodeUnits that match those prefixes - will be omitted from the list. - + + `include_prefixes` is a list of prefixes. Only CodeUnits that match those + prefixes will be included in the list. `omit_prefixes` is a list of + prefixes to omit from the list. + Returns a list of CodeUnit objects. - + """ # Be sure we have a list. if not isinstance(morfs, (list, tuple)): morfs = [morfs] - + # On Windows, the shell doesn't expand wildcards. Do it here. globbed = [] for morf in morfs: @@ -32,7 +37,18 @@ def code_unit_factory(morfs, file_locator, omit_prefixes=None): morfs = globbed code_units = [CodeUnit(morf, file_locator) for morf in morfs] - + + if include_prefixes: + assert not isinstance(include_prefixes, string_class) # common mistake + prefixes = [file_locator.abs_file(p) for p in include_prefixes] + filtered = [] + for cu in code_units: + for prefix in prefixes: + if cu.filename.startswith(prefix): + filtered.append(cu) + break + code_units = filtered + if omit_prefixes: code_units = omit_filter(omit_prefixes, code_units) @@ -57,13 +73,13 @@ def omit_filter(omit_prefixes, code_units): class CodeUnit(object): """Code unit: a filename or module. - + Instance attributes: - + `name` is a human-readable name for this code unit. `filename` is the os path from which we can read the source. `relative` is a boolean. - + """ def __init__(self, morf, file_locator): @@ -98,40 +114,40 @@ class CodeUnit(object): # Annoying comparison operators. Py3k wants __lt__ etc, and Py2k needs all # of them defined. - + def __lt__(self, other): return self.name < other.name - + def __le__(self, other): return self.name <= other.name def __eq__(self, other): return self.name == other.name - + def __ne__(self, other): return self.name != other.name def __gt__(self, other): return self.name > other.name - + def __ge__(self, other): return self.name >= other.name def flat_rootname(self): """A base for a flat filename to correspond to this code unit. - + Useful for writing files about the code where you want all the files in the same directory, but need to differentiate same-named files from different directories. - + For example, the file a/b/c.py might return 'a_b_c' - + """ if self.modname: return self.modname.replace('.', '_') else: - root = os.path.splitdrive(os.path.splitext(self.name)[0])[1] - return root.replace('\\', '_').replace('/', '_') + root = os.path.splitdrive(self.name)[1] + return root.replace('\\', '_').replace('/', '_').replace('.', '_') def source_file(self): """Return an open file for reading the source of the code unit.""" @@ -143,7 +159,7 @@ class CodeUnit(object): source = self.file_locator.get_zip_data(self.filename) if source is not None: return StringIO(source) - + # Couldn't find source. raise CoverageException( "No source for code %r." % self.filename diff --git a/coverage/collector.py b/coverage/collector.py index 1a831c19..06ccda7e 100644 --- a/coverage/collector.py +++ b/coverage/collector.py @@ -12,7 +12,7 @@ except ImportError: class PyTracer(object): """Python implementation of the raw data tracer.""" - + # Because of poor implementations of trace-function-manipulating tools, # the Python trace function must be kept very simple. In particular, there # must be only one function ever set as the trace function, both through @@ -37,22 +37,24 @@ class PyTracer(object): self.last_line = 0 self.data_stack = [] self.last_exc_back = None + self.last_exc_firstlineno = 0 self.arcs = False def _trace(self, frame, event, arg_unused): """The trace function passed to sys.settrace.""" - + #print "trace event: %s %r @%d" % ( # event, frame.f_code.co_filename, frame.f_lineno) - + if self.last_exc_back: if frame == self.last_exc_back: # Someone forgot a return event. if self.arcs and self.cur_file_data: - self.cur_file_data[(self.last_line, -1)] = None + pair = (self.last_line, -self.last_exc_firstlineno) + self.cur_file_data[pair] = None self.cur_file_data, self.last_line = self.data_stack.pop() self.last_exc_back = None - + if event == 'call': # Entering a new function context. Decide if we should trace # in this file. @@ -65,6 +67,8 @@ class PyTracer(object): self.cur_file_data = self.data[tracename] else: self.cur_file_data = None + # Set the last_line to -1 because the next arc will be entering a + # code block, indicated by (-1, n). self.last_line = -1 elif event == 'line': # Record an executed line. @@ -78,14 +82,16 @@ class PyTracer(object): self.last_line = frame.f_lineno elif event == 'return': if self.arcs and self.cur_file_data: - self.cur_file_data[(self.last_line, -1)] = None + first = frame.f_code.co_firstlineno + self.cur_file_data[(self.last_line, -first)] = None # Leaving this function, pop the filename stack. self.cur_file_data, self.last_line = self.data_stack.pop() elif event == 'exception': #print "exc", self.last_line, frame.f_lineno self.last_exc_back = frame.f_back + self.last_exc_firstlineno = frame.f_code.co_firstlineno return self._trace - + def start(self): """Start this Tracer.""" sys.settrace(self._trace) @@ -94,22 +100,27 @@ class PyTracer(object): """Stop this Tracer.""" sys.settrace(None) + def get_stats(self): + """Return a dictionary of statistics, or None.""" + return None + class Collector(object): """Collects trace data. - Creates a Tracer object for each thread, since they track stack information. - Each Tracer points to the same shared data, contributing traced data points. - + Creates a Tracer object for each thread, since they track stack + information. Each Tracer points to the same shared data, contributing + traced data points. + When the Collector is started, it creates a Tracer for the current thread, and installs a function to create Tracers for each new thread started. When the Collector is stopped, all active Tracers are stopped. - + Threads started while the Collector is stopped will never have Tracers associated with them. - + """ - + # The stack of active Collectors. Collectors are added here when started, # and popped when stopped. Collectors on the stack are paused when not # the top, and resumed when they become the top again. @@ -117,20 +128,20 @@ class Collector(object): def __init__(self, should_trace, timid, branch): """Create a collector. - + `should_trace` is a function, taking a filename, and returning a canonicalized filename, or False depending on whether the file should be traced or not. - + If `timid` is true, then a slower simpler trace function will be used. This is important for some environments where manipulation of tracing functions make the faster more sophisticated trace function not operate properly. - + If `branch` is true, then branches will be measured. This involves collecting data on which statements followed each other (arcs). Use `get_arc_data` to get the arc data. - + """ self.should_trace = should_trace self.branch = branch @@ -144,6 +155,9 @@ class Collector(object): # trace function. self._trace_class = Tracer or PyTracer + def __repr__(self): + return "<Collector at 0x%x>" % id(self) + def tracer_name(self): """Return the class name of the tracer we're using.""" return self._trace_class.__name__ @@ -153,7 +167,7 @@ class Collector(object): # A dictionary mapping filenames to dicts with linenumber keys, # or mapping filenames to dicts with linenumber pairs as keys. self.data = {} - + # A cache of the results from should_trace, the decision about whether # to trace execution in a file. A dict of filename to (filename or # False). @@ -192,6 +206,7 @@ class Collector(object): if self._collectors: self._collectors[-1].pause() self._collectors.append(self) + #print >>sys.stderr, "Started: %r" % self._collectors # Install the tracer on this thread. self._start_tracer() # Install our installation tracer in threading, to jump start other @@ -200,12 +215,13 @@ class Collector(object): def stop(self): """Stop collecting trace information.""" + #print >>sys.stderr, "Stopping: %r" % self._collectors assert self._collectors assert self._collectors[-1] is self - self.pause() + self.pause() self.tracers = [] - + # Remove this Collector from the stack, and resume the one underneath # (if any). self._collectors.pop() @@ -216,8 +232,13 @@ class Collector(object): """Pause tracing, but be prepared to `resume`.""" for tracer in self.tracers: tracer.stop() + stats = tracer.get_stats() + if stats: + print("\nCoverage.py tracer stats:") + for k in sorted(stats.keys()): + print("%16s: %s" % (k, stats[k])) threading.settrace(None) - + def resume(self): """Resume tracing after a `pause`.""" for tracer in self.tracers: @@ -226,9 +247,9 @@ class Collector(object): def get_line_data(self): """Return the line data collected. - + Data is { filename: { lineno: None, ...}, ...} - + """ if self.branch: # If we were measuring branches, then we have to re-build the dict @@ -236,7 +257,7 @@ class Collector(object): line_data = {} for f, arcs in self.data.items(): line_data[f] = ldf = {} - for l1, _ in arcs: + for l1, _ in list(arcs.keys()): if l1: ldf[l1] = None return line_data @@ -245,7 +266,7 @@ class Collector(object): def get_arc_data(self): """Return the arc data collected. - + Data is { filename: { (l1, l2): None, ...}, ...} Note that no data is collected or returned if the Collector wasn't diff --git a/coverage/config.py b/coverage/config.py new file mode 100644 index 00000000..133444d8 --- /dev/null +++ b/coverage/config.py @@ -0,0 +1,112 @@ +"""Config file for coverage.py""" + +import os +from coverage.backward import configparser # pylint: disable-msg=W0622 + + +class CoverageConfig(object): + """Coverage.py configuration. + + The attributes of this class are the various settings that control the + operation of coverage.py. + + """ + + def __init__(self): + """Initialize the configuration attributes to their defaults.""" + # Defaults for [run] + self.branch = False + self.cover_pylib = False + self.data_file = ".coverage" + self.parallel = False + self.timid = False + + # Defaults for [report] + self.exclude_list = ['(?i)# *pragma[: ]*no *cover'] + self.ignore_errors = False + self.omit_prefixes = None + self.include_prefixes = None + + # Defaults for [html] + self.html_dir = "htmlcov" + + # Defaults for [xml] + self.xml_output = "coverage.xml" + + def from_environment(self, env_var): + """Read configuration from the `env_var` environment variable.""" + # Timidity: for nose users, read an environment variable. This is a + # cheap hack, since the rest of the command line arguments aren't + # recognized, but it solves some users' problems. + env = os.environ.get(env_var, '') + if env: + self.timid = ('--timid' in env) + + def from_args(self, **kwargs): + """Read config values from `kwargs`.""" + for k, v in kwargs.items(): + if v is not None: + setattr(self, k, v) + + def from_file(self, *files): + """Read configuration from .rc files. + + Each argument in `files` is a file name to read. + + """ + cp = configparser.RawConfigParser() + cp.read(files) + + # [run] + if cp.has_option('run', 'branch'): + self.branch = cp.getboolean('run', 'branch') + if cp.has_option('run', 'cover_pylib'): + self.cover_pylib = cp.getboolean('run', 'cover_pylib') + if cp.has_option('run', 'data_file'): + self.data_file = cp.get('run', 'data_file') + if cp.has_option('run', 'parallel'): + self.parallel = cp.getboolean('run', 'parallel') + if cp.has_option('run', 'timid'): + self.timid = cp.getboolean('run', 'timid') + if cp.has_option('run', 'omit'): + self.omit_prefixes = self.get_list(cp, 'run', 'omit') + if cp.has_option('run', 'include'): + self.include_prefixes = self.get_list(cp, 'run', 'include') + + # [report] + if cp.has_option('report', 'exclude_lines'): + # exclude_lines is a list of lines, leave out the blank ones. + exclude_list = cp.get('report', 'exclude_lines') + self.exclude_list = list(filter(None, exclude_list.split('\n'))) + if cp.has_option('report', 'ignore_errors'): + self.ignore_errors = cp.getboolean('report', 'ignore_errors') + if cp.has_option('report', 'omit'): + self.omit_prefixes = self.get_list(cp, 'report', 'omit') + if cp.has_option('report', 'include'): + self.include_prefixes = self.get_list(cp, 'report', 'include') + + # [html] + if cp.has_option('html', 'directory'): + self.html_dir = cp.get('html', 'directory') + + # [xml] + if cp.has_option('xml', 'output'): + self.xml_output = cp.get('xml', 'output') + + def get_list(self, cp, section, option): + """Read a list of strings from the ConfigParser `cp`. + + The value of `section` and `option` is treated as a comma- and newline- + separated list of strings. Each value is stripped of whitespace. + + Returns the list of strings. + + """ + value_list = cp.get(section, option) + values = [] + for value_line in value_list.split('\n'): + for value in value_line.split(','): + value = value.strip() + if value: + values.append(value) + return values diff --git a/coverage/control.py b/coverage/control.py index 23740ca4..d07abaf3 100644 --- a/coverage/control.py +++ b/coverage/control.py @@ -1,14 +1,16 @@ """Core control stuff for Coverage.""" -import os, socket +import atexit, os, random, socket, sys from coverage.annotate import AnnotateReporter -from coverage.backward import string_class # pylint: disable-msg=W0622 +from coverage.backward import string_class from coverage.codeunit import code_unit_factory, CodeUnit from coverage.collector import Collector +from coverage.config import CoverageConfig from coverage.data import CoverageData from coverage.files import FileLocator from coverage.html import HtmlReporter +from coverage.misc import bool_or_none from coverage.results import Analysis from coverage.summary import SummaryReporter from coverage.xmlreport import XmlReporter @@ -17,9 +19,9 @@ class coverage(object): """Programmatic access to Coverage. To use:: - + from coverage import coverage - + cov = coverage() cov.start() #.. blah blah (run your code) blah blah .. @@ -28,82 +30,130 @@ class coverage(object): """ - def __init__(self, data_file=None, data_suffix=False, cover_pylib=False, - auto_data=False, timid=False, branch=False): - """Create a new coverage measurement context. - + def __init__(self, data_file=None, data_suffix=None, cover_pylib=None, + auto_data=False, timid=None, branch=None, config_file=True, + omit_prefixes=None, include_prefixes=None): + """ `data_file` is the base name of the data file to use, defaulting to - ".coverage". `data_suffix` is appended to `data_file` to create the - final file name. If `data_suffix` is simply True, then a suffix is - created with the machine and process identity included. - + ".coverage". `data_suffix` is appended (with a dot) to `data_file` to + create the final file name. If `data_suffix` is simply True, then a + suffix is created with the machine and process identity included. + `cover_pylib` is a boolean determining whether Python code installed with the Python interpreter is measured. This includes the Python standard library and any packages installed with the interpreter. - + If `auto_data` is true, then any existing data file will be read when coverage measurement starts, and data will be saved automatically when measurement stops. - + If `timid` is true, then a slower and simpler trace function will be used. This is important for some environments where manipulation of tracing functions breaks the faster trace function. - - If `branch` is true, then measure branch execution. + + If `branch` is true, then branch coverage will be measured in addition + to the usual statement coverage. + + `config_file` determines what config file to read. If it is a string, + it is the name of the config file to read. If it is True, then a + standard file is read (".coveragerc"). If it is False, then no file is + read. + + `omit_prefixes` and `include_prefixes` are lists of filename prefixes. + Files that match `include_prefixes` will be measured, files that match + `omit_prefixes` will not. """ from coverage import __version__ - - self.cover_pylib = cover_pylib + + # Build our configuration from a number of sources: + # 1: defaults: + self.config = CoverageConfig() + + # 2: from the coveragerc file: + if config_file: + if config_file is True: + config_file = ".coveragerc" + self.config.from_file(config_file) + + # 3: from environment variables: + self.config.from_environment('COVERAGE_OPTIONS') + env_data_file = os.environ.get('COVERAGE_FILE') + if env_data_file: + self.config.data_file = env_data_file + + # 4: from constructor arguments: + self.config.from_args( + data_file=data_file, cover_pylib=cover_pylib, timid=timid, + branch=branch, parallel=bool_or_none(data_suffix), + omit_prefixes=omit_prefixes, + include_prefixes=include_prefixes + ) + self.auto_data = auto_data - + self.atexit_registered = False + self.exclude_re = "" - self.exclude_list = [] - + self._compile_exclude() + self.file_locator = FileLocator() - - # Timidity: for nose users, read an environment variable. This is a - # cheap hack, since the rest of the command line arguments aren't - # recognized, but it solves some users' problems. - timid = timid or ('--timid' in os.environ.get('COVERAGE_OPTIONS', '')) + + self.omit_prefixes = self._abs_files(self.config.omit_prefixes) + self.include_prefixes = self._abs_files(self.config.include_prefixes) + self.collector = Collector( - self._should_trace, timid=timid, branch=branch + self._should_trace, timid=self.config.timid, + branch=self.config.branch ) - # Create the data file. - if data_suffix: + # Suffixes are a bit tricky. We want to use the data suffix only when + # collecting data, not when combining data. So we save it as + # `self.run_suffix` now, and promote it to `self.data_suffix` if we + # find that we are collecting data later. + if data_suffix or self.config.parallel: if not isinstance(data_suffix, string_class): - # if data_suffix=True, use .machinename.pid - data_suffix = ".%s.%s" % (socket.gethostname(), os.getpid()) + # if data_suffix=True, use .machinename.pid.random + data_suffix = True else: data_suffix = None + self.data_suffix = None + self.run_suffix = data_suffix + # Create the data file. We do this at construction time so that the + # data file will be written into the directory where the process + # started rather than wherever the process eventually chdir'd to. self.data = CoverageData( - basename=data_file, suffix=data_suffix, + basename=self.config.data_file, collector="coverage v%s" % __version__ ) - # The default exclude pattern. - self.exclude('# *pragma[: ]*[nN][oO] *[cC][oO][vV][eE][rR]') - # The prefix for files considered "installed with the interpreter". - if not self.cover_pylib: + if not self.config.cover_pylib: + # Look at where the "os" module is located. That's the indication + # for "installed with the interpreter". os_file = self.file_locator.canonical_filename(os.__file__) self.pylib_prefix = os.path.split(os_file)[0] + # To avoid tracing the coverage code itself, we skip anything located + # where we are. here = self.file_locator.canonical_filename(__file__) self.cover_prefix = os.path.split(here)[0] def _should_trace(self, filename, frame): """Decide whether to trace execution in `filename` - + + This function is called from the trace function. As each new file name + is encountered, this function determines whether it is traced or not. + Returns a canonicalized filename if it should be traced, False if it should not. - + """ - if filename == '<string>': - # There's no point in ever tracing string executions, we can't do - # anything with the data later anyway. + if filename[0] == '<': + # Lots of non-file execution is represented with artificial + # filenames like "<string>", "<doctest readme.txt[0]>", or + # "<exec_function>". Don't ever trace these executions, since we + # can't do anything with the data later anyway. return False # Compiled Python files have two filenames: frame.f_code.co_filename is @@ -123,7 +173,7 @@ class coverage(object): # If we aren't supposed to trace installed code, then check if this is # near the Python standard library and skip it if so. - if not self.cover_pylib: + if not self.config.cover_pylib: if canonical.startswith(self.pylib_prefix): return False @@ -132,6 +182,17 @@ class coverage(object): if canonical.startswith(self.cover_prefix): return False + # Check the file against the include and omit prefixes. + if self.include_prefixes: + for prefix in self.include_prefixes: + if canonical.startswith(prefix): + break + else: + return False + for prefix in self.omit_prefixes: + if canonical.startswith(prefix): + return False + return canonical # To log what should_trace returns, change this to "if 1:" @@ -143,11 +204,16 @@ class coverage(object): print("should_trace: %r -> %r" % (filename, ret)) return ret + def _abs_files(self, files): + """Return a list of absolute file names for the names in `files`.""" + files = files or [] + return [self.file_locator.abs_file(f) for f in files] + def use_cache(self, usecache): """Control the use of a data file (incorrectly called a cache). - + `usecache` is true or false, whether to read and write data on disk. - + """ self.data.usefile(usecache) @@ -155,16 +221,21 @@ class coverage(object): """Load previously-collected coverage data from the data file.""" self.collector.reset() self.data.read() - + def start(self): """Start measuring code coverage.""" + if self.run_suffix: + # Calling start() means we're running code, so use the run_suffix + # as the data_suffix when we eventually save the data. + self.data_suffix = self.run_suffix if self.auto_data: self.load() # Save coverage data when Python exits. - import atexit - atexit.register(self.save) + if not self.atexit_registered: + atexit.register(self.save) + self.atexit_registered = True self.collector.start() - + def stop(self): """Stop measuring code coverage.""" self.collector.stop() @@ -172,47 +243,61 @@ class coverage(object): def erase(self): """Erase previously-collected coverage data. - + This removes the in-memory data collected in this session as well as discarding the data file. - + """ self.collector.reset() self.data.erase() def clear_exclude(self): """Clear the exclude list.""" - self.exclude_list = [] + self.config.exclude_list = [] self.exclude_re = "" def exclude(self, regex): """Exclude source lines from execution consideration. - + `regex` is a regular expression. Lines matching this expression are not considered executable when reporting code coverage. A list of regexes is maintained; this function adds a new regex to the list. Matching any of the regexes excludes a source line. - + """ - self.exclude_list.append(regex) - self.exclude_re = "(" + ")|(".join(self.exclude_list) + ")" + self.config.exclude_list.append(regex) + self._compile_exclude() + + def _compile_exclude(self): + """Build the internal usable form of the exclude list.""" + self.exclude_re = "(" + ")|(".join(self.config.exclude_list) + ")" def get_exclude_list(self): """Return the list of excluded regex patterns.""" - return self.exclude_list + return self.config.exclude_list def save(self): """Save the collected coverage data to the data file.""" + data_suffix = self.data_suffix + if data_suffix and not isinstance(data_suffix, string_class): + # If data_suffix was a simple true value, then make a suffix with + # plenty of distinguishing information. We do this here in + # `save()` at the last minute so that the pid will be correct even + # if the process forks. + data_suffix = "%s.%s.%06d" % ( + socket.gethostname(), os.getpid(), random.randint(0, 99999) + ) + self._harvest_data() - self.data.write() + self.data.write(suffix=data_suffix) def combine(self): """Combine together a number of similarly-named coverage data files. - + All coverage data files whose name starts with `data_file` (from the coverage() constructor) will be read, and combined together into the current measurements. - + """ self.data.combine_parallel_data() @@ -230,14 +315,15 @@ class coverage(object): def analysis2(self, morf): """Analyze a module. - + `morf` is a module or a filename. It will be analyzed to determine its coverage statistics. The return value is a 5-tuple: - + * The filename for the module. * A list of line numbers of executable statements. * A list of line numbers of excluded statements. - * A list of line numbers of statements not run (missing from execution). + * A list of line numbers of statements not run (missing from + execution). * A readable formatted string of the missing line numbers. The analysis uses the source file itself and the current measured @@ -252,66 +338,126 @@ class coverage(object): def _analyze(self, it): """Analyze a single morf or code unit. - + Returns an `Analysis` object. """ if not isinstance(it, CodeUnit): it = code_unit_factory(it, self.file_locator)[0] - + return Analysis(self, it) - def report(self, morfs=None, show_missing=True, ignore_errors=False, - file=None, omit_prefixes=None): # pylint: disable-msg=W0622 + def report(self, morfs=None, show_missing=True, ignore_errors=None, + file=None, # pylint: disable-msg=W0622 + omit_prefixes=None, include_prefixes=None + ): """Write a summary report to `file`. - + Each module in `morfs` is listed, with counts of statements, executed statements, missing statements, and a list of lines missed. - + + `include_prefixes` is a list of filename prefixes. Modules that match + those prefixes will be included in the report. Modules that match + `omit_prefixes` will not be included in the report. + """ - reporter = SummaryReporter(self, show_missing, ignore_errors) - reporter.report(morfs, outfile=file, omit_prefixes=omit_prefixes) + self.config.from_args( + ignore_errors=ignore_errors, + omit_prefixes=omit_prefixes, + include_prefixes=include_prefixes + ) + reporter = SummaryReporter( + self, show_missing, self.config.ignore_errors + ) + reporter.report( + morfs, outfile=file, omit_prefixes=self.config.omit_prefixes, + include_prefixes=self.config.include_prefixes + ) - def annotate(self, morfs=None, directory=None, ignore_errors=False, - omit_prefixes=None): + def annotate(self, morfs=None, directory=None, ignore_errors=None, + omit_prefixes=None, include_prefixes=None): """Annotate a list of modules. - + Each module in `morfs` is annotated. The source is written to a new file, named with a ",cover" suffix, with each line prefixed with a marker to indicate the coverage of the line. Covered lines have ">", excluded lines have "-", and missing lines have "!". - + + See `coverage.report()` for other arguments. + """ - reporter = AnnotateReporter(self, ignore_errors) + self.config.from_args( + ignore_errors=ignore_errors, + omit_prefixes=omit_prefixes, + include_prefixes=include_prefixes + ) + reporter = AnnotateReporter(self, self.config.ignore_errors) reporter.report( - morfs, directory=directory, omit_prefixes=omit_prefixes) + morfs, directory=directory, + omit_prefixes=self.config.omit_prefixes, + include_prefixes=self.config.include_prefixes + ) - def html_report(self, morfs=None, directory=None, ignore_errors=False, - omit_prefixes=None): + def html_report(self, morfs=None, directory=None, ignore_errors=None, + omit_prefixes=None, include_prefixes=None): """Generate an HTML report. - + + See `coverage.report()` for other arguments. + """ - reporter = HtmlReporter(self, ignore_errors) + self.config.from_args( + ignore_errors=ignore_errors, + omit_prefixes=omit_prefixes, + include_prefixes=include_prefixes, + html_dir=directory, + ) + reporter = HtmlReporter(self, self.config.ignore_errors) reporter.report( - morfs, directory=directory, omit_prefixes=omit_prefixes) + morfs, directory=self.config.html_dir, + omit_prefixes=self.config.omit_prefixes, + include_prefixes=self.config.include_prefixes + ) - def xml_report(self, morfs=None, outfile=None, ignore_errors=False, - omit_prefixes=None): + def xml_report(self, morfs=None, outfile=None, ignore_errors=None, + omit_prefixes=None, include_prefixes=None): """Generate an XML report of coverage results. - + The report is compatible with Cobertura reports. - + + Each module in `morfs` is included in the report. `outfile` is the + path to write the file to, "-" will write to stdout. + + See `coverage.report()` for other arguments. + """ - if outfile: - outfile = open(outfile, "w") - reporter = XmlReporter(self, ignore_errors) - reporter.report(morfs, omit_prefixes=omit_prefixes, outfile=outfile) + self.config.from_args( + ignore_errors=ignore_errors, + omit_prefixes=omit_prefixes, + include_prefixes=include_prefixes, + xml_output=outfile, + ) + file_to_close = None + if self.config.xml_output: + if self.config.xml_output == '-': + outfile = sys.stdout + else: + outfile = open(self.config.xml_output, "w") + file_to_close = outfile + try: + reporter = XmlReporter(self, self.config.ignore_errors) + reporter.report( + morfs, omit_prefixes=self.config.omit_prefixes, + include_prefixes=self.config.include_prefixes, outfile=outfile + ) + finally: + if file_to_close: + file_to_close.close() def sysinfo(self): - """Return a list of key,value pairs showing internal information.""" - + """Return a list of (key, value) pairs showing internal information.""" + import coverage as covmod - import platform, re, sys + import platform, re info = [ ('version', covmod.__version__), @@ -319,7 +465,7 @@ class coverage(object): ('cover_prefix', self.cover_prefix), ('pylib_prefix', self.pylib_prefix), ('tracer', self.collector.tracer_name()), - ('data_file', self.data.filename), + ('data_path', self.data.filename), ('python', sys.version.replace('\n', '')), ('platform', platform.platform()), ('cwd', os.getcwd()), @@ -330,3 +476,32 @@ class coverage(object): ]), ] return info + + +def process_startup(): + """Call this at Python startup to perhaps measure coverage. + + If the environment variable COVERAGE_PROCESS_START is defined, coverage + measurement is started. The value of the variable is the config file + to use. + + There are two ways to configure your Python installation to invoke this + function when Python starts: + + #. Create or append to sitecustomize.py to add these lines:: + + import coverage + coverage.process_startup() + + #. Create a .pth file in your Python installation containing:: + + import coverage; coverage.process_startup() + + """ + cps = os.environ.get("COVERAGE_PROCESS_START") + if cps: + cov = coverage(config_file=cps, auto_data=True) + if os.environ.get("COVERAGE_COVERAGE"): + # Measuring coverage within coverage.py takes yet more trickery. + cov.cover_prefix = "Please measure coverage.py!" + cov.start() diff --git a/coverage/data.py b/coverage/data.py index 452ce73d..1b883750 100644 --- a/coverage/data.py +++ b/coverage/data.py @@ -2,53 +2,40 @@ import os -from coverage.backward import pickle, sorted # pylint: disable-msg=W0622 +from coverage.backward import pickle, sorted # pylint: disable-msg=W0622 class CoverageData(object): """Manages collected coverage data, including file storage. - + The data file format is a pickled dict, with these keys: - + * collector: a string identifying the collecting software * lines: a dict mapping filenames to sorted lists of line numbers executed: { 'file1': [17,23,45], 'file2': [1,2,3], ... } - + * arcs: a dict mapping filenames to sorted lists of line number pairs: { 'file1': [(17,23), (17,25), (25,26)], ... } """ - - # Name of the data file (unless environment variable is set). - filename_default = ".coverage" - - # Environment variable naming the data file. - filename_env = "COVERAGE_FILE" - def __init__(self, basename=None, suffix=None, collector=None): + def __init__(self, basename=None, collector=None): """Create a CoverageData. - + `basename` is the name of the file to use for storing data. - - `suffix` is a suffix to append to the base file name. This can be used - for multiple or parallel execution, so that many coverage data files - can exist simultaneously. `collector` is a string describing the coverage measurement software. """ - self.collector = collector - + self.collector = collector or 'unknown' + self.use_file = True # Construct the filename that will be used for data file storage, if we # ever do any file storage. - self.filename = (basename or - os.environ.get(self.filename_env, self.filename_default)) - if suffix: - self.filename += suffix + self.filename = basename or ".coverage" self.filename = os.path.abspath(self.filename) # A map from canonical Python source file name to a dictionary in @@ -61,14 +48,14 @@ class CoverageData(object): # } # self.lines = {} - + # A map from canonical Python source file name to a dictionary with an # entry for each pair of line numbers forming an arc: # # { filename: { (l1,l2): None, ... }, ...} # self.arcs = {} - + def usefile(self, use_file=True): """Set whether or not to use a disk file for data.""" self.use_file = use_file @@ -80,10 +67,20 @@ class CoverageData(object): else: self.lines, self.arcs = {}, {} - def write(self): - """Write the collected coverage data to a file.""" + def write(self, suffix=None): + """Write the collected coverage data to a file. + + `suffix` is a suffix to append to the base file name. This can be used + for multiple or parallel execution, so that many coverage data files + can exist simultaneously. A dot will be used to join the base name and + the suffix. + + """ if self.use_file: - self.write_file(self.filename) + filename = self.filename + if suffix: + filename += "." + suffix + self.write_file(filename) def erase(self): """Erase the data, both in this object, and from its file storage.""" @@ -92,7 +89,7 @@ class CoverageData(object): os.remove(self.filename) self.lines = {} self.arcs = {} - + def line_data(self): """Return the map from filenames to lists of line numbers executed.""" return dict( @@ -104,11 +101,11 @@ class CoverageData(object): return dict( [(f, sorted(amap.keys())) for f, amap in self.arcs.items()] ) - + def write_file(self, filename): """Write the coverage data to `filename`.""" - # Create the file data. + # Create the file data. data = {} data['lines'] = self.line_data() @@ -141,10 +138,10 @@ class CoverageData(object): def _read_file(self, filename): """Return the stored coverage data from the given file. - + Returns two values, suitable for assigning to `self.lines` and `self.arcs`. - + """ lines = {} arcs = {} @@ -167,35 +164,38 @@ class CoverageData(object): def combine_parallel_data(self): """Combine a number of data files together. - + Treat `self.filename` as a file prefix, and combine the data from all - of the data files starting with that prefix. - + of the data files starting with that prefix plus a dot. + """ data_dir, local = os.path.split(self.filename) + localdot = local + '.' for f in os.listdir(data_dir or '.'): - if f.startswith(local): + if f.startswith(localdot): full_path = os.path.join(data_dir, f) new_lines, new_arcs = self._read_file(full_path) for filename, file_data in new_lines.items(): self.lines.setdefault(filename, {}).update(file_data) for filename, file_data in new_arcs.items(): self.arcs.setdefault(filename, {}).update(file_data) + if f != local: + os.remove(full_path) def add_line_data(self, line_data): """Add executed line data. - + `line_data` is { filename: { lineno: None, ... }, ...} - + """ for filename, linenos in line_data.items(): self.lines.setdefault(filename, {}).update(linenos) def add_arc_data(self, arc_data): """Add measured arc data. - + `arc_data` is { filename: { (l1,l2): None, ... }, ...} - + """ for filename, arcs in arc_data.items(): self.arcs.setdefault(filename, {}).update(arcs) @@ -206,7 +206,7 @@ class CoverageData(object): def executed_lines(self, filename): """A map containing all the line numbers executed in `filename`. - + If `filename` hasn't been collected at all (because it wasn't executed) then return an empty map. @@ -219,11 +219,11 @@ class CoverageData(object): def summary(self, fullpath=False): """Return a dict summarizing the coverage data. - + Keys are based on the filenames, and values are the number of executed lines. If `fullpath` is true, then the keys are the full pathnames of the files, otherwise they are the basenames of the files. - + """ summ = {} if fullpath: diff --git a/coverage/execfile.py b/coverage/execfile.py index ddcfa149..333163f8 100644 --- a/coverage/execfile.py +++ b/coverage/execfile.py @@ -2,8 +2,8 @@ import imp, os, sys -from coverage.backward import exec_function -from coverage.misc import NoSource +from coverage.backward import exec_code_object +from coverage.misc import NoSource, ExceptionDuringRun try: @@ -16,11 +16,11 @@ except KeyError: def run_python_file(filename, args): """Run a python file as if it were the main program on the command line. - + `filename` is the path to the file to execute, it need not be a .py file. `args` is the argument array to present as sys.argv, including the first element representing the file being executed. - + """ # Create a module to serve as __main__ old_main_mod = sys.modules['__main__'] @@ -36,15 +36,37 @@ def run_python_file(filename, args): sys.path[0] = os.path.dirname(filename) try: + # Open the source file. try: source = open(filename, 'rU').read() except IOError: raise NoSource("No file to run: %r" % filename) - exec_function(source, filename, main_mod.__dict__) + + # We have the source. `compile` still needs the last line to be clean, + # so make sure it is, then compile a code object from it. + if source[-1] != '\n': + source += '\n' + code = compile(source, filename, "exec") + + # Execute the source file. + try: + exec_code_object(code, main_mod.__dict__) + except SystemExit: + # The user called sys.exit(). Just pass it along to the upper + # layers, where it will be handled. + raise + except: + # Something went wrong while executing the user code. + # Get the exc_info, and pack them into an exception that we can + # throw up to the outer loop. We peel two layers off the traceback + # so that the coverage.py code doesn't appear in the final printed + # traceback. + typ, err, tb = sys.exc_info() + raise ExceptionDuringRun(typ, err, tb.tb_next.tb_next) finally: # Restore the old __main__ sys.modules['__main__'] = old_main_mod - + # Restore the old argv and path sys.argv = old_argv sys.path[0] = old_path0 diff --git a/coverage/files.py b/coverage/files.py index 400646ca..5690679f 100644 --- a/coverage/files.py +++ b/coverage/files.py @@ -6,6 +6,7 @@ class FileLocator(object): """Understand how filenames work.""" def __init__(self): + # The absolute path to our current directory. self.relative_dir = self.abs_file(os.curdir) + os.sep # Cache of results of calling the canonical_filename() method, to @@ -18,18 +19,20 @@ class FileLocator(object): def relative_filename(self, filename): """Return the relative form of `filename`. - + The filename will be relative to the current directory when the - FileLocator was constructed. - + `FileLocator` was constructed. + """ - return filename.replace(self.relative_dir, "") + if filename.startswith(self.relative_dir): + filename = filename.replace(self.relative_dir, "") + return filename def canonical_filename(self, filename): """Return a canonical filename for `filename`. - + An absolute path with no redundant components and normalized case. - + """ if filename not in self.canonical_filename_cache: f = filename @@ -38,6 +41,8 @@ class FileLocator(object): f = os.path.basename(f) if not os.path.isabs(f): for path in [os.curdir] + sys.path: + if path is None: + continue g = os.path.join(path, f) if os.path.exists(g): f = g @@ -48,11 +53,11 @@ class FileLocator(object): def get_zip_data(self, filename): """Get data from `filename` if it is a zip file path. - + Returns the string data read from the zip file, or None if no zip file could be found or `filename` isn't in it. The data returned will be an empty string if the file is empty. - + """ import zipimport markers = ['.zip'+os.sep, '.egg'+os.sep] @@ -67,7 +72,7 @@ class FileLocator(object): data = zi.get_data(parts[1]) except IOError: continue - if sys.hexversion > 0x03000000: + if sys.version_info >= (3, 0): data = data.decode('utf8') # TODO: How to do this properly? return data return None diff --git a/coverage/html.py b/coverage/html.py index 3877c834..94ba0dea 100644 --- a/coverage/html.py +++ b/coverage/html.py @@ -18,38 +18,44 @@ def data_filename(fname): def data(fname): """Return the contents of a data file of ours.""" return open(data_filename(fname)).read() - + class HtmlReporter(Reporter): """HTML reporting.""" - + def __init__(self, coverage, ignore_errors=False): super(HtmlReporter, self).__init__(coverage, ignore_errors) self.directory = None self.source_tmpl = Templite(data("htmlfiles/pyfile.html"), globals()) - + self.files = [] self.arcs = coverage.data.has_arcs() - def report(self, morfs, directory, omit_prefixes=None): + def report(self, morfs, directory, omit_prefixes=None, + include_prefixes=None + ): """Generate an HTML report for `morfs`. - + `morfs` is a list of modules or filenames. `directory` is where to put - the HTML files. `omit_prefixes` is a list of strings, prefixes of - modules to omit from the report. - + the HTML files. + + See `coverage.report()` for other arguments. + """ assert directory, "must provide a directory for html reporting" - + # Process all the files. - self.report_files(self.html_file, morfs, directory, omit_prefixes) + self.report_files( + self.html_file, morfs, directory, omit_prefixes, include_prefixes + ) # Write the index file. self.index_file() # Create the once-per-directory files. for static in [ - "style.css", "jquery-1.3.2.min.js", "jquery.tablesorter.min.js" + "style.css", "coverage_html.js", + "jquery-1.3.2.min.js", "jquery.tablesorter.min.js" ]: shutil.copyfile( data_filename("htmlfiles/" + static), @@ -58,55 +64,69 @@ class HtmlReporter(Reporter): def html_file(self, cu, analysis): """Generate an HTML file for one source file.""" - + source = cu.source_file().read() - nums = analysis.numbers + nums = analysis.numbers missing_branch_arcs = analysis.missing_branch_arcs() n_par = 0 # accumulated below. arcs = self.arcs # These classes determine which lines are highlighted by default. - c_run = " run hide" - c_exc = " exc" - c_mis = " mis" - c_par = " par" + c_run = "run hide_run" + c_exc = "exc" + c_mis = "mis" + c_par = "par " + c_run lines = [] - + for lineno, line in enumerate(source_token_lines(source)): lineno += 1 # 1-based line numbers. # Figure out how to mark this line. - line_class = "" - annotate = "" + line_class = [] + annotate_html = "" + annotate_title = "" if lineno in analysis.statements: - line_class += " stm" + line_class.append("stm") if lineno in analysis.excluded: - line_class += c_exc + line_class.append(c_exc) elif lineno in analysis.missing: - line_class += c_mis + line_class.append(c_mis) elif self.arcs and lineno in missing_branch_arcs: - line_class += c_par + line_class.append(c_par) n_par += 1 - annotate = " ".join(map(str, missing_branch_arcs[lineno])) + annlines = [] + for b in missing_branch_arcs[lineno]: + if b < 0: + annlines.append("exit") + else: + annlines.append(str(b)) + annotate_html = " ".join(annlines) + if len(annlines) > 1: + annotate_title = "no jumps to these line numbers" + elif len(annlines) == 1: + annotate_title = "no jump to this line number" elif lineno in analysis.statements: - line_class += c_run - + line_class.append(c_run) + # Build the HTML for the line - html = "" + html = [] for tok_type, tok_text in line: if tok_type == "ws": - html += escape(tok_text) + html.append(escape(tok_text)) else: tok_html = escape(tok_text) or ' ' - html += "<span class='%s'>%s</span>" % (tok_type, tok_html) + html.append( + "<span class='%s'>%s</span>" % (tok_type, tok_html) + ) lines.append({ - 'html': html, + 'html': ''.join(html), 'number': lineno, - 'class': line_class.strip() or "pln", - 'annotate': annotate, + 'class': ' '.join(line_class) or "pln", + 'annotate': annotate_html, + 'annotate_title': annotate_title, }) # Write the HTML page for this file. @@ -160,10 +180,10 @@ def format_pct(p): def spaceless(html): """Squeeze out some annoying extra space from an HTML string. - + Nicely-formatted templates mean lots of extra space in the result. Get rid of some. - + """ html = re.sub(">\s+<p ", ">\n<p ", html) return html diff --git a/coverage/htmlfiles/coverage_html.js b/coverage/htmlfiles/coverage_html.js new file mode 100644 index 00000000..5219e36b --- /dev/null +++ b/coverage/htmlfiles/coverage_html.js @@ -0,0 +1,87 @@ +// Coverage.py HTML report browser code. + +// Loaded on index.html +function index_ready($) { + // Look for a cookie containing previous sort settings: + sort_list = []; + cookie_name = "COVERAGE_INDEX_SORT"; + + // This almost makes it worth installing the jQuery cookie plugin: + if (document.cookie.indexOf(cookie_name) > -1) { + cookies = document.cookie.split(";"); + for (var i=0; i < cookies.length; i++) { + parts = cookies[i].split("=") + + if ($.trim(parts[0]) == cookie_name && parts[1]) { + sort_list = eval("[[" + parts[1] + "]]"); + break; + } + } + } + + // Create a new widget which exists only to save and restore + // the sort order: + $.tablesorter.addWidget({ + id: "persistentSort", + + // Format is called by the widget before displaying: + format: function(table) { + if (table.config.sortList.length == 0 && sort_list.length > 0) { + // This table hasn't been sorted before - we'll use + // our stored settings: + $(table).trigger('sorton', [sort_list]); + } + else { + // This is not the first load - something has + // already defined sorting so we'll just update + // our stored value to match: + sort_list = table.config.sortList; + } + } + }); + + // Configure our tablesorter to handle the variable number of + // columns produced depending on report options: + var headers = {}; + var col_count = $("table.index > thead > tr > th").length; + + headers[0] = { sorter: 'text' }; + for (var i = 1; i < col_count-1; i++) { + headers[i] = { sorter: 'digit' }; + } + headers[col_count-1] = { sorter: 'percent' }; + + // Enable the table sorter: + $("table.index").tablesorter({ + widgets: ['persistentSort'], + headers: headers + }); + + // Watch for page unload events so we can save the final sort settings: + $(window).unload(function() { + document.cookie = cookie_name + "=" + sort_list.toString() + "; path=/" + }); +} + +// -- pyfile stuff -- + +function pyfile_ready($) { + // If we're directed to a particular line number, highlight the line. + var frag = location.hash; + if (frag.length > 2 && frag[1] == 'n') { + $(frag).addClass('highlight'); + } +} + +function toggle_lines(btn, cls) { + btn = $(btn); + var hide = "hide_"+cls; + if (btn.hasClass(hide)) { + $("#source ."+cls).removeClass(hide); + btn.removeClass(hide); + } + else { + $("#source ."+cls).addClass(hide); + btn.addClass(hide); + } +} diff --git a/coverage/htmlfiles/index.html b/coverage/htmlfiles/index.html index 5c562de2..c1ef8ad7 100644 --- a/coverage/htmlfiles/index.html +++ b/coverage/htmlfiles/index.html @@ -1,89 +1,81 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<html>
- <head>
- <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
- <title>Coverage report</title>
- <link rel='stylesheet' href='style.css' type='text/css'>
- <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
- <script type='text/javascript' src='jquery.tablesorter.min.js'></script>
- </head>
- <body>
-
- <div id='header'>
- <div class='content'>
- <h1>Coverage report:
- <span class='pc_cov'>{{totals.pc_covered|format_pct}}%</span>
- </h1>
- </div>
- </div>
-
- <div id='index'>
- <table class='index'>
- <thead>
- {# The title='' attr doesn't work in Safari. #}
- <tr class='tablehead' title='Click to sort'>
- <th class='name left'>Module</th>
- <th>statements</th>
- <th>run</th>
- <th>excluded</th>
- {% if arcs %}
- <th>branches</th>
- <th>br exec</th>
- {% endif %}
- <th class='right'>coverage</th>
- </tr>
- </thead>
- <tbody>
- {% for file in files %}
- <tr class='file'>
- <td class='name left'><a href='{{file.html_filename}}'>{{file.cu.name}}</a></td>
- <td>{{file.nums.n_statements}}</td>
- <td>{{file.nums.n_executed}}</td>
- <td>{{file.nums.n_excluded}}</td>
- {% if arcs %}
- <td>{{file.nums.n_branches}}</td>
- <td>{{file.nums.n_executed_branches}}</td>
- {% endif %}
- <td class='right'>{{file.nums.pc_covered|format_pct}}%</td>
- </tr>
- {% endfor %}
- </tbody>
- <tfoot>
- <tr class='total'>
- <td class='name left'>Total</td>
- <td>{{totals.n_statements}}</td>
- <td>{{totals.n_executed}}</td>
- <td>{{totals.n_excluded}}</td>
- {% if arcs %}
- <td>{{totals.n_branches}}</td>
- <td>{{totals.n_executed_branches}}</td>
- {% endif %}
- <td class='right'>{{totals.pc_covered|format_pct}}%</td>
- </tr>
- </tfoot>
- </table>
- </div>
-
- <div id='footer'>
- <div class='content'>
- <p>
- <a class='nav' href='{{__url__}}'>coverage.py v{{__version__}}</a>
- </p>
- </div>
- </div>
-
- <script type="text/javascript" charset="utf-8">
- jQuery(function() {
- jQuery("table.index").tablesorter({
- headers: {
- 0: { sorter:'text' },
- 1: { sorter:'digit' },
- 2: { sorter:'digit' },
- 3: { sorter:'digit' },
- 4: { sorter:'percent' },
- }
- });
- });
- </script>
- </body>
-</html>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<html> +<head> + <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <title>Coverage report</title> + <link rel='stylesheet' href='style.css' type='text/css'> + <script type='text/javascript' src='jquery-1.3.2.min.js'></script> + <script type='text/javascript' src='jquery.tablesorter.min.js'></script> + <script type='text/javascript' src='coverage_html.js'></script> + <script type='text/javascript' charset='utf-8'> + jQuery(document).ready(index_ready); + </script> +</head> +<body id='indexfile'> + +<div id='header'> + <div class='content'> + <h1>Coverage report: + <span class='pc_cov'>{{totals.pc_covered|format_pct}}%</span> + </h1> + </div> +</div> + +<div id='index'> + <table class='index'> + <thead> + {# The title='' attr doesn't work in Safari. #} + <tr class='tablehead' title='Click to sort'> + <th class='name left headerSortDown'>Module</th> + <th>statements</th> + <th>missing</th> + <th>excluded</th> + {% if arcs %} + <th>branches</th> + <th>partial</th> + {% endif %} + <th class='right'>coverage</th> + </tr> + </thead> + {# HTML syntax requires thead, tfoot, tbody #} + <tfoot> + <tr class='total'> + <td class='name left'>Total</td> + <td>{{totals.n_statements}}</td> + <td>{{totals.n_missing}}</td> + <td>{{totals.n_excluded}}</td> + {% if arcs %} + <td>{{totals.n_branches}}</td> + <td>{{totals.n_missing_branches}}</td> + {% endif %} + <td class='right'>{{totals.pc_covered|format_pct}}%</td> + </tr> + </tfoot> + <tbody> + {% for file in files %} + <tr class='file'> + <td class='name left'><a href='{{file.html_filename}}'>{{file.cu.name}}</a></td> + <td>{{file.nums.n_statements}}</td> + <td>{{file.nums.n_missing}}</td> + <td>{{file.nums.n_excluded}}</td> + {% if arcs %} + <td>{{file.nums.n_branches}}</td> + <td>{{file.nums.n_missing_branches}}</td> + {% endif %} + <td class='right'>{{file.nums.pc_covered|format_pct}}%</td> + </tr> + {% endfor %} + </tbody> + </table> +</div> + +<div id='footer'> + <div class='content'> + <p> + <a class='nav' href='{{__url__}}'>coverage.py v{{__version__}}</a> + </p> + </div> +</div> + +</body> +</html> diff --git a/coverage/htmlfiles/pyfile.html b/coverage/htmlfiles/pyfile.html index ca65152d..035691c8 100644 --- a/coverage/htmlfiles/pyfile.html +++ b/coverage/htmlfiles/pyfile.html @@ -1,58 +1,61 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
-<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
-<title>Coverage for {{cu.name|escape}}</title>
-<link rel='stylesheet' href='style.css' type='text/css'>
-<script type='text/javascript' src='jquery-1.3.2.min.js'></script>
-<script type='text/javascript'>
-function toggle_lines(btn, cls) {
- var btn = $(btn);
- if (btn.hasClass("hide")) {
- $("#source ."+cls).removeClass("hide");
- btn.removeClass("hide");
- }
- else {
- $("#source ."+cls).addClass("hide");
- btn.addClass("hide");
- }
-}
-</script>
-</head>
-<body>
-<div id='header'>
- <div class='content'>
- <h1>Coverage for <b>{{cu.name|escape}}</b> :
- <span class='pc_cov'>{{nums.pc_covered|format_pct}}%</span>
- </h1>
- <h2 class='stats'>
- {{nums.n_statements}} statements
- <span class='{{c_run.strip}}' onclick='toggle_lines(this, "run")'>{{nums.n_executed}} run</span>
- <span class='{{c_exc.strip}}' onclick='toggle_lines(this, "exc")'>{{nums.n_excluded}} excluded</span>
- <span class='{{c_mis.strip}}' onclick='toggle_lines(this, "mis")'>{{nums.n_missing}} missing</span>
- {% if arcs %}
- <span class='{{c_par.strip}}' onclick='toggle_lines(this, "par")'>{{n_par}} partial</span>
- {% endif %}
- </h2>
- </div>
-</div>
-
-<div id='source'>
-<table cellspacing='0' cellpadding='0'>
-<tr>
-<td class='linenos' valign='top'>
- {% for line in lines %}
- <p class='{{line.class}}'>{{line.number}}</p>
- {% endfor %}
-</td>
-<td class='text' valign='top'>
- {% for line in lines %}
- <p class='{{line.class}}'>{% if line.annotate %}<span class='annotate'>{{line.annotate}}</span>{% endif %}{{line.html}}<span class='strut'> </span></p>
- {% endfor %}
-</td>
-</tr>
-</table>
-</div>
-
-</body>
-</html>
+<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<html> +<head> + <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + {# IE8 rounds line-height incorrectly, and adding this emulateIE7 line makes it right! #} + {# http://social.msdn.microsoft.com/Forums/en-US/iewebdevelopment/thread/7684445e-f080-4d8f-8529-132763348e21 #} + <meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' /> + <title>Coverage for {{cu.name|escape}}: {{nums.pc_covered|format_pct}}%</title> + <link rel='stylesheet' href='style.css' type='text/css'> + <script type='text/javascript' src='jquery-1.3.2.min.js'></script> + <script type='text/javascript' src='coverage_html.js'></script> + <script type='text/javascript' charset='utf-8'> + jQuery(document).ready(pyfile_ready); + </script> +</head> +<body id='pyfile'> + +<div id='header'> + <div class='content'> + <h1>Coverage for <b>{{cu.name|escape}}</b> : + <span class='pc_cov'>{{nums.pc_covered|format_pct}}%</span> + </h1> + <h2 class='stats'> + {{nums.n_statements}} statements + <span class='{{c_run}}' onclick='toggle_lines(this, "run")'>{{nums.n_executed}} run</span> + <span class='{{c_mis}}' onclick='toggle_lines(this, "mis")'>{{nums.n_missing}} missing</span> + <span class='{{c_exc}}' onclick='toggle_lines(this, "exc")'>{{nums.n_excluded}} excluded</span> + {% if arcs %} + <span class='{{c_par}}' onclick='toggle_lines(this, "par")'>{{n_par}} partial</span> + {% endif %} + </h2> + </div> +</div> + +<div id='source'> + <table cellspacing='0' cellpadding='0'> + <tr> + <td class='linenos' valign='top'> + {% for line in lines %} + <p id='n{{line.number}}' class='{{line.class}}'><a href='#n{{line.number}}'>{{line.number}}</a></p> + {% endfor %} + </td> + <td class='text' valign='top'> + {% for line in lines %} + <p id='t{{line.number}}' class='{{line.class}}'>{% if line.annotate %}<span class='annotate' title='{{line.annotate_title}}'>{{line.annotate}}</span>{% endif %}{{line.html}}<span class='strut'> </span></p> + {% endfor %} + </td> + </tr> + </table> +</div> + +<div id='footer'> + <div class='content'> + <p> + <a class='nav' href='index.html'>« index</a> <a class='nav' href='{{__url__}}'>coverage.py v{{__version__}}</a> + </p> + </div> +</div> + +</body> +</html> diff --git a/coverage/htmlfiles/style.css b/coverage/htmlfiles/style.css index dd6c991a..9a06a2b4 100644 --- a/coverage/htmlfiles/style.css +++ b/coverage/htmlfiles/style.css @@ -20,7 +20,7 @@ body { html>body { font-size: 16px; - } + } /* Set base font size to 12/16 */ p { @@ -53,10 +53,14 @@ a.nav:hover { font-family: "courier new", monospace; } -#footer { +#indexfile #footer { margin: 1em 3em; } +#pyfile #footer { + margin: 1em 1em; + } + #footer .content { padding: 0; font-size: 85%; @@ -89,9 +93,14 @@ h2.stats { cursor: pointer; border-color: #999 #ccc #ccc #999; } -.stats span.hide { +.stats span.hide_run, .stats span.hide_exc, +.stats span.hide_mis, .stats span.hide_par, +.stats span.par.hide_run.hide_par { border-color: #ccc #999 #999 #ccc; } +.stats span.par.hide_run { + border-color: #999 #ccc #ccc #999; +} /* Source file styles */ .linenos p { @@ -100,9 +109,21 @@ h2.stats { padding: 0 .5em; color: #999999; font-family: verdana, sans-serif; - font-size: .625em; /* 10/16 */ + font-size: .625em; /* 10/16 */ line-height: 1.6em; /* 16/10 */ } +.linenos p.highlight { + background: #ffdd00; + } +.linenos p a { + text-decoration: none; + color: #999999; + } +.linenos p a:hover { + text-decoration: underline; + color: #999999; + } + td.text { width: 100%; } @@ -110,14 +131,14 @@ td.text { margin: 0; padding: 0 0 0 .5em; border-left: 2px solid #ffffff; - white-space: nowrap; + white-space: nowrap; } .text p.mis { background: #ffdddd; border-left: 2px solid #ff0000; } -.text p.run { +.text p.run, .text p.run.hide_par { background: #ddffdd; border-left: 2px solid #00ff00; } @@ -125,11 +146,12 @@ td.text { background: #eeeeee; border-left: 2px solid #808080; } -.text p.par { +.text p.par, .text p.par.hide_run { background: #ffffaa; border-left: 2px solid #eeee99; } -.text p.hide { +.text p.hide_run, .text p.hide_exc, .text p.hide_mis, .text p.hide_par, +.text p.hide_run.hide_par { background: inherit; } @@ -140,7 +162,7 @@ td.text { float: right; padding-right: .5em; } -.text p.hide span.annotate { +.text p.hide_par span.annotate { display: none; } diff --git a/coverage/misc.py b/coverage/misc.py index 329a8417..4218536d 100644 --- a/coverage/misc.py +++ b/coverage/misc.py @@ -2,10 +2,10 @@ def nice_pair(pair): """Make a nice string representation of a pair of numbers. - + If the numbers are equal, just return the number, otherwise return the pair with a dash between them, indicating the range. - + """ start, end = pair if start == end: @@ -20,10 +20,10 @@ def format_lines(statements, lines): Format a list of line numbers for printing by coalescing groups of lines as long as the lines represent consecutive statements. This will coalesce even if there are gaps between statements. - + For example, if `statements` is [1,2,3,4,5,10,11,12,13,14] and `lines` is [1,2,5,10,11,13,14] then the result will be "1-2, 5-11, 13-14". - + """ pairs = [] i = 0 @@ -47,18 +47,27 @@ def format_lines(statements, lines): def expensive(fn): """A decorator to cache the result of an expensive operation. - + Only applies to methods with no arguments. - + """ attr = "_cache_" + fn.__name__ def _wrapped(self): + """Inner fn that checks the cache.""" if not hasattr(self, attr): setattr(self, attr, fn(self)) return getattr(self, attr) return _wrapped +def bool_or_none(b): + """Return bool(b), but preserve None.""" + if b is None: + return None + else: + return bool(b) + + class CoverageException(Exception): """An exception specific to Coverage.""" pass @@ -66,3 +75,11 @@ class CoverageException(Exception): class NoSource(CoverageException): """Used to indicate we couldn't find the source for a module.""" pass + +class ExceptionDuringRun(CoverageException): + """An exception happened while running customer code. + + Construct it with three arguments, the values from `sys.exc_info`. + + """ + pass diff --git a/coverage/parser.py b/coverage/parser.py index 01b38af3..b090f02d 100644 --- a/coverage/parser.py +++ b/coverage/parser.py @@ -9,13 +9,13 @@ from coverage.misc import nice_pair, CoverageException, NoSource, expensive class CodeParser(object): """Parse code to find executable lines, excluded lines, etc.""" - + def __init__(self, text=None, filename=None, exclude=None): """ Source can be provided as `text`, the text itself, or `filename`, from - which text will be read. Excluded lines are those that match `exclude`, - a regex. - + which text will be read. Excluded lines are those that match + `exclude`, a regex. + """ assert text or filename, "CodeParser needs either text or filename" self.filename = filename or "<code>" @@ -33,7 +33,7 @@ class CodeParser(object): self.text = self.text.replace('\r\n', '\n') self.exclude = exclude - + self.show_tokens = False # The text lines of the parsed code. @@ -41,22 +41,22 @@ class CodeParser(object): # The line numbers of excluded lines of code. self.excluded = set() - + # The line numbers of docstring lines. self.docstrings = set() - + # The line numbers of class definitions. self.classdefs = set() # A dict mapping line numbers to (lo,hi) for multi-line statements. self.multiline = {} - + # The line numbers that start statements. self.statement_starts = set() # Lazily-created ByteParser self._byte_parser = None - + def _get_byte_parser(self): """Create a ByteParser on demand.""" if not self._byte_parser: @@ -67,9 +67,9 @@ class CodeParser(object): def _raw_parse(self): """Parse the source to find the interesting facts about its lines. - + A handful of member fields are updated. - + """ # Find lines which match an exclusion pattern. if self.exclude: @@ -77,7 +77,7 @@ class CodeParser(object): for i, ltext in enumerate(self.lines): if re_exclude.search(ltext): self.excluded.add(i+1) - + # Tokenize, to find excluded suites, to find docstrings, and to find # multi-line statements. indent = 0 @@ -88,7 +88,7 @@ class CodeParser(object): tokgen = tokenize.generate_tokens(StringIO(self.text).readline) for toktype, ttext, (slineno, _), (elineno, _), ltext in tokgen: - if self.show_tokens: + if self.show_tokens: # pragma: no cover print("%10s %5s %-20r %r" % ( tokenize.tok_name.get(toktype, toktype), nice_pair((slineno, elineno)), ttext, ltext @@ -111,7 +111,9 @@ class CodeParser(object): excluding = True elif toktype == token.STRING and prev_toktype == token.INDENT: # Strings that are first on an indented line are docstrings. - # (a trick from trace.py in the stdlib.) + # (a trick from trace.py in the stdlib.) This works for + # 99.9999% of cases. For the rest (!) see: + # http://stackoverflow.com/questions/1769332/x/1769794#1769794 for i in range(slineno, elineno+1): self.docstrings.add(i) elif toktype == token.NEWLINE: @@ -123,7 +125,7 @@ class CodeParser(object): for l in range(first_line, elineno+1): self.multiline[l] = rng first_line = None - + if ttext.strip() and toktype != tokenize.COMMENT: # A non-whitespace token. if first_line is None: @@ -135,7 +137,7 @@ class CodeParser(object): excluding = False if excluding: self.excluded.add(elineno) - + prev_toktype = toktype # Find the starts of the executable statements. @@ -153,11 +155,11 @@ class CodeParser(object): def first_lines(self, lines, ignore=None): """Map the line numbers in `lines` to the correct first line of the statement. - + Skip any line mentioned in `ignore`. - + Returns a sorted list of the first lines. - + """ ignore = ignore or [] lset = set() @@ -168,31 +170,31 @@ class CodeParser(object): if new_l not in ignore: lset.add(new_l) return sorted(lset) - + def parse_source(self): """Parse source text to find executable lines, excluded lines, etc. Return values are 1) a sorted list of executable line numbers, and 2) a sorted list of excluded line numbers. - + Reported line numbers are normalized to the first line of multi-line statements. - + """ self._raw_parse() - + excluded_lines = self.first_lines(self.excluded) ignore = excluded_lines + list(self.docstrings) lines = self.first_lines(self.statement_starts, ignore) - + return lines, excluded_lines def arcs(self): """Get information about the arcs available in the code. - + Returns a sorted list of line number pairs. Line numbers have been normalized to the first line of multiline statements. - + """ all_arcs = [] for l1, l2 in self.byte_parser._all_arcs(): @@ -205,27 +207,32 @@ class CodeParser(object): def exit_counts(self): """Get a mapping from line numbers to count of exits from that line. - + Excluded lines are excluded. - + """ excluded_lines = self.first_lines(self.excluded) exit_counts = {} for l1, l2 in self.arcs(): - if l1 == -1: + if l1 < 0: + # Don't ever report -1 as a line number continue if l1 in excluded_lines: + # Don't report excluded lines as line numbers. + continue + if l2 in excluded_lines: + # Arcs to excluded lines shouldn't count. continue if l1 not in exit_counts: exit_counts[l1] = 0 exit_counts[l1] += 1 - + # Class definitions have one extra exit, so remove one for each: for l in self.classdefs: - # Ensure key is there - #pragma: no cover will mean its not + # Ensure key is there: classdefs can include excluded lines. if l in exit_counts: exit_counts[l] -= 1 - + return exit_counts exit_counts = expensive(exit_counts) @@ -249,6 +256,11 @@ OPS_CHUNK_END = _opcode_set( 'BREAK_LOOP', 'CONTINUE_LOOP', ) +# Opcodes that unconditionally begin a new code chunk. By starting new chunks +# with unconditional jump instructions, we neatly deal with jumps to jumps +# properly. +OPS_CHUNK_BEGIN = _opcode_set('JUMP_ABSOLUTE', 'JUMP_FORWARD') + # Opcodes that push a block on the block stack. OPS_PUSH_BLOCK = _opcode_set('SETUP_LOOP', 'SETUP_EXCEPT', 'SETUP_FINALLY') @@ -266,6 +278,8 @@ OP_BREAK_LOOP = _opcode('BREAK_LOOP') OP_END_FINALLY = _opcode('END_FINALLY') OP_COMPARE_OP = _opcode('COMPARE_OP') COMPARE_EXCEPTION = 10 # just have to get this const from the code. +OP_LOAD_CONST = _opcode('LOAD_CONST') +OP_RETURN_VALUE = _opcode('RETURN_VALUE') class ByteParser(object): @@ -294,14 +308,14 @@ class ByteParser(object): def child_parsers(self): """Iterate over all the code objects nested within this one. - + The iteration includes `self` as its first value. - + """ return map(lambda c: ByteParser(code=c), CodeObjects(self.code)) - # Getting numbers from the lnotab value changed in Py3.0. - if sys.hexversion >= 0x03000000: + # Getting numbers from the lnotab value changed in Py3.0. + if sys.version_info >= (3, 0): def _lnotab_increments(self, lnotab): """Return a list of ints from the lnotab bytes in 3.x""" return list(lnotab) @@ -312,15 +326,15 @@ class ByteParser(object): def _bytes_lines(self): """Map byte offsets to line numbers in `code`. - + Uses co_lnotab described in Python/compile.c to map byte offsets to line numbers. Returns a list: [(b0, l0), (b1, l1), ...] - + """ # Adapted from dis.py in the standard library. byte_increments = self._lnotab_increments(self.code.co_lnotab[0::2]) line_increments = self._lnotab_increments(self.code.co_lnotab[1::2]) - + bytes_lines = [] last_line_num = None line_num = self.code.co_firstlineno @@ -335,13 +349,13 @@ class ByteParser(object): if line_num != last_line_num: bytes_lines.append((byte_num, line_num)) return bytes_lines - + def _find_statements(self): """Find the statements in `self.code`. - + Return a set of line numbers that start statements. Recurses into all code objects reachable from `self.code`. - + """ stmts = set() for bp in self.child_parsers(): @@ -349,12 +363,12 @@ class ByteParser(object): for _, l in bp._bytes_lines(): stmts.add(l) return stmts - - def _disassemble(self): + + def _disassemble(self): # pragma: no cover """Disassemble code, for ad-hoc experimenting.""" - + import dis - + for bp in self.child_parsers(): print("\n%s: " % bp.code) dis.dis(bp.code) @@ -364,41 +378,52 @@ class ByteParser(object): def _split_into_chunks(self): """Split the code object into a list of `Chunk` objects. - + Each chunk is only entered at its first instruction, though there can be many exits from a chunk. - + Returns a list of `Chunk` objects. - + """ # The list of chunks so far, and the one we're working on. chunks = [] chunk = None bytes_lines_map = dict(self._bytes_lines()) - + # The block stack: loops and try blocks get pushed here for the # implicit jumps that can occur. # Each entry is a tuple: (block type, destination) block_stack = [] - + # Some op codes are followed by branches that should be ignored. This # is a count of how many ignores are left. ignore_branch = 0 + # We have to handle the last two bytecodes specially. + ult = penult = None + for bc in ByteCodes(self.code.co_code): - # Maybe have to start a new block + # Maybe have to start a new chunk if bc.offset in bytes_lines_map: + # Start a new chunk for each source line number. if chunk: chunk.exits.add(bc.offset) chunk = Chunk(bc.offset, bytes_lines_map[bc.offset]) chunks.append(chunk) - + elif bc.op in OPS_CHUNK_BEGIN: + # Jumps deserve their own unnumbered chunk. This fixes + # problems with jumps to jumps getting confused. + if chunk: + chunk.exits.add(bc.offset) + chunk = Chunk(bc.offset) + chunks.append(chunk) + if not chunk: chunk = Chunk(bc.offset) chunks.append(chunk) - # Look at the opcode + # Look at the opcode if bc.jump_to >= 0 and bc.op not in OPS_NO_JUMP: if ignore_branch: # Someone earlier wanted us to ignore this branch. @@ -406,10 +431,10 @@ class ByteParser(object): else: # The opcode has a jump, it's an exit for this chunk. chunk.exits.add(bc.jump_to) - + if bc.op in OPS_CODE_END: # The opcode can exit the code object. - chunk.exits.add(-1) + chunk.exits.add(-self.code.co_firstlineno) if bc.op in OPS_PUSH_BLOCK: # The opcode adds a block to the block_stack. block_stack.append((bc.op, bc.jump_to)) @@ -438,8 +463,32 @@ class ByteParser(object): # This is an except clause. We want to overlook the next # branch, so that except's don't count as branches. ignore_branch += 1 - + + penult = ult + ult = bc + + if chunks: + # The last two bytecodes could be a dummy "return None" that + # shouldn't be counted as real code. Every Python code object seems + # to end with a return, and a "return None" is inserted if there + # isn't an explicit return in the source. + if ult and penult: + if penult.op == OP_LOAD_CONST and ult.op == OP_RETURN_VALUE: + if self.code.co_consts[penult.arg] is None: + # This is "return None", but is it dummy? A real line + # would be a last chunk all by itself. + if chunks[-1].byte != penult.offset: + exit = -self.code.co_firstlineno + # Split the last chunk + last_chunk = chunks[-1] + last_chunk.exits.remove(exit) + last_chunk.exits.add(penult.offset) + chunk = Chunk(penult.offset) + chunk.exits.add(exit) + chunks.append(chunk) + + # Give all the chunks a length. chunks[-1].length = bc.next_offset - chunks[-1].byte for i in range(len(chunks)-1): chunks[i].length = chunks[i+1].byte - chunks[i].byte @@ -448,35 +497,35 @@ class ByteParser(object): def _arcs(self): """Find the executable arcs in the code. - + Returns a set of pairs, (from,to). From and to are integer line - numbers. If from is -1, then the arc is an entrance into the code - object. If to is -1, the arc is an exit from the code object. - + numbers. If from is < 0, then the arc is an entrance into the code + object. If to is < 0, the arc is an exit from the code object. + """ chunks = self._split_into_chunks() - + # A map from byte offsets to chunks jumped into. byte_chunks = dict([(c.byte, c) for c in chunks]) # Build a map from byte offsets to actual lines reached. - byte_lines = {-1:[-1]} + byte_lines = {} bytes_to_add = set([c.byte for c in chunks]) - + while bytes_to_add: byte_to_add = bytes_to_add.pop() - if byte_to_add in byte_lines or byte_to_add == -1: + if byte_to_add in byte_lines or byte_to_add < 0: continue - + # Which lines does this chunk lead to? bytes_considered = set() bytes_to_consider = [byte_to_add] lines = set() - + while bytes_to_consider: byte = bytes_to_consider.pop() bytes_considered.add(byte) - + # Find chunk for byte try: ch = byte_chunks[byte] @@ -488,89 +537,94 @@ class ByteParser(object): # No chunk for this byte! raise Exception("Couldn't find chunk @ %d" % byte) byte_chunks[byte] = ch - + if ch.line: lines.add(ch.line) else: for ex in ch.exits: - if ex == -1: - lines.add(-1) + if ex < 0: + lines.add(ex) elif ex not in bytes_considered: bytes_to_consider.append(ex) bytes_to_add.update(ch.exits) byte_lines[byte_to_add] = lines - + # Figure out for each chunk where the exits go. arcs = set() for chunk in chunks: if chunk.line: for ex in chunk.exits: - for exit_line in byte_lines[ex]: + if ex < 0: + exit_lines = [ex] + else: + exit_lines = byte_lines[ex] + for exit_line in exit_lines: if chunk.line != exit_line: arcs.add((chunk.line, exit_line)) for line in byte_lines[0]: arcs.add((-1, line)) - + return arcs - + def _all_chunks(self): """Returns a list of `Chunk` objects for this code and its children. - + See `_split_into_chunks` for details. - + """ chunks = [] for bp in self.child_parsers(): chunks.extend(bp._split_into_chunks()) - + return chunks def _all_arcs(self): """Get the set of all arcs in this code object and its children. - + See `_arcs` for details. - + """ arcs = set() for bp in self.child_parsers(): arcs.update(bp._arcs()) - + return arcs class Chunk(object): """A sequence of bytecodes with a single entrance. - + To analyze byte code, we have to divide it into chunks, sequences of byte codes such that each basic block has only one entrance, the first - instruction in the block. - + instruction in the block. + This is almost the CS concept of `basic block`_, except that we're willing to have many exits from a chunk, and "basic block" is a more cumbersome term. - + .. _basic block: http://en.wikipedia.org/wiki/Basic_block - - An exit of -1 means the chunk can leave the code (return). - + + An exit < 0 means the chunk can leave the code (return). The exit is + the negative of the starting line number of the code block. + """ def __init__(self, byte, line=0): self.byte = byte self.line = line self.length = 0 self.exits = set() - + def __repr__(self): return "<%d+%d @%d %r>" % ( self.byte, self.length, self.line, list(self.exits) ) -class AdHocMain(object): +class AdHocMain(object): # pragma: no cover """An ad-hoc main for code parsing experiments.""" - + def main(self, args): """A main function for trying the code from the command line.""" @@ -597,7 +651,7 @@ class AdHocMain(object): "-t", action="store_true", dest="tokens", help="Show tokens" ) - + options, args = parser.parse_args() if options.recursive: if args: @@ -612,12 +666,12 @@ class AdHocMain(object): def adhoc_one_file(self, options, filename): """Process just one file.""" - + if options.dis or options.chunks: try: bp = ByteParser(filename=filename) except CoverageException: - _, err, _ = sys.exc_info() + _, err, _ = sys.exc_info() print("%s" % (err,)) return @@ -644,7 +698,7 @@ class AdHocMain(object): arc_width, arc_chars = self.arc_ascii_art(arcs) else: arc_width, arc_chars = 0, {} - + exit_counts = cp.exit_counts() for i, ltext in enumerate(cp.lines): @@ -668,19 +722,19 @@ class AdHocMain(object): def arc_ascii_art(self, arcs): """Draw arcs as ascii art. - + Returns a width of characters needed to draw all the arcs, and a dictionary mapping line numbers to ascii strings to draw for that line. - + """ arc_chars = {} for lfrom, lto in sorted(arcs): - if lfrom == -1: + if lfrom < 0: arc_chars[lto] = arc_chars.get(lto, '') + 'v' - elif lto == -1: + elif lto < 0: arc_chars[lfrom] = arc_chars.get(lfrom, '') + '^' else: - if lfrom == lto-1: + if lfrom == lto - 1: # Don't show obvious arcs. continue if lfrom < lto: diff --git a/coverage/phystokens.py b/coverage/phystokens.py index 2862490f..60b87932 100644 --- a/coverage/phystokens.py +++ b/coverage/phystokens.py @@ -5,16 +5,17 @@ from coverage.backward import StringIO # pylint: disable-msg=W0622 def phys_tokens(toks): """Return all physical tokens, even line continuations. - + tokenize.generate_tokens() doesn't return a token for the backslash that continues lines. This wrapper provides those tokens so that we can re-create a faithful representation of the original source. - + Returns the same values as generate_tokens() - + """ last_line = None last_lineno = -1 + last_ttype = None for ttype, ttext, (slineno, scol), (elineno, ecol), ltext in toks: if last_lineno != elineno: if last_line and last_line[-2:] == "\\\n": @@ -34,7 +35,11 @@ def phys_tokens(toks): # so we need to figure out if the backslash is already in the # string token or not. inject_backslash = True - if ttype == token.STRING: + if last_ttype == tokenize.COMMENT: + # Comments like this \ + # should never result in a new token. + inject_backslash = False + elif ttype == token.STRING: if "\n" in ttext and ttext.split('\n', 1)[0][-1] == '\\': # It's a multiline string and the first line ends with # a backslash, so we don't need to inject another. @@ -49,19 +54,20 @@ def phys_tokens(toks): last_line ) last_line = ltext + last_ttype = ttype yield ttype, ttext, (slineno, scol), (elineno, ecol), ltext last_lineno = elineno def source_token_lines(source): """Generate a series of lines, one for each line in `source`. - + Each line is a list of pairs, each pair is a token:: - + [('key', 'def'), ('ws', ' '), ('nam', 'hello'), ('op', '('), ... ] Each pair has a token class, and the token text. - + If you concatenate all the token texts, and then join them with newlines, you should have your original `source` back, with two differences: trailing whitespace is not preserved, and a final line with no newline @@ -71,7 +77,8 @@ def source_token_lines(source): ws_tokens = [token.INDENT, token.DEDENT, token.NEWLINE, tokenize.NL] line = [] col = 0 - tokgen = tokenize.generate_tokens(StringIO(source.expandtabs(8)).readline) + source = source.expandtabs(8).replace('\r\n', '\n') + tokgen = tokenize.generate_tokens(StringIO(source).readline) for ttype, ttext, (_, scol), (_, ecol), _ in phys_tokens(tokgen): mark_start = True for part in re.split('(\n)', ttext): diff --git a/coverage/report.py b/coverage/report.py index 7f3e3e02..a676e186 100644 --- a/coverage/report.py +++ b/coverage/report.py @@ -2,48 +2,59 @@ import os from coverage.codeunit import code_unit_factory -from coverage.misc import NoSource +from coverage.misc import CoverageException, NoSource class Reporter(object): """A base class for all reporters.""" - + def __init__(self, coverage, ignore_errors=False): """Create a reporter. - + `coverage` is the coverage instance. `ignore_errors` controls how skittish the reporter will be during file processing. """ self.coverage = coverage self.ignore_errors = ignore_errors - + # The code units to report on. Set by find_code_units. self.code_units = [] - + # The directory into which to place the report, used by some derived # classes. self.directory = None - def find_code_units(self, morfs, omit_prefixes): + def find_code_units(self, morfs, omit_prefixes, include_prefixes): """Find the code units we'll report on. - + `morfs` is a list of modules or filenames. `omit_prefixes` is a list of prefixes to leave out of the list. - + + See `coverage.report()` for other arguments. + """ morfs = morfs or self.coverage.data.executed_files() self.code_units = code_unit_factory( - morfs, self.coverage.file_locator, omit_prefixes) + morfs, self.coverage.file_locator, omit_prefixes, + include_prefixes + ) self.code_units.sort() def report_files(self, report_fn, morfs, directory=None, - omit_prefixes=None): + omit_prefixes=None, include_prefixes=None): """Run a reporting function on a number of morfs. - + `report_fn` is called for each relative morf in `morfs`. - + + `include_prefixes` is a list of filename prefixes. CodeUnits that match + those prefixes will be included in the list. CodeUnits that match + `omit_prefixes` will be omitted from the list. + """ - self.find_code_units(morfs, omit_prefixes) + self.find_code_units(morfs, omit_prefixes, include_prefixes) + + if not self.code_units: + raise CoverageException("No data to report.") self.directory = directory if self.directory and not os.path.exists(self.directory): diff --git a/coverage/results.py b/coverage/results.py index 77c461ad..e80ec0a4 100644 --- a/coverage/results.py +++ b/coverage/results.py @@ -9,11 +9,11 @@ from coverage.parser import CodeParser class Analysis(object): """The results of analyzing a code unit.""" - + def __init__(self, cov, code_unit): self.coverage = cov self.code_unit = code_unit - + self.filename = self.code_unit.filename ext = os.path.splitext(self.filename)[1] source = None @@ -40,10 +40,10 @@ class Analysis(object): n_missing_branches = sum([len(v) for v in mba.values()]) else: n_branches = n_missing_branches = 0 - + self.numbers = Numbers( n_files=1, - n_statements=len(self.statements), + n_statements=len(self.statements), n_excluded=len(self.excluded), n_missing=len(self.missing), n_branches=n_branches, @@ -52,9 +52,9 @@ class Analysis(object): def missing_formatted(self): """The missing line numbers, formatted nicely. - + Returns a string like "1-2, 5-11, 13-14". - + """ return format_lines(self.statements, self.missing) @@ -102,12 +102,12 @@ class Analysis(object): """How many total branches are there?""" exit_counts = self.parser.exit_counts() return sum([count for count in exit_counts.values() if count > 1]) - + def missing_branch_arcs(self): """Return arcs that weren't executed from branch lines. - + Returns {l1:[l2a,l2b,...], ...} - + """ missing = self.arcs_missing() branch_lines = set(self.branch_lines()) @@ -122,7 +122,7 @@ class Analysis(object): class Numbers(object): """The numerical results of measuring coverage. - + This holds the basic statistics from `Analysis`, and is used to roll up statistics across files. @@ -141,12 +141,12 @@ class Numbers(object): """Returns the number of executed statements.""" return self.n_statements - self.n_missing n_executed = property(_get_n_executed) - + def _get_n_executed_branches(self): """Returns the number of executed branches.""" return self.n_branches - self.n_missing_branches n_executed_branches = property(_get_n_executed_branches) - + def _get_pc_covered(self): """Returns a single percentage value for coverage.""" if self.n_statements > 0: diff --git a/coverage/summary.py b/coverage/summary.py index e0e9eba7..89b31020 100644 --- a/coverage/summary.py +++ b/coverage/summary.py @@ -8,25 +8,30 @@ from coverage.results import Numbers class SummaryReporter(Reporter): """A reporter for writing the summary report.""" - + def __init__(self, coverage, show_missing=True, ignore_errors=False): super(SummaryReporter, self).__init__(coverage, ignore_errors) self.show_missing = show_missing self.branches = coverage.data.has_arcs() - def report(self, morfs, omit_prefixes=None, outfile=None): - """Writes a report summarizing coverage statistics per module.""" - - self.find_code_units(morfs, omit_prefixes) + def report(self, morfs, omit_prefixes=None, outfile=None, + include_prefixes=None + ): + """Writes a report summarizing coverage statistics per module. + + See `coverage.report()` for other arguments. + + """ + self.find_code_units(morfs, omit_prefixes, include_prefixes) # Prepare the formatting strings max_name = max([len(cu.name) for cu in self.code_units] + [5]) fmt_name = "%%- %ds " % max_name fmt_err = "%s %s: %s\n" - header = (fmt_name % "Name") + " Stmts Exec" + header = (fmt_name % "Name") + " Stmts Miss" fmt_coverage = fmt_name + "%6d %6d" if self.branches: - header += " Branch BrExec" + header += " Branch BrPart" fmt_coverage += " %6d %6d" header += " Cover" fmt_coverage += " %5d%%" @@ -45,20 +50,20 @@ class SummaryReporter(Reporter): outfile.write(rule) total = Numbers() - + for cu in self.code_units: try: analysis = self.coverage._analyze(cu) nums = analysis.numbers - args = (cu.name, nums.n_statements, nums.n_executed) + args = (cu.name, nums.n_statements, nums.n_missing) if self.branches: - args += (nums.n_branches, nums.n_executed_branches) + args += (nums.n_branches, nums.n_missing_branches) args += (nums.pc_covered,) if self.show_missing: args += (analysis.missing_formatted(),) outfile.write(fmt_coverage % args) total += nums - except KeyboardInterrupt: #pragma: no cover + except KeyboardInterrupt: # pragma: no cover raise except: if not self.ignore_errors: @@ -67,9 +72,9 @@ class SummaryReporter(Reporter): if total.n_files > 1: outfile.write(rule) - args = ("TOTAL", total.n_statements, total.n_executed) + args = ("TOTAL", total.n_statements, total.n_missing) if self.branches: - args += (total.n_branches, total.n_executed_branches) + args += (total.n_branches, total.n_missing_branches) args += (total.pc_covered,) if self.show_missing: args += ("",) diff --git a/coverage/templite.py b/coverage/templite.py index f61fbdca..c39e061e 100644 --- a/coverage/templite.py +++ b/coverage/templite.py @@ -2,46 +2,46 @@ # Coincidentally named the same as http://code.activestate.com/recipes/496702/ -import re +import re, sys class Templite(object): """A simple template renderer, for a nano-subset of Django syntax. Supported constructs are extended variable access:: - + {{var.modifer.modifier|filter|filter}} - + loops:: - + {% for var in list %}...{% endfor %} - + and ifs:: - + {% if var %}...{% endif %} Comments are within curly-hash markers:: - + {# This will be ignored #} Construct a Templite with the template text, then use `render` against a dictionary context to create a finished string. - + """ def __init__(self, text, *contexts): """Construct a Templite with the given `text`. - + `contexts` are dictionaries of values to use for future renderings. These are good for filters and global values. - + """ self.text = text self.context = {} for context in contexts: self.context.update(context) - + # Split the text to form a list of tokens. toks = re.split(r"(?s)({{.*?}}|{%.*?%}|{#.*?#})", text) - + # Parse the tokens into a nested list of operations. Each item in the # list is a tuple with an opcode, and arguments. They'll be # interpreted by TempliteEngine. @@ -80,47 +80,53 @@ class Templite(object): ops = ops_stack.pop() assert ops[-1][0] == words[0][3:] else: - raise Exception("Don't understand tag %r" % words) + raise SyntaxError("Don't understand tag %r" % words) else: ops.append(('lit', tok)) - + assert not ops_stack, "Unmatched action tag: %r" % ops_stack[-1][0] self.ops = ops def render(self, context=None): """Render this template by applying it to `context`. - + `context` is a dictionary of values to use in this rendering. - + """ # Make the complete context we'll use. ctx = dict(self.context) if context: ctx.update(context) - + # Run it through an engine, and return the result. engine = _TempliteEngine(ctx) engine.execute(self.ops) - return engine.result + return "".join(engine.result) class _TempliteEngine(object): """Executes Templite objects to produce strings.""" def __init__(self, context): self.context = context - self.result = "" + self.result = [] def execute(self, ops): """Execute `ops` in the engine. - + Called recursively for the bodies of if's and loops. - + """ for op, args in ops: if op == 'lit': - self.result += args + self.result.append(args) elif op == 'exp': - self.result += str(self.evaluate(args)) + try: + self.result.append(str(self.evaluate(args))) + except: + exc_class, exc, _ = sys.exc_info() + new_exc = exc_class("Couldn't evaluate {{ %s }}: %s" + % (args, exc)) + raise new_exc elif op == 'if': expr, body = args if self.evaluate(expr): @@ -132,13 +138,13 @@ class _TempliteEngine(object): self.context[var] = val self.execute(body) else: - raise Exception("TempliteEngine doesn't grok op %r" % op) + raise AssertionError("TempliteEngine doesn't grok op %r" % op) def evaluate(self, expr): """Evaluate an expression. - + `expr` can have pipes and dots to indicate data access and filtering. - + """ if "|" in expr: pipes = expr.split("|") diff --git a/coverage/tracer.c b/coverage/tracer.c index f05988d3..1d227295 100644 --- a/coverage/tracer.c +++ b/coverage/tracer.c @@ -6,8 +6,16 @@ #include "structmember.h"
#include "frameobject.h"
-#undef WHAT_LOG /* Define to log the WHAT params in the trace function. */
-#undef TRACE_LOG /* Define to log our bookkeeping. */
+/* Compile-time debugging helpers */
+#undef WHAT_LOG /* Define to log the WHAT params in the trace function. */
+#undef TRACE_LOG /* Define to log our bookkeeping. */
+#undef COLLECT_STATS /* Collect counters: stats are printed when tracer is stopped. */
+
+#if COLLECT_STATS
+#define STATS(x) x
+#else
+#define STATS(x)
+#endif
/* Py 2.x and 3.x compatibility */
@@ -33,6 +41,10 @@ #endif /* Py3k */
+/* The values returned to indicate ok or error. */
+#define RET_OK 0
+#define RET_ERROR -1
+
/* An entry on the data stack. For each call frame, we need to record the
dictionary to capture data, and the last line number executed in that
frame.
@@ -52,7 +64,7 @@ typedef struct { PyObject * data;
PyObject * should_trace_cache;
PyObject * arcs;
-
+
/* Has the tracer been started? */
int started;
/* Are we tracing arcs, or just lines? */
@@ -63,7 +75,7 @@ typedef struct { data for a single source file. The data stack parallels the call stack:
each call pushes the new frame's file data onto the data stack, and each
return pops file data off.
-
+
The file data is a dictionary whose form depends on the tracing options.
If tracing arcs, the keys are line number pairs. If not tracing arcs,
the keys are line numbers. In both cases, the value is irrelevant
@@ -85,7 +97,21 @@ typedef struct { /* The parent frame for the last exception event, to fix missing returns. */
PyFrameObject * last_exc_back;
-
+ int last_exc_firstlineno;
+
+#if COLLECT_STATS
+ struct {
+ unsigned int calls;
+ unsigned int lines;
+ unsigned int returns;
+ unsigned int exceptions;
+ unsigned int others;
+ unsigned int new_files;
+ unsigned int missed_returns;
+ unsigned int stack_reallocs;
+ unsigned int errors;
+ } stats;
+#endif /* COLLECT_STATS */
} Tracer;
#define STACK_DELTA 100
@@ -93,27 +119,41 @@ typedef struct { static int
Tracer_init(Tracer *self, PyObject *args, PyObject *kwds)
{
+#if COLLECT_STATS
+ self->stats.calls = 0;
+ self->stats.lines = 0;
+ self->stats.returns = 0;
+ self->stats.exceptions = 0;
+ self->stats.others = 0;
+ self->stats.new_files = 0;
+ self->stats.missed_returns = 0;
+ self->stats.stack_reallocs = 0;
+ self->stats.errors = 0;
+#endif /* COLLECT_STATS */
+
self->should_trace = NULL;
self->data = NULL;
self->should_trace_cache = NULL;
self->arcs = NULL;
-
+
self->started = 0;
self->tracing_arcs = 0;
self->depth = -1;
self->data_stack = PyMem_Malloc(STACK_DELTA*sizeof(DataStackEntry));
if (self->data_stack == NULL) {
- return -1;
+ STATS( self->stats.errors++; )
+ PyErr_NoMemory();
+ return RET_ERROR;
}
self->data_stack_alloc = STACK_DELTA;
- self->cur_file_data = NULL;
+ self->cur_file_data = NULL;
self->last_line = -1;
self->last_exc_back = NULL;
- return 0;
+ return RET_OK;
}
static void
@@ -136,7 +176,7 @@ Tracer_dealloc(Tracer *self) static const char *
indent(int n)
{
- static const char * spaces =
+ static const char * spaces =
" "
" "
" "
@@ -184,19 +224,21 @@ static const char * what_sym[] = {"CALL", "EXC ", "LINE", "RET "}; static int
Tracer_record_pair(Tracer *self, int l1, int l2)
{
- int ret = 0;
-
+ int ret = RET_OK;
+
PyObject * t = PyTuple_New(2);
if (t != NULL) {
PyTuple_SET_ITEM(t, 0, MyInt_FromLong(l1));
PyTuple_SET_ITEM(t, 1, MyInt_FromLong(l2));
if (PyDict_SetItem(self->cur_file_data, t, Py_None) < 0) {
- ret = -1;
+ STATS( self->stats.errors++; )
+ ret = RET_ERROR;
}
Py_DECREF(t);
}
else {
- ret = -1;
+ STATS( self->stats.errors++; )
+ ret = RET_ERROR;
}
return ret;
}
@@ -207,14 +249,15 @@ Tracer_record_pair(Tracer *self, int l1, int l2) static int
Tracer_trace(Tracer *self, PyFrameObject *frame, int what, PyObject *arg)
{
+ int ret = RET_OK;
PyObject * filename = NULL;
PyObject * tracename = NULL;
- #if WHAT_LOG
+ #if WHAT_LOG
if (what <= sizeof(what_sym)/sizeof(const char *)) {
printf("trace: %s @ %s %d\n", what_sym[what], MyText_AS_STRING(frame->f_code->co_filename), frame->f_lineno);
}
- #endif
+ #endif
#if TRACE_LOG
if (strstr(MyText_AS_STRING(frame->f_code->co_filename), start_file) && frame->f_lineno == start_line) {
@@ -231,14 +274,15 @@ Tracer_trace(Tracer *self, PyFrameObject *frame, int what, PyObject *arg) that frame is gone. Our handling for RETURN doesn't need the
actual frame, but we do log it, so that will look a little off if
you're looking at the detailed log.
-
+
If someday we need to examine the frame when doing RETURN, then
we'll need to keep more of the missed frame's state.
*/
+ STATS( self->stats.missed_returns++; )
if (self->depth >= 0) {
if (self->tracing_arcs && self->cur_file_data) {
- if (Tracer_record_pair(self, self->last_line, -1) < 0) {
- return -1;
+ if (Tracer_record_pair(self, self->last_line, -self->last_exc_firstlineno) < 0) {
+ return RET_ERROR;
}
}
SHOWLOG(self->depth, frame->f_lineno, frame->f_code->co_filename, "missedreturn");
@@ -249,19 +293,23 @@ Tracer_trace(Tracer *self, PyFrameObject *frame, int what, PyObject *arg) }
self->last_exc_back = NULL;
}
-
+
switch (what) {
case PyTrace_CALL: /* 0 */
+ STATS( self->stats.calls++; )
/* Grow the stack. */
self->depth++;
if (self->depth >= self->data_stack_alloc) {
+ STATS( self->stats.stack_reallocs++; )
/* We've outgrown our data_stack array: make it bigger. */
int bigger = self->data_stack_alloc + STACK_DELTA;
DataStackEntry * bigger_data_stack = PyMem_Realloc(self->data_stack, bigger * sizeof(DataStackEntry));
if (bigger_data_stack == NULL) {
+ STATS( self->stats.errors++; )
+ PyErr_NoMemory();
self->depth--;
- return -1;
+ return RET_ERROR;
}
self->data_stack = bigger_data_stack;
self->data_stack_alloc = bigger;
@@ -275,6 +323,7 @@ Tracer_trace(Tracer *self, PyFrameObject *frame, int what, PyObject *arg) filename = frame->f_code->co_filename;
tracename = PyDict_GetItem(self->should_trace_cache, filename);
if (tracename == NULL) {
+ STATS( self->stats.new_files++; )
/* We've never considered this file before. */
/* Ask should_trace about it. */
PyObject * args = Py_BuildValue("(OO)", filename, frame);
@@ -282,9 +331,13 @@ Tracer_trace(Tracer *self, PyFrameObject *frame, int what, PyObject *arg) Py_DECREF(args);
if (tracename == NULL) {
/* An error occurred inside should_trace. */
- return -1;
+ STATS( self->stats.errors++; )
+ return RET_ERROR;
+ }
+ if (PyDict_SetItem(self->should_trace_cache, filename, tracename) < 0) {
+ STATS( self->stats.errors++; )
+ return RET_ERROR;
}
- PyDict_SetItem(self->should_trace_cache, filename, tracename);
}
else {
Py_INCREF(tracename);
@@ -295,8 +348,16 @@ Tracer_trace(Tracer *self, PyFrameObject *frame, int what, PyObject *arg) PyObject * file_data = PyDict_GetItem(self->data, tracename);
if (file_data == NULL) {
file_data = PyDict_New();
- PyDict_SetItem(self->data, tracename, file_data);
+ if (file_data == NULL) {
+ STATS( self->stats.errors++; )
+ return RET_ERROR;
+ }
+ ret = PyDict_SetItem(self->data, tracename, file_data);
Py_DECREF(file_data);
+ if (ret < 0) {
+ STATS( self->stats.errors++; )
+ return RET_ERROR;
+ }
}
self->cur_file_data = file_data;
SHOWLOG(self->depth, frame->f_lineno, filename, "traced");
@@ -305,18 +366,20 @@ Tracer_trace(Tracer *self, PyFrameObject *frame, int what, PyObject *arg) self->cur_file_data = NULL;
SHOWLOG(self->depth, frame->f_lineno, filename, "skipped");
}
-
+
Py_DECREF(tracename);
self->last_line = -1;
break;
-
+
case PyTrace_RETURN: /* 3 */
+ STATS( self->stats.returns++; )
/* A near-copy of this code is above in the missing-return handler. */
if (self->depth >= 0) {
if (self->tracing_arcs && self->cur_file_data) {
- if (Tracer_record_pair(self, self->last_line, -1) < 0) {
- return -1;
+ int first = frame->f_code->co_firstlineno;
+ if (Tracer_record_pair(self, self->last_line, -first) < 0) {
+ return RET_ERROR;
}
}
@@ -326,8 +389,9 @@ Tracer_trace(Tracer *self, PyFrameObject *frame, int what, PyObject *arg) self->depth--;
}
break;
-
+
case PyTrace_LINE: /* 2 */
+ STATS( self->stats.lines++; )
if (self->depth >= 0) {
SHOWLOG(self->depth, frame->f_lineno, frame->f_code->co_filename, "line");
if (self->cur_file_data) {
@@ -335,38 +399,54 @@ Tracer_trace(Tracer *self, PyFrameObject *frame, int what, PyObject *arg) if (self->tracing_arcs) {
/* Tracing arcs: key is (last_line,this_line). */
if (Tracer_record_pair(self, self->last_line, frame->f_lineno) < 0) {
- return -1;
+ return RET_ERROR;
}
}
else {
/* Tracing lines: key is simply this_line. */
- PyDict_SetItem(self->cur_file_data, MyInt_FromLong(frame->f_lineno), Py_None);
+ PyObject * this_line = MyInt_FromLong(frame->f_lineno);
+ if (this_line == NULL) {
+ STATS( self->stats.errors++; )
+ return RET_ERROR;
+ }
+ ret = PyDict_SetItem(self->cur_file_data, this_line, Py_None);
+ Py_DECREF(this_line);
+ if (ret < 0) {
+ STATS( self->stats.errors++; )
+ return RET_ERROR;
+ }
}
}
self->last_line = frame->f_lineno;
}
break;
-
+
case PyTrace_EXCEPTION:
/* Some code (Python 2.3, and pyexpat anywhere) fires an exception event
without a return event. To detect that, we'll keep a copy of the
parent frame for an exception event. If the next event is in that
frame, then we must have returned without a return event. We can
synthesize the missing event then.
-
+
Python itself fixed this problem in 2.4. Pyexpat still has the bug.
I've reported the problem with pyexpat as http://bugs.python.org/issue6359 .
If it gets fixed, this code should still work properly. Maybe some day
the bug will be fixed everywhere coverage.py is supported, and we can
remove this missing-return detection.
-
+
More about this fix: http://nedbatchelder.com/blog/200907/a_nasty_little_bug.html
*/
+ STATS( self->stats.exceptions++; )
self->last_exc_back = frame->f_back;
+ self->last_exc_firstlineno = frame->f_code->co_firstlineno;
+ break;
+
+ default:
+ STATS( self->stats.others++; )
break;
}
- return 0;
+ return RET_OK;
}
static PyObject *
@@ -391,6 +471,28 @@ Tracer_stop(Tracer *self, PyObject *args) return Py_BuildValue("");
}
+static PyObject *
+Tracer_get_stats(Tracer *self)
+{
+#if COLLECT_STATS
+ return Py_BuildValue(
+ "{sI,sI,sI,sI,sI,sI,sI,sI,si,sI}",
+ "calls", self->stats.calls,
+ "lines", self->stats.lines,
+ "returns", self->stats.returns,
+ "exceptions", self->stats.exceptions,
+ "others", self->stats.others,
+ "new_files", self->stats.new_files,
+ "missed_returns", self->stats.missed_returns,
+ "stack_reallocs", self->stats.stack_reallocs,
+ "stack_alloc", self->data_stack_alloc,
+ "errors", self->stats.errors
+ );
+#else
+ return Py_BuildValue("");
+#endif /* COLLECT_STATS */
+}
+
static PyMemberDef
Tracer_members[] = {
{ "should_trace", T_OBJECT, offsetof(Tracer, should_trace), 0,
@@ -410,12 +512,15 @@ Tracer_members[] = { static PyMethodDef
Tracer_methods[] = {
- { "start", (PyCFunction) Tracer_start, METH_VARARGS,
+ { "start", (PyCFunction) Tracer_start, METH_VARARGS,
PyDoc_STR("Start the tracer") },
- { "stop", (PyCFunction) Tracer_stop, METH_VARARGS,
+ { "stop", (PyCFunction) Tracer_stop, METH_VARARGS,
PyDoc_STR("Stop the tracer") },
+ { "get_stats", (PyCFunction) Tracer_get_stats, METH_VARARGS,
+ PyDoc_STR("Get statistics about the tracing") },
+
{ NULL }
};
@@ -488,7 +593,7 @@ PyInit_tracer(void) if (mod == NULL) {
return NULL;
}
-
+
TracerType.tp_new = PyType_GenericNew;
if (PyType_Ready(&TracerType) < 0) {
Py_DECREF(mod);
@@ -497,8 +602,8 @@ PyInit_tracer(void) Py_INCREF(&TracerType);
PyModule_AddObject(mod, "Tracer", (PyObject *)&TracerType);
-
- return mod;
+
+ return mod;
}
#else
diff --git a/coverage/xmlreport.py b/coverage/xmlreport.py index 0fe43712..17d9fd5f 100644 --- a/coverage/xmlreport.py +++ b/coverage/xmlreport.py @@ -14,23 +14,26 @@ def rate(hit, num): class XmlReporter(Reporter): """A reporter for writing Cobertura-style XML coverage results.""" - + def __init__(self, coverage, ignore_errors=False): super(XmlReporter, self).__init__(coverage, ignore_errors) - + self.packages = None self.xml_out = None + self.arcs = coverage.data.has_arcs() - def report(self, morfs, omit_prefixes=None, outfile=None): + def report(self, morfs, omit_prefixes=None, include_prefixes=None, + outfile=None + ): """Generate a Cobertura-compatible XML report for `morfs`. - - `morfs` is a list of modules or filenames. `omit_prefixes` is a list - of strings, prefixes of modules to omit from the report. - + + `morfs` is a list of modules or filenames. + + See `coverage.report()` for other arguments. + """ # Initial setup. outfile = outfile or sys.stdout - self.find_code_units(morfs, omit_prefixes) # Create the DOM that will store the data. impl = xml.dom.minidom.getDOMImplementation() @@ -39,8 +42,9 @@ class XmlReporter(Reporter): "http://cobertura.sourceforge.net/xml/coverage-03.dtd" ) self.xml_out = impl.createDocument(None, "coverage", docType) - xcoverage = self.xml_out.documentElement + # Write header stuff. + xcoverage = self.xml_out.documentElement xcoverage.setAttribute("version", __version__) xcoverage.setAttribute("timestamp", str(int(time.time()*1000))) xcoverage.appendChild(self.xml_out.createComment( @@ -48,13 +52,17 @@ class XmlReporter(Reporter): )) xpackages = self.xml_out.createElement("packages") xcoverage.appendChild(xpackages) - self.packages = {} - self.report_files(self.xml_file, morfs, omit_prefixes=omit_prefixes) + # Call xml_file for each file in the data. + self.packages = {} + self.report_files( + self.xml_file, morfs, omit_prefixes=omit_prefixes, + include_prefixes=include_prefixes + ) lnum_tot, lhits_tot = 0, 0 bnum_tot, bhits_tot = 0, 0 - + # Populate the XML DOM with the package info. for pkg_name, pkg_data in self.packages.items(): class_elts, lhits, lnum, bhits, bnum = pkg_data @@ -73,16 +81,16 @@ class XmlReporter(Reporter): lhits_tot += lhits bnum_tot += bnum bhits_tot += bhits - + xcoverage.setAttribute("line-rate", str(rate(lhits_tot, lnum_tot))) xcoverage.setAttribute("branch-rate", str(rate(bhits_tot, bnum_tot))) - + # Use the DOM to write the output file. outfile.write(self.xml_out.toprettyxml()) def xml_file(self, cu, analysis): """Add to the XML report for a single file.""" - + # Create the 'lines' and 'package' XML elements, which # are populated later. Note that a package == a directory. dirname, fname = os.path.split(cu.name) @@ -101,26 +109,36 @@ class XmlReporter(Reporter): xclass.setAttribute("filename", cu.name + ext) xclass.setAttribute("complexity", "0.0") + branch_lines = analysis.branch_lines() + # For each statement, create an XML 'line' element. for line in analysis.statements: - l = self.xml_out.createElement("line") - l.setAttribute("number", str(line)) + xline = self.xml_out.createElement("line") + xline.setAttribute("number", str(line)) - # Q: can we get info about the number of times - # a statement is executed? If so, that should be - # recorded here. - l.setAttribute("hits", str(int(not line in analysis.missing))) + # Q: can we get info about the number of times a statement is + # executed? If so, that should be recorded here. + xline.setAttribute("hits", str(int(not line in analysis.missing))) - # Q: can we get info about whether this statement - # is a branch? If so, that data should be - # used here. - #l.setAttribute("branch", "false") - xlines.appendChild(l) + if self.arcs: + if line in branch_lines: + xline.setAttribute("branch", "true") + xlines.appendChild(xline) class_lines = 1.0 * len(analysis.statements) class_hits = class_lines - len(analysis.missing) - class_branches = 0.0 - class_branch_hits = 0.0 + + if self.arcs: + # We assume here that every branch line has 2 exits, which is + # usually true. In theory, though, we could have a branch line + # with more exits.. + class_branches = 2.0 * len(branch_lines) + missed_branch_targets = analysis.missing_branch_arcs().values() + missing_branches = sum([len(b) for b in missed_branch_targets]) + class_branch_hits = class_branches - missing_branches + else: + class_branches = 0.0 + class_branch_hits = 0.0 # Finalize the statistics that are collected in the XML DOM. line_rate = rate(class_hits, class_lines) diff --git a/distribute_setup.py b/distribute_setup.py new file mode 100644 index 00000000..cfb3bbef --- /dev/null +++ b/distribute_setup.py @@ -0,0 +1,458 @@ +#!python +"""Bootstrap distribute installation + +If you want to use setuptools in your package's setup.py, just include this +file in the same directory with it, and add this to the top of your setup.py:: + + from distribute_setup import use_setuptools + use_setuptools() + +If you want to require a specific version of setuptools, set a download +mirror, or use an alternate download directory, you can do so by supplying +the appropriate options to ``use_setuptools()``. + +This file can also be run as a script to install or upgrade setuptools. +""" +import os +import sys +import time +import fnmatch +import tempfile +import tarfile +from distutils import log + +try: + from site import USER_SITE +except ImportError: + USER_SITE = None + +try: + import subprocess + + def _python_cmd(*args): + args = (sys.executable,) + args + return subprocess.call(args) == 0 + +except ImportError: + # will be used for python 2.3 + def _python_cmd(*args): + args = (sys.executable,) + args + # quoting arguments if windows + if sys.platform == 'win32': + def quote(arg): + if ' ' in arg: + return '"%s"' % arg + return arg + args = [quote(arg) for arg in args] + return os.spawnl(os.P_WAIT, sys.executable, *args) == 0 + +DEFAULT_VERSION = "0.6.8" +DEFAULT_URL = "http://pypi.python.org/packages/source/d/distribute/" +SETUPTOOLS_PKG_INFO = """\ +Metadata-Version: 1.0 +Name: setuptools +Version: 0.6c9 +Summary: xxxx +Home-page: xxx +Author: xxx +Author-email: xxx +License: xxx +Description: xxx +""" + + +def _install(tarball): + # extracting the tarball + tmpdir = tempfile.mkdtemp() + log.warn('Extracting in %s', tmpdir) + old_wd = os.getcwd() + try: + os.chdir(tmpdir) + tar = tarfile.open(tarball) + _extractall(tar) + tar.close() + + # going in the directory + subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0]) + os.chdir(subdir) + log.warn('Now working in %s', subdir) + + # installing + log.warn('Installing Distribute') + assert _python_cmd('setup.py', 'install') + finally: + os.chdir(old_wd) + + +def _build_egg(egg, tarball, to_dir): + # extracting the tarball + tmpdir = tempfile.mkdtemp() + log.warn('Extracting in %s', tmpdir) + old_wd = os.getcwd() + try: + os.chdir(tmpdir) + tar = tarfile.open(tarball) + _extractall(tar) + tar.close() + + # going in the directory + subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0]) + os.chdir(subdir) + log.warn('Now working in %s', subdir) + + # building an egg + log.warn('Building a Distribute egg in %s', to_dir) + _python_cmd('setup.py', '-q', 'bdist_egg', '--dist-dir', to_dir) + + finally: + os.chdir(old_wd) + # returning the result + log.warn(egg) + if not os.path.exists(egg): + raise IOError('Could not build the egg.') + + +def _do_download(version, download_base, to_dir, download_delay): + egg = os.path.join(to_dir, 'distribute-%s-py%d.%d.egg' + % (version, sys.version_info[0], sys.version_info[1])) + if not os.path.exists(egg): + tarball = download_setuptools(version, download_base, + to_dir, download_delay) + _build_egg(egg, tarball, to_dir) + sys.path.insert(0, egg) + import setuptools + setuptools.bootstrap_install_from = egg + + +def use_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, + to_dir=os.curdir, download_delay=15, no_fake=True): + # making sure we use the absolute path + to_dir = os.path.abspath(to_dir) + was_imported = 'pkg_resources' in sys.modules or \ + 'setuptools' in sys.modules + try: + try: + import pkg_resources + if not hasattr(pkg_resources, '_distribute'): + if not no_fake: + _fake_setuptools() + raise ImportError + except ImportError: + return _do_download(version, download_base, to_dir, download_delay) + try: + pkg_resources.require("distribute>="+version) + return + except pkg_resources.VersionConflict: + e = sys.exc_info()[1] + if was_imported: + sys.stderr.write( + "The required version of distribute (>=%s) is not available,\n" + "and can't be installed while this script is running. Please\n" + "install a more recent version first, using\n" + "'easy_install -U distribute'." + "\n\n(Currently using %r)\n" % (version, e.args[0])) + sys.exit(2) + else: + del pkg_resources, sys.modules['pkg_resources'] # reload ok + return _do_download(version, download_base, to_dir, + download_delay) + except pkg_resources.DistributionNotFound: + return _do_download(version, download_base, to_dir, + download_delay) + finally: + if not no_fake: + _create_fake_setuptools_pkg_info(to_dir) + +def download_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, + to_dir=os.curdir, delay=15): + """Download distribute from a specified location and return its filename + + `version` should be a valid distribute version number that is available + as an egg for download under the `download_base` URL (which should end + with a '/'). `to_dir` is the directory where the egg will be downloaded. + `delay` is the number of seconds to pause before an actual download + attempt. + """ + # making sure we use the absolute path + to_dir = os.path.abspath(to_dir) + try: + from urllib.request import urlopen + except ImportError: + from urllib2 import urlopen + tgz_name = "distribute-%s.tar.gz" % version + url = download_base + tgz_name + saveto = os.path.join(to_dir, tgz_name) + src = dst = None + if not os.path.exists(saveto): # Avoid repeated downloads + try: + log.warn("Downloading %s", url) + src = urlopen(url) + # Read/write all in one block, so we don't create a corrupt file + # if the download is interrupted. + data = src.read() + dst = open(saveto, "wb") + dst.write(data) + finally: + if src: + src.close() + if dst: + dst.close() + return os.path.realpath(saveto) + + +def _patch_file(path, content): + """Will backup the file then patch it""" + existing_content = open(path).read() + if existing_content == content: + # already patched + log.warn('Already patched.') + return False + log.warn('Patching...') + _rename_path(path) + f = open(path, 'w') + try: + f.write(content) + finally: + f.close() + return True + + +def _same_content(path, content): + return open(path).read() == content + + +def _rename_path(path): + new_name = path + '.OLD.%s' % time.time() + log.warn('Renaming %s into %s', path, new_name) + try: + from setuptools.sandbox import DirectorySandbox + def _violation(*args): + pass + DirectorySandbox._violation = _violation + except ImportError: + pass + + os.rename(path, new_name) + return new_name + + +def _remove_flat_installation(placeholder): + if not os.path.isdir(placeholder): + log.warn('Unkown installation at %s', placeholder) + return False + found = False + for file in os.listdir(placeholder): + if fnmatch.fnmatch(file, 'setuptools*.egg-info'): + found = True + break + if not found: + log.warn('Could not locate setuptools*.egg-info') + return + + log.warn('Removing elements out of the way...') + pkg_info = os.path.join(placeholder, file) + if os.path.isdir(pkg_info): + patched = _patch_egg_dir(pkg_info) + else: + patched = _patch_file(pkg_info, SETUPTOOLS_PKG_INFO) + + if not patched: + log.warn('%s already patched.', pkg_info) + return False + # now let's move the files out of the way + for element in ('setuptools', 'pkg_resources.py', 'site.py'): + element = os.path.join(placeholder, element) + if os.path.exists(element): + _rename_path(element) + else: + log.warn('Could not find the %s element of the ' + 'Setuptools distribution', element) + return True + + +def _after_install(dist): + log.warn('After install bootstrap.') + placeholder = dist.get_command_obj('install').install_purelib + _create_fake_setuptools_pkg_info(placeholder) + +def _create_fake_setuptools_pkg_info(placeholder): + if not placeholder or not os.path.exists(placeholder): + log.warn('Could not find the install location') + return + pyver = '%s.%s' % (sys.version_info[0], sys.version_info[1]) + setuptools_file = 'setuptools-0.6c9-py%s.egg-info' % pyver + pkg_info = os.path.join(placeholder, setuptools_file) + if os.path.exists(pkg_info): + log.warn('%s already exists', pkg_info) + return + log.warn('Creating %s', pkg_info) + f = open(pkg_info, 'w') + try: + f.write(SETUPTOOLS_PKG_INFO) + finally: + f.close() + pth_file = os.path.join(placeholder, 'setuptools.pth') + log.warn('Creating %s', pth_file) + f = open(pth_file, 'w') + try: + f.write(os.path.join(os.curdir, setuptools_file)) + finally: + f.close() + + +def _patch_egg_dir(path): + # let's check if it's already patched + pkg_info = os.path.join(path, 'EGG-INFO', 'PKG-INFO') + if os.path.exists(pkg_info): + if _same_content(pkg_info, SETUPTOOLS_PKG_INFO): + log.warn('%s already patched.', pkg_info) + return False + _rename_path(path) + os.mkdir(path) + os.mkdir(os.path.join(path, 'EGG-INFO')) + pkg_info = os.path.join(path, 'EGG-INFO', 'PKG-INFO') + f = open(pkg_info, 'w') + try: + f.write(SETUPTOOLS_PKG_INFO) + finally: + f.close() + return True + + +def _before_install(): + log.warn('Before install bootstrap.') + _fake_setuptools() + + +def _under_prefix(location): + if 'install' not in sys.argv: + return True + args = sys.argv[sys.argv.index('install')+1:] + for index, arg in enumerate(args): + for option in ('--root', '--prefix'): + if arg.startswith('%s=' % option): + top_dir = arg.split('root=')[-1] + return location.startswith(top_dir) + elif arg == option: + if len(args) > index: + top_dir = args[index+1] + return location.startswith(top_dir) + elif option == '--user' and USER_SITE is not None: + return location.startswith(USER_SITE) + return True + + +def _fake_setuptools(): + log.warn('Scanning installed packages') + try: + import pkg_resources + except ImportError: + # we're cool + log.warn('Setuptools or Distribute does not seem to be installed.') + return + ws = pkg_resources.working_set + try: + setuptools_dist = ws.find(pkg_resources.Requirement.parse('setuptools', + replacement=False)) + except TypeError: + # old distribute API + setuptools_dist = ws.find(pkg_resources.Requirement.parse('setuptools')) + + if setuptools_dist is None: + log.warn('No setuptools distribution found') + return + # detecting if it was already faked + setuptools_location = setuptools_dist.location + log.warn('Setuptools installation detected at %s', setuptools_location) + + # if --root or --preix was provided, and if + # setuptools is not located in them, we don't patch it + if not _under_prefix(setuptools_location): + log.warn('Not patching, --root or --prefix is installing Distribute' + ' in another location') + return + + # let's see if its an egg + if not setuptools_location.endswith('.egg'): + log.warn('Non-egg installation') + res = _remove_flat_installation(setuptools_location) + if not res: + return + else: + log.warn('Egg installation') + pkg_info = os.path.join(setuptools_location, 'EGG-INFO', 'PKG-INFO') + if (os.path.exists(pkg_info) and + _same_content(pkg_info, SETUPTOOLS_PKG_INFO)): + log.warn('Already patched.') + return + log.warn('Patching...') + # let's create a fake egg replacing setuptools one + res = _patch_egg_dir(setuptools_location) + if not res: + return + log.warn('Patched done.') + _relaunch() + + +def _relaunch(): + log.warn('Relaunching...') + # we have to relaunch the process + args = [sys.executable] + sys.argv + sys.exit(subprocess.call(args)) + + +def _extractall(self, path=".", members=None): + """Extract all members from the archive to the current working + directory and set owner, modification time and permissions on + directories afterwards. `path' specifies a different directory + to extract to. `members' is optional and must be a subset of the + list returned by getmembers(). + """ + import copy + import operator + from tarfile import ExtractError + directories = [] + + if members is None: + members = self + + for tarinfo in members: + if tarinfo.isdir(): + # Extract directories with a safe mode. + directories.append(tarinfo) + tarinfo = copy.copy(tarinfo) + tarinfo.mode = 448 # decimal for oct 0700 + self.extract(tarinfo, path) + + # Reverse sort directories. + if sys.version_info < (2, 4): + def sorter(dir1, dir2): + return cmp(dir1.name, dir2.name) + directories.sort(sorter) + directories.reverse() + else: + directories.sort(key=operator.attrgetter('name'), reverse=True) + + # Set correct owner, mtime and filemode on directories. + for tarinfo in directories: + dirpath = os.path.join(path, tarinfo.name) + try: + self.chown(tarinfo, dirpath) + self.utime(tarinfo, dirpath) + self.chmod(tarinfo, dirpath) + except ExtractError: + e = sys.exc_info()[1] + if self.errorlevel > 1: + raise + else: + self._dbg(1, "tarfile: %s" % e) + + +def main(argv, version=DEFAULT_VERSION): + """Install or upgrade setuptools and EasyInstall""" + tarball = download_setuptools() + _install(tarball) + + +if __name__ == '__main__': + main(sys.argv[1:]) diff --git a/doc/_static/neds.css b/doc/_static/neds.css index 102de98b..d1b84a82 100644 --- a/doc/_static/neds.css +++ b/doc/_static/neds.css @@ -24,13 +24,15 @@ body { } div.document { - background-color: #1c4e63; + background-color: #808080; } div.body { background-color: #ffffff; color: #000000; padding: 0 20px 30px 20px; + max-width: 650px; + margin-left: 150px; } div.footer { @@ -129,7 +131,7 @@ div.body h6 { margin: 1em 0; } -div.body h1 { margin-top: 0; font-size: 100%; } +div.body h1 { margin-top: 0; padding-top: 1em; font-size: 150%; } div.body h2 { font-size: 100%; } /* H3's are run-in with the text. */ div.body h3 { @@ -143,6 +145,13 @@ div.body h4 { font-size: 120%; } div.body h5 { font-size: 110%; } div.body h6 { font-size: 100%; } +table.field-list { + margin-left: 300px; + color: #888; + font-style: italic; + font-size: 80%; +} + a.headerlink { color: #c60f0f; font-size: 0.8em; @@ -205,3 +214,14 @@ tt { padding: 0 1px 0 1px; font-size: 0.95em; } + +li { + margin-bottom: 0.4em; +} +ul { + list-style-type: square; +} + +.external.reference em { + font-style: normal; +}
\ No newline at end of file diff --git a/doc/api.rst b/doc/api.rst index 17f74b64..fe4c3ac5 100644 --- a/doc/api.rst +++ b/doc/api.rst @@ -6,19 +6,20 @@ Coverage API :history: 20090524T134300, brand new docs. :history: 20090613T164000, final touches for 3.0 +:history: 20100221T151500, docs for 3.3 (on the plane back from PyCon) The API to coverage.py is very simple, contained in a single module called -coverage containing a single class, also called coverage. Methods on the -coverage object correspond to operations available in the command line -interface. For example, a simple use would be:: +`coverage`. Most of the interface is in a single class, also called +`coverage`. Methods on the coverage object correspond to operations available +in the command line interface. For example, a simple use would be:: import coverage - + cov = coverage.coverage() cov.start() - + # .. run your code .. - + cov.stop() cov.save() @@ -29,4 +30,13 @@ The coverage module .. module:: coverage .. autoclass:: coverage - :members: + :members: + + +Starting coverage automatically +------------------------------- + +This function is used to start coverage measurement automatically when Python +starts. See :ref:`subprocess` for details. + +.. autofunction:: process_startup diff --git a/doc/branch.rst b/doc/branch.rst index 19be019a..71681317 100644 --- a/doc/branch.rst +++ b/doc/branch.rst @@ -4,6 +4,12 @@ Branch coverage measurement =========================== +:history: 20091127T201300, new for version 3.2 + +.. highlight:: python + :linenothreshold: 5 + + Coverage.py now supports branch coverage measurement. Where a line in your program could jump to more than one next line, coverage.py tracks which of those destinations are actually visited, and flags lines that haven't visited @@ -15,36 +21,36 @@ For example:: if x: # 2 y = 10 # 3 return y # 4 - + my_partial_fn(1) - -In this code, the if on line 2 could branch to either line 3 or line 4. -Statement coverage would show all lines of the function as executed. But the -if is always true, so line 2 never jumps to line 4. Even though line 4 is -executed, coverage.py knows that it was never because of a branch from line -2. -Branch coverage would flag this code as not fully covered because of the -missing jump from line 2 to line 4. +In this code, line 2 is an ``if`` statement which can go next to either line 3 +or line 4. Statement coverage would show all lines of the function as executed. +But the if was never evaluated as false, so line 2 never jumps to line 4. + +Branch coverage will flag this code as not fully covered because of the missing +jump from line 2 to line 4. How to measure branch coverage ------------------------------ -To measure branch coverage, run coverage.py with the --branch flag:: +To measure branch coverage, run coverage.py with the ``--branch`` flag:: coverage run --branch myprog.py - -When you report on the results with "coverage report" or "coverage html", the -percentage of branch possibilities taken will be included in the percentage -covered total for each file. The coverage percentage for a file is the -actual executions divided by the execution opportunities. Each line in the -file is an execution opportunity, as is each branch destination. -Currently, only HTML reports give information about which lines had missing -branches. Lines that were missing some branches are shown in yellow, with an -annotation at the far right showing branch destination line numbers that were -not exercised. +When you report on the results with ``coverage report`` or ``coverage html``, +the percentage of branch possibilities taken will be included in the percentage +covered total for each file. The coverage percentage for a file is the actual +executions divided by the execution opportunities. Each line in the file is an +execution opportunity, as is each branch destination. + +The HTML report gives information about which lines had missing branches. Lines +that were missing some branches are shown in yellow, with an annotation at the +far right showing branch destination line numbers that were not exercised. + +The XML report produced by ``coverage xml`` also includes branch information, +including separate statement and branch coverage percentages. How it works @@ -55,35 +61,42 @@ and destination for each transition from one line to another. Static analysis of the compiled bytecode provides a list of possible transitions. Comparing the measured to the possible indicates missing branches. -The idea of tracking how lines follow each other was from C. Titus Brown. +The idea of tracking how lines follow each other was from `Titus Brown`__. Thanks, Titus! +__ http://ivory.idyll.org/blog + + +Excluding code +-------------- + +If you have :ref:`excluded code <excluding>`, a condtional will not be +counted as a branch if one of its choices is excluded:: + + def only_one_choice(x): + if x: + blah1() + blah2() + else: # pragma: no cover + # x is always true. + blah3() + +Because the ``else`` clause is excluded, the ``if`` only has one possible +next line, so it isn't considered a branch at all. + Problems -------- Some Python constructs are difficult to measure properly. For example, an -infinite loop will be marked as partially executed:: +unconditional loop will be marked as partially executed:: while True: # line 1 if some_condition(): # 2 - break + break body_of_loop() # 4 - + keep_working() # 6 Because the loop never terminates naturally (jumping from line 1 to 6), -coverage.py thinks the branch is partially executed. - -Currently, if you exclude code from coverage testing, a branch into that code -will still be considered executable, and may result in the branch being -flagged. - - -Other work ----------- - -One interesting side effect of tracking line transitions: we know where some -exceptions happened because a transition happens that wasn't predicted by the -static analysis. Currently, I'm not doing anything with this information. -Any ideas? +coverage.py considers the branch partially executed. diff --git a/doc/changes.rst b/doc/changes.rst index 9400d605..4b64e20a 100644 --- a/doc/changes.rst +++ b/doc/changes.rst @@ -1,110 +1,187 @@ -.. _change:
-
-:history: 20090524T134300, brand new docs.
-:history: 20090613T164000, final touches for 3.0
-:history: 20090706T205000, changes for 3.0.1
-:history: 20091004T170700, changes for 3.1
-
-------------------------------------
-Major change history for coverage.py
-------------------------------------
-
-These are the major changes for coverage.py. For a more complete change history,
-see the `CHANGES.txt <http://bitbucket.org/ned/coveragepy/src/tip/CHANGES.txt>`_
-file.
-
-
-Version 3.1, 4 October 2009
----------------------------
-
-- Python 3.1 is now supported.
-
-- Coverage.py has a new command line syntax with sub-commands. This expands
- the possibilities for adding features and options in the future. The old
- syntax is still supported. Try "coverage help" to see the new commands.
- Thanks to Ben Finney for early help.
-
-- Added an experimental "coverage xml" command for producing coverage reports
- in a Cobertura-compatible XML format. Thanks, Bill Hart.
-
-- Added the ``--timid`` option to enable a simpler slower trace function that
- works for DecoratorTools projects, including TurboGears. Fixed `issue 12`_
- and `issue 13`_.
-
-- HTML reports now display syntax-colored Python source.
-
-- Added a "coverage debug" command for getting diagnostic information about the
- coverage.py installation.
-
-.. _issue 12: http://bitbucket.org/ned/coveragepy/issue/12
-.. _issue 13: http://bitbucket.org/ned/coveragepy/issue/13
-
-
-Version 3.0.1, 7 July 2009
---------------------------
-
-- Removed the recursion limit in the tracer function. Previously, code that
- ran more than 500 frames deep would crash.
-
-- Fixed a bizarre problem involving pyexpat, whereby lines following XML parser
- invocations could be overlooked.
-
-- On Python 2.3, coverage.py could mis-measure code with exceptions being
- raised. This is now fixed.
-
-- The coverage.py code itself will now not be measured by coverage.py, and no
- coverage modules will be mentioned in the nose --with-cover plugin.
-
-- When running source files, coverage.py now opens them in universal newline
- mode just like Python does. This lets it run Windows files on Mac, for
- example.
-
-
-Version 3.0b3, 16 May 2009
---------------------------
-
-- Added parameters to coverage.__init__ for options that had been set on the
- coverage object itself.
-
-- Added clear_exclude() and get_exclude_list() methods for programmatic
- manipulation of the exclude regexes.
-
-- Added coverage.load() to read previously-saved data from the data file.
-
-- When using the object api (that is, constructing a coverage() object), data
- is no longer saved automatically on process exit. You can re-enable it with
- the auto_data=True parameter on the coverage() constructor. The module-level
- interface still uses automatic saving.
-
-
-Version 3.0b2, 30 April 2009
-----------------------------
-
-HTML reporting, and continued refactoring.
-
-- HTML reports and annotation of source files: use the new -b (browser) switch.
- Thanks to George Song for code, inspiration and guidance.
-
-- Code in the Python standard library is not measured by default. If you need
- to measure standard library code, use the -L command-line switch during
- execution, or the cover_pylib=True argument to the coverage() constructor.
-
-- coverage.annotate_file is no longer available.
-
-- Removed the undocumented cache_file argument to coverage.usecache().
-
-
-Version 3.0b1, 7 March 2009
----------------------------
-
-Major overhaul.
-
-- Coverage is now a package rather than a module. Functionality has been split
- into classes.
-
-- The trace function is implemented in C for speed. Coverage runs are now
- much faster. Thanks to David Christian for productive micro-sprints and
- other encouragement.
-
-- The minimum supported Python version is 2.3.
-
+.. _change: + +==================================== +Major change history for coverage.py +==================================== + +:history: 20090524T134300, brand new docs. +:history: 20090613T164000, final touches for 3.0 +:history: 20090706T205000, changes for 3.0.1 +:history: 20091004T170700, changes for 3.1 +:history: 20091128T072200, changes for 3.2 +:history: 20091205T161525, 3.2 final +:history: 20100221T151900, changes for 3.3 +:history: 20100306T181400, changes for 3.3.1 + +These are the major changes for coverage.py. For a more complete change +history, see the `CHANGES.txt`_ file in the source tree. + +.. _CHANGES.txt: http://bitbucket.org/ned/coveragepy/src/tip/CHANGES.txt + + +Version 3.3.1, 6 March 2010 +--------------------------- + +- Using ``parallel=True`` in a .coveragerc file prevented reporting, but now + does not, fixing `issue 49`_. + +- When running your code with ``coverage run``, if you call ``sys.exit()``, + coverage.py will exit with that status code, fixing `issue 50`_. + +.. _issue 49: http://bitbucket.org/ned/coveragepy/issue/49 +.. _issue 50: http://bitbucket.org/ned/coveragepy/issue/50 + + +Version 3.3, 24 February 2010 +----------------------------- + +- Settings are now read from a .coveragerc file. A specific file can be + specified on the command line with ``--rcfile=FILE``. The name of the file + can be programmatically set with the ``config_file`` argument to the + coverage() constructor, or reading a config file can be disabled with + ``config_file=False``. + +- Added coverage.process_start to enable coverage measurement when Python + starts. + +- Parallel data file names now have a random number appended to them in + addition to the machine name and process id. Also, parallel data files + combined with ``coverage combine`` are deleted after they're combined, to + clean up unneeded files. Fixes `issue 40`_. + +- Exceptions thrown from product code run with ``coverage run`` are now + displayed without internal coverage.py frames, so the output is the same as + when the code is run without coverage.py. + +- Fixed `issue 39`_ and `issue 47`_. + +.. _issue 39: http://bitbucket.org/ned/coveragepy/issue/39 +.. _issue 40: http://bitbucket.org/ned/coveragepy/issue/40 +.. _issue 47: http://bitbucket.org/ned/coveragepy/issue/47 + + +Version 3.2, 5 December 2009 +---------------------------- + +- Branch coverage: coverage.py can tell you which branches didn't have both (or + all) choices executed, even where the choice doesn't affect which lines were + executed. See :ref:`Branch Coverage <branch>` for more details. + +- The table of contents in the HTML report is now sortable: click the headers + on any column. The sorting is persisted so that subsequent reports are + sorted as you wish. Thanks, `Chris Adams`_. + +- XML reporting has file paths that let Cobertura find the source code, fixing + `issue 21`_. + +- The ``--omit`` option now works much better than before, fixing `issue 14`_ + and `issue 33`_. Thanks, Danek Duvall. + +- Added a ``--version`` option on the command line. + +- Program execution under coverage is a few percent faster. + +- Some exceptions reported by the command line interface have been cleaned up + so that tracebacks inside coverage.py aren't shown. Fixes `issue 23`_. + +- Fixed some problems syntax coloring sources with line continuations and + source with tabs: `issue 30`_ and `issue 31`_. + +.. _Chris Adams: http://improbable.org/chris/ +.. _issue 21: http://bitbucket.org/ned/coveragepy/issue/21 +.. _issue 23: http://bitbucket.org/ned/coveragepy/issue/23 +.. _issue 14: http://bitbucket.org/ned/coveragepy/issue/14 +.. _issue 30: http://bitbucket.org/ned/coveragepy/issue/30 +.. _issue 31: http://bitbucket.org/ned/coveragepy/issue/31 +.. _issue 33: http://bitbucket.org/ned/coveragepy/issue/33 + + +Version 3.1, 4 October 2009 +--------------------------- + +- Python 3.1 is now supported. + +- Coverage.py has a new command line syntax with sub-commands. This expands + the possibilities for adding features and options in the future. The old + syntax is still supported. Try ``coverage help`` to see the new commands. + Thanks to Ben Finney for early help. + +- Added an experimental ``coverage xml`` command for producing coverage reports + in a Cobertura-compatible XML format. Thanks, Bill Hart. + +- Added the ``--timid`` option to enable a simpler slower trace function that + works for DecoratorTools projects, including TurboGears. Fixed `issue 12`_ + and `issue 13`_. + +- HTML reports now display syntax-colored Python source. + +- Added a ``coverage debug`` command for getting diagnostic information about + the coverage.py installation. + +- Source code can now be read from eggs. Thanks, `Ross Lawley`_. Fixes + `issue 25`_. + +.. _Ross Lawley: http://agileweb.org/ +.. _issue 25: http://bitbucket.org/ned/coveragepy/issue/25 +.. _issue 12: http://bitbucket.org/ned/coveragepy/issue/12 +.. _issue 13: http://bitbucket.org/ned/coveragepy/issue/13 + + +Version 3.0.1, 7 July 2009 +-------------------------- + +- Removed the recursion limit in the tracer function. Previously, code that + ran more than 500 frames deep would crash. + +- Fixed a bizarre problem involving pyexpat, whereby lines following XML parser + invocations could be overlooked. + +- On Python 2.3, coverage.py could mis-measure code with exceptions being + raised. This is now fixed. + +- The coverage.py code itself will now not be measured by coverage.py, and no + coverage modules will be mentioned in the nose ``--with-cover`` plugin. + +- When running source files, coverage.py now opens them in universal newline + mode just like Python does. This lets it run Windows files on Mac, for + example. + + +Version 3.0, 13 June 2009 +------------------------- + +- Coverage is now a package rather than a module. Functionality has been split + into classes. + +- HTML reports and annotation of source files: use the new ``-b`` (browser) + switch. Thanks to George Song for code, inspiration and guidance. + +- The trace function is implemented in C for speed. Coverage runs are now + much faster. Thanks to David Christian for productive micro-sprints and + other encouragement. + +- The minimum supported Python version is 2.3. + +- When using the object api (that is, constructing a coverage() object), data + is no longer saved automatically on process exit. You can re-enable it with + the ``auto_data=True`` parameter on the coverage() constructor. + The module-level interface still uses automatic saving. + +- Code in the Python standard library is not measured by default. If you need + to measure standard library code, use the ``-L`` command-line switch during + execution, or the ``cover_pylib=True`` argument to the coverage() + constructor. + +- API changes: + + - Added parameters to coverage.__init__ for options that had been set on + the coverage object itself. + + - Added clear_exclude() and get_exclude_list() methods for programmatic + manipulation of the exclude regexes. + + - Added coverage.load() to read previously-saved data from the data file. + + - coverage.annotate_file is no longer available. + + - Removed the undocumented cache_file argument to coverage.usecache(). diff --git a/doc/cmd.rst b/doc/cmd.rst index 9c0d4119..08a966e4 100644 --- a/doc/cmd.rst +++ b/doc/cmd.rst @@ -8,12 +8,14 @@ Coverage command line usage :history: 20090613T164000, final touches for 3.0 :history: 20090913T084400, new command line syntax :history: 20091004T170700, changes for 3.1 +:history: 20091127T200700, changes for 3.2 +:history: 20100223T200600, changes for 3.3 .. highlight:: console -When you install coverage, a command-line script called coverage is placed in -your Python scripts directory. Coverage has a number of commands which -determine the action performed: +When you install coverage.py, a command-line script simply called coverage is +placed in your Python scripts directory. Coverage has a number of commands +which determine the action performed: * **run** -- Run a Python program and collect execution data. @@ -21,17 +23,25 @@ determine the action performed: * **html** -- Produce annotated HTML listings with coverage results. +* **xml** -- Produce an XML report with coverage results. + +* **annotate** -- Annotate source files with coverage results. + * **erase** -- Erase previously collected coverage data. * **combine** -- Combine together a number of data files. -* **annotate** -- Annotate source files with coverage results. - * **debug** -- Get diagnostic information. Help is available with ``coverage help``, or with the ``--help`` switch on any other command. +Version information for coverage.py can be displayed with ``--version``. + +Any command can use a configuration file by specifying it with the +``--rcfile=FILE`` command-line switch. See :ref:`Configuration Files <config>` +for more details. + Execution --------- @@ -43,14 +53,18 @@ coverage command:: blah blah ..your program's output.. blah blah Your program runs just as if it had been invoked with the Python command line. -Arguments after your file name are passed to your program in sys.argv. +Arguments after your file name are passed to your program in ``sys.argv``. + +If you want :ref:`branch coverage <branch>` measurement, use the ``--branch`` +flag. Otherwise only statement coverage is measured. -By default, coverage does not measure code installed with the Python interpreter. -If you want to measure that code as well as your own, add the ``-L`` flag. +By default, coverage does not measure code installed with the Python +interpreter. If you want to measure that code as well as your own, add the +``-L`` flag. If your coverage results seems to be overlooking code that you know has been executed, try running coverage again with the ``--timid`` flag. This uses a -simpler but slower trace method. Projects that use DecoratorTools, including +simpler but slower trace method. Projects that use DecoratorTools, including TurboGears, will need to use ``--timid`` to get correct results. This option can also be enabled by setting the environment variable COVERAGE_OPTIONS to ``--timid``. @@ -64,7 +78,7 @@ can set a new file name with the COVERAGE_FILE environment variable. By default each run of your program starts with an empty data set. If you need to run your program multiple times to get complete data (for example, because you need to supply disjoint options), you can accumulate data across runs with the ``-a`` -flag on the **run** command. +flag on the **run** command. To erase the collected data, use the **erase** command:: @@ -106,7 +120,7 @@ as a percentage. The ``-m`` flag also shows the line numbers of missing statements:: - $ coverage report -m + $ coverage report -m Name Stmts Exec Cover Missing ------------------------------------------------------- my_program 20 16 80% 33-35, 39 @@ -141,7 +155,9 @@ and which were not. The **html** command creates an HTML report similar to the **report** summary, but as an HTML file. Each module name links to the source file decorated to show the status of each line. -Here's a `sample report </code/coverage/sample_html/index.html>`_. +Here's a `sample report`__. + +__ /code/coverage/sample_html/index.html Lines are highlighted green for executed, red for missing, and gray for excluded. The counts at the top of the file are buttons to turn on and off @@ -169,7 +185,7 @@ Coverage status for each line of source is indicated with a character prefix:: For example:: # A simple function, never called with x==1 - + > def h(x): """Silly function.""" - if 0: #pragma: no cover @@ -178,14 +194,15 @@ For example:: ! a = 1 > else: > a = 2 - + XML reporting ------------- The **xml** command writes coverage data to a "coverage.xml" file in a format -compatible with `Cobertura <http://cobertura.sourceforge.net>`_. This command -is still experimental. I need feedback from users to finish it up. +compatible with `Cobertura`_. + +.. _Cobertura: http://cobertura.sourceforge.net Diagnostics diff --git a/doc/conf.py b/doc/conf.py index 2044bf88..9c39b852 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -40,16 +40,16 @@ master_doc = 'index' # General information about the project.
project = u'coverage.py'
-copyright = u'2009, Ned Batchelder'
+copyright = u'2009-2010, Ned Batchelder'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
-version = '3.0'
+version = '3.3.1'
# The full version, including alpha/beta/rc tags.
-release = '3.0'
+release = '3.3.1'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
diff --git a/doc/config.rst b/doc/config.rst new file mode 100644 index 00000000..ada6d088 --- /dev/null +++ b/doc/config.rst @@ -0,0 +1,119 @@ +.. _config: + +=================== +Configuration files +=================== + +:history: 20100223T201600, new for 3.3 + +Coverage.py options can be specified in a configuration file. This makes it +easier to re-run coverage with consistent settings, and also allows for +specification of options that are otherwise only available in the +:ref:`API <api>`. + +Configuration files also make it easier to get coverage testing of spawned +sub-processes. See :ref:`Subprocess measurement <subprocess>` for more details. + + + +Syntax +------ + +A coverage.py configuration file is in classic .ini file format: sections are +introduced by a ``[section]`` header, and contain ``name = value`` entries. +Lines beginning with ``#`` or ``;`` are ignored as comments. + +Strings don't need quotes. Multi-strings can be created by indenting values on +multiple lines. + +Boolean values can be specified as ``on``, ``off``, ``true``, ``false``, ``1``, +or ``0`` and are case-insensitive. + +Many sections and values correspond roughly to commands and options in the +command-line interface. + +Here's a sample configuration file:: + + # .coveragerc to control coverage.py + [run] + branch = True + + [report] + # Regexes for lines to exclude from consideration + exclude_lines = + # Have to re-enable the standard pragma + pragma: no cover + + # Don't complain about missing debug-only code: + def __repr__ + if self\.debug + + # Don't complain if tests don't hit defensive assertion code: + raise AssertionError + raise NotImplementedError + + # Don't complain if non-runnable code isn't run: + if 0: + if __name__ == .__main__.: + + ignore_errors = True + + [html] + directory = coverage_html_report + + +[run] +----- + +These values are generally used when running product code, though some apply +to more than one command. + +``branch`` (boolean, default False): whether to measure +:ref:`branch coverage <branch>` in addition to statement coverage. + +``cover_pylib`` (boolean, default False): whether to measure the Python +standard library. + +``data_file`` (string, default ".coverage"): the name of the data file to use +for storing or reporting coverage. + +``parallel`` (boolean, default False): append the machine name, process +id and random number to the data file name to simplify collecting data from +many processes. + +``timid`` (boolean, default False): use a simpler but slower trace method. +Try this if you get seemingly impossible results. + + +[report] +-------- + +Values common to many kinds of reporting. + +``exclude_lines`` (multi-string): a list of regular expressions. Any line of +your source code that matches one of these regexes is excluded from being +reported as missing. More details are in :ref:`excluding`. If you use this +option, you are replacing all the exclude regexes, so you'll need to also +supply the "pragma: no cover" regex if you still want to use it. + +``ignore_errors`` (boolean, default False): ignore source code that can't be +found. + +``omit`` (multi-string): a list of file prefixes. If a source file begins with +one of these prefixes, it will be omitted from the report. + + +[html] +------ + +Values particular to HTML reporting. + +``directory`` (string, default "htmlcov"): where to write the HTML report files. + + +[xml] +----- + +Values particular to XML reporting. + +``output`` (string, default "coverage.xml"): where to write the XML report. diff --git a/doc/excluding.rst b/doc/excluding.rst index 0dfee514..55acebeb 100644 --- a/doc/excluding.rst +++ b/doc/excluding.rst @@ -5,6 +5,8 @@ Excluding code from coverage ============================ :history: 20090613T090500, brand new docs. +:history: 20100224T200900, updated for 3.3. + You may have code in your project that you know won't be executed, and you want to tell coverage to ignore it. For example, you may have debugging-only code @@ -30,7 +32,7 @@ function is not reported as missing:: def __init__(self): blah1() blah2() - + def __repr__(self): # pragma: no cover return "<MyObject>" @@ -39,28 +41,53 @@ coverage data as usual. When producing reports though, coverage excludes it from the list of missing code. +Branch coverage +--------------- + +When measuring :ref:`branch coverage <branch>`, a condtional will not be +counted as a branch if one of its choices is excluded:: + + def only_one_choice(x): + if x: + blah1() + blah2() + else: # pragma: no cover + # x is always true. + blah3() + +Because the ``else`` clause is excluded, the ``if`` only has one possible +next line, so it isn't considered a branch at all. + + Advanced exclusion ------------------ Coverage identifies exclusions by matching lines against a list of regular -expressions. Using the coverage :ref:`API <api>`, you can add to that list. -This is useful if you have often-used constructs to exclude that can be matched -with a regex. You can exclude them all at once without littering your code with -exclusion pragmas. +expressions. Using :ref:`configuration files <config>` or the coverage +:ref:`API <api>`, you can add to that list. This is useful if you have +often-used constructs to exclude that can be matched with a regex. You can +exclude them all at once without littering your code with exclusion pragmas. For example, you might decide that __repr__ functions are usually only used in debugging code, and are uninteresting to test themselves. You could exclude all of them by adding a regex to the exclusion list:: - coverage.exclude("def __repr__") - + [report] + exclude_lines = def __repr__ + Here's a list of exclusions I've used:: - coverage.exclude('def __repr__') - coverage.exclude('if self.debug:') - coverage.exclude('if settings.DEBUG') - coverage.exclude('raise AssertionError') - coverage.exclude('raise NotImplementedError') - coverage.exclude('if 0:') - coverage.exclude('if __name__ == .__main__.:') + [report] + exclude_lines = + pragma: no cover + def __repr__ + if self.debug: + if settings.DEBUG + raise AssertionError + raise NotImplementedError + if 0: + if __name__ == .__main__.: +Note that when using the ``exclude_lines`` option in a configuration file, you +are taking control of the entire list of regexes, so you need to re-specify the +default "pragma: no cover" match if you still want it to apply. diff --git a/doc/faq.rst b/doc/faq.rst index b65a77ab..5bb1f2f4 100644 --- a/doc/faq.rst +++ b/doc/faq.rst @@ -6,6 +6,8 @@ FAQ and other help :history: 20090613T141800, brand new docs. :history: 20091005T073900, updated for 3.1. +:history: 20091127T201500, updated for 3.2. + Frequently asked questions -------------------------- @@ -49,24 +51,49 @@ importing the modules that define your functions. **Q: Does coverage.py work on Python 3.x?** -Yes, as of coverage.py 3.1, Python 3.1 is supported. +Yes, Python 3.1 is fully supported. **Q: Isn't coverage testing the best thing ever?** -It's good, but `it isn't perfect -<http://nedbatchelder.com/blog/200710/flaws_in_coverage_measurement.html>`_. +It's good, but `it isn't perfect`__. + +__ http://nedbatchelder.com/blog/200710/flaws_in_coverage_measurement.html + + +.. Other resources + --------------- + + There are a number of projects that help integrate coverage.py into other + systems: + + - `trialcoverage`_ is a plug-in for Twisted trial. + + .. _trialcoverage: http://pypi.python.org/pypi/trialcoverage + + - `pytest-coverage`_ + + .. _pytest-coverage: http://pypi.python.org/pypi/pytest-coverage + + - `django-coverage`_ for use with Django. + + .. _django-coverage: http://pypi.python.org/pypi/django-coverage Getting more help ----------------- -You can discuss coverage or get help using it on the `Testing In Python -<http://lists.idyll.org/listinfo/testing-in-python>`_ mailing list. +You can discuss coverage.py or get help using it on the `Testing In Python`_ +mailing list. + +.. _Testing In Python: http://lists.idyll.org/listinfo/testing-in-python + +Bug reports are gladly accepted at the `bitbucket issue tracker`_. +Bitbucket also hosts the `code repository`_. + +.. _bitbucket issue tracker: http://bitbucket.org/ned/coveragepy/issues +.. _code repository: http://bitbucket.org/ned/coveragepy -Bug reports are gladly accepted at the `bitbucket issue tracker -<http://bitbucket.org/ned/coveragepy/issues/>`_. Bitbucket also hosts the -`code repository <http://bitbucket.org/ned/coveragepy>`_. +Lastly, `I can be reached`__ in a number of ways. -Lastly, `I can be reached <http://nedbatchelder.com/site/aboutned.html>`_ in a -number of ways. +__ http://nedbatchelder.com/site/aboutned.html diff --git a/doc/index.rst b/doc/index.rst index 10a92a59..6ce3e827 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -1,104 +1,118 @@ -===========
-coverage.py
-===========
-
-:history: 20090524T134300, brand new docs.
-:history: 20090613T164000, final touches for 3.0
-:history: 20090618T195900, minor tweaks
-:history: 20090707T205200, changes for 3.0.1
-:history: 20090913T084400, new command line syntax
-:history: 20091004T211900, version 3.1
-
-
-Coverage.py is a tool for measuring code coverage of Python programs. It
-monitors your program, noting which parts of the code have been executed, then
-analyzes the source to identify code that could have been executed but was not.
-
-Coverage measurement is typically used to gauge the effectiveness of tests. It
-can show which parts of your product code are being exercised by tests, and
-which are not.
-
-The latest version is 3.1, released 4 October 2009. It is supported on Python
-2.3 through 3.1.
-
-
-Quick start
------------
-
-Getting started is easy:
-
-#. Install coverage.py from the
- `coverage page on the cheeseshop <http://pypi.python.org/pypi/coverage>`_,
- or by using "easy_install coverage". You may need to install the
- python-dev support files, for example with "apt-get install python-dev".
-
-#. Use ``coverage run`` to execute your program and gather data:
-
- .. code-block:: console
-
- $ coverage run my_program.py arg1 arg2
- blah blah ..your program's output.. blah blah
-
-#. Use ``coverage report`` to report on the results:
-
- .. code-block:: console
-
- $ coverage report -m
- Name Stmts Exec Cover Missing
- -------------------------------------------------------
- my_program 20 16 80% 33-35, 39
- my_other_module 56 50 89% 17-23
- -------------------------------------------------------
- TOTAL 76 66 87%
-
-#. For a nicer presentation, use ``coverage html`` to get annotated HTML
- listings detailing missed lines:
-
- .. code-block:: console
-
- $ coverage html -d htmlcov
-
- Then visit htmlcov/index.html in your browser, to see a
- `report like this </code/coverage/sample_html/index.html>`_.
-
-
-Using coverage.py
------------------
-
-There are a few different ways to use coverage.py. The simplest is the
-:ref:`command line <cmd>`, which lets you run your program and see the results.
-If you need more control over how your project is measured, you can use the
-:ref:`API <api>`.
-
-Some test runners provide coverage integration to make it easy to use coverage
-while running tests. For example, `nose <http://somethingaboutorange.com/mrl/projects/nose>`_
-has a `cover plug-in <http://somethingaboutorange.com/mrl/projects/nose/0.11.1/plugins/cover.html>`_.
-
-You can fine-tune coverage's view of your code by directing it to ignore parts
-that you know aren't interesting. See :ref:`Excluding Code <excluding>` for
-details.
-
-
-History
--------
-
-Coverage.py was originally written by `Gareth Rees <http://garethrees.org/>`_.
-Ned Batchelder has maintained and extended it since 2004.
-
-
-
-More information
-----------------
-
-.. toctree::
- :maxdepth: 1
-
- cmd
- api
- excluding
- faq
- changes
-
-
-.. How it works
-.. .coverage file format
+=========== +coverage.py +=========== + +:history: 20090524T134300, brand new docs. +:history: 20090613T164000, final touches for 3.0 +:history: 20090618T195900, minor tweaks +:history: 20090707T205200, changes for 3.0.1 +:history: 20090913T084400, new command line syntax +:history: 20091004T211900, version 3.1 +:history: 20091127T155100, version 3.2 +:history: 20091205T161429, version 3.2 for real. +:history: 20100224T204700, version 3.3 +:history: 20100306T181500, version 3.3.1 + +Coverage.py is a tool for measuring code coverage of Python programs. It +monitors your program, noting which parts of the code have been executed, then +analyzes the source to identify code that could have been executed but was not. + +Coverage measurement is typically used to gauge the effectiveness of tests. It +can show which parts of your product code are being exercised by tests, and +which are not. + +The latest version is 3.3.1, released 6 March 2010. +It is supported on Python 2.3 through 3.1. + + +Quick start +----------- + +Getting started is easy: + +#. Install coverage.py from the `coverage page on the Python Package Index`__, + or by using "easy_install coverage". You may need to install the + python-dev support files, for example with "apt-get install python-dev". + +#. Use ``coverage run`` to execute your program and gather data: + + .. code-block:: console + + $ coverage run my_program.py arg1 arg2 + blah blah ..your program's output.. blah blah + +#. Use ``coverage report`` to report on the results: + + .. code-block:: console + + $ coverage report -m + Name Stmts Exec Cover Missing + ------------------------------------------------------- + my_program 20 16 80% 33-35, 39 + my_other_module 56 50 89% 17-23 + ------------------------------------------------------- + TOTAL 76 66 87% + +#. For a nicer presentation, use ``coverage html`` to get annotated HTML + listings detailing missed lines: + + .. code-block:: console + + $ coverage html + + Then visit htmlcov/index.html in your browser, to see a + `report like this`__. + +__ http://pypi.python.org/pypi/coverage +__ /code/coverage/sample_html/index.html + + +Using coverage.py +----------------- + +There are a few different ways to use coverage.py. The simplest is the +:ref:`command line <cmd>`, which lets you run your program and see the results. +If you need more control over how your project is measured, you can use the +:ref:`API <api>`. + +Some test runners provide coverage integration to make it easy to use coverage +while running tests. For example, `nose`_ has a `cover plug-in`_. + +You can fine-tune coverage's view of your code by directing it to ignore parts +that you know aren't interesting. See :ref:`Excluding Code <excluding>` for +details. + +.. _nose: http://somethingaboutorange.com/mrl/projects/nose +.. _cover plug-in: http://somethingaboutorange.com/mrl/projects/nose/0.11.1/plugins/cover.html + + +History +------- + +Coverage.py was originally written by `Gareth Rees`_. +Since 2004, `Ned Batchelder`_ has extended and maintained it with the help of +`many others`_. + +.. _Gareth Rees: http://garethrees.org/ +.. _Ned Batchelder: http://nedbatchelder.com +.. _many others: http://bitbucket.org/ned/coveragepy/src/tip/AUTHORS.txt + + +More information +---------------- + +.. toctree:: + :maxdepth: 1 + + cmd + config + api + excluding + branch + subprocess + faq + changes + + +.. How it works +.. .coverage file format diff --git a/doc/sample_html/README.txt b/doc/sample_html/README.txt index c1e49828..2d3cd4ab 100644 --- a/doc/sample_html/README.txt +++ b/doc/sample_html/README.txt @@ -1,5 +1,5 @@ -This directory was made with::
-
- cd C:\ned\cog\trunk
- coverage -e -x cogapp\test_cogapp.py CogTestsInMemory
- coverage -b -i -d htmlcov
+This directory was made with:: + + cd C:\ned\cog\trunk + coverage run --branch cogapp\test_cogapp.py CogTestsInMemory + coverage html -i -d htmlcov diff --git a/doc/sample_html/_ned_py_path.html b/doc/sample_html/_ned_py_path.html index 78637ee6..72f1d755 100644 --- a/doc/sample_html/_ned_py_path.html +++ b/doc/sample_html/_ned_py_path.html @@ -1,1507 +1,1500 @@ -<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
-<title>Coverage for c:\ned\py\path</title>
-<link rel='stylesheet' href='style.css' type='text/css'>
-<script src='jquery-1.3.2.min.js'></script>
-<script>
-function toggle_lines(btn, cls) {
- var btn = $(btn);
- if (btn.hasClass("hide")) {
- $("#source ."+cls).removeClass("hide");
- btn.removeClass("hide");
- }
- else {
- $("#source ."+cls).addClass("hide");
- btn.addClass("hide");
- }
-}
-</script>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+ <title>Coverage for c:\ned\py\path: 35%</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
</head>
<body>
+
<div id='header'>
<div class='content'>
<h1>Coverage for <b>c:\ned\py\path</b> :
- <span class='pc_cov'>40%</span>
+ <span class='pc_cov'>35%</span>
</h1>
<h2 class='stats'>
286 statements
- <span class='run hide' onclick='toggle_lines(this, "run")'>114 run</span>
+ <span class='run hide_run' onclick='toggle_lines(this, "run")'>114 run</span>
<span class='exc' onclick='toggle_lines(this, "exc")'>0 excluded</span>
<span class='mis' onclick='toggle_lines(this, "mis")'>172 missing</span>
+
+ <span class='par run hide_run' onclick='toggle_lines(this, "par")'>22 partial</span>
+
</h2>
</div>
</div>
<div id='source'>
-<table cellspacing='0' cellpadding='0'>
-<tr>
-<td class='linenos' valign='top'>
-<p class='pln'>1</p>
-<p class='pln'>2</p>
-<p class='pln'>3</p>
-<p class='pln'>4</p>
-<p class='pln'>5</p>
-<p class='pln'>6</p>
-<p class='pln'>7</p>
-<p class='pln'>8</p>
-<p class='pln'>9</p>
-<p class='pln'>10</p>
-<p class='pln'>11</p>
-<p class='pln'>12</p>
-<p class='pln'>13</p>
-<p class='pln'>14</p>
-<p class='pln'>15</p>
-<p class='pln'>16</p>
-<p class='pln'>17</p>
-<p class='pln'>18</p>
-<p class='pln'>19</p>
-<p class='pln'>20</p>
-<p class='pln'>21</p>
-<p class='pln'>22</p>
-<p class='pln'>23</p>
-<p class='pln'>24</p>
-<p class='pln'>25</p>
-<p class='pln'>26</p>
-<p class='pln'>27</p>
-<p class='pln'>28</p>
-<p class='pln'>29</p>
-<p class='pln'>30</p>
-<p class='pln'>31</p>
-<p class='stm run hide'>32</p>
-<p class='pln'>33</p>
-<p class='stm run hide'>34</p>
-<p class='pln'>35</p>
-<p class='stm run hide'>36</p>
-<p class='stm run hide'>37</p>
-<p class='pln'>38</p>
-<p class='pln'>39</p>
-<p class='stm run hide'>40</p>
-<p class='stm run hide'>41</p>
-<p class='stm run hide'>42</p>
-<p class='stm run hide'>43</p>
-<p class='stm mis'>44</p>
-<p class='stm mis'>45</p>
-<p class='pln'>46</p>
-<p class='pln'>47</p>
-<p class='stm run hide'>48</p>
-<p class='stm run hide'>49</p>
-<p class='stm mis'>50</p>
-<p class='stm mis'>51</p>
-<p class='pln'>52</p>
-<p class='pln'>53</p>
-<p class='stm run hide'>54</p>
-<p class='stm run hide'>55</p>
-<p class='stm run hide'>56</p>
-<p class='pln'>57</p>
-<p class='pln'>58</p>
-<p class='stm run hide'>59</p>
-<p class='pln'>60</p>
-<p class='pln'>61</p>
-<p class='pln'>62</p>
-<p class='pln'>63</p>
-<p class='pln'>64</p>
-<p class='pln'>65</p>
-<p class='pln'>66</p>
-<p class='pln'>67</p>
-<p class='stm run hide'>68</p>
-<p class='stm mis'>69</p>
-<p class='pln'>70</p>
-<p class='pln'>71</p>
-<p class='stm run hide'>72</p>
-<p class='stm mis'>73</p>
-<p class='pln'>74</p>
-<p class='stm run hide'>75</p>
-<p class='stm mis'>76</p>
-<p class='pln'>77</p>
-<p class='pln'>78</p>
-<p class='stm run hide'>79</p>
-<p class='pln'>80</p>
-<p class='pln'>81</p>
-<p class='pln'>82</p>
-<p class='pln'>83</p>
-<p class='pln'>84</p>
-<p class='stm mis'>85</p>
-<p class='pln'>86</p>
-<p class='pln'>87</p>
-<p class='stm run hide'>88</p>
-<p class='pln'>89</p>
-<p class='stm run hide'>90</p>
-<p class='pln'>91</p>
-<p class='stm mis'>92</p>
-<p class='stm run hide'>93</p>
-<p class='pln'>94</p>
-<p class='pln'>95</p>
-<p class='pln'>96</p>
-<p class='pln'>97</p>
-<p class='stm run hide'>98</p>
-<p class='stm run hide'>99</p>
-<p class='stm run hide'>100</p>
-<p class='stm run hide'>101</p>
-<p class='stm run hide'>102</p>
-<p class='stm run hide'>103</p>
-<p class='stm run hide'>104</p>
-<p class='stm run hide'>105</p>
-<p class='pln'>106</p>
-<p class='stm run hide'>107</p>
-<p class='pln'>108</p>
-<p class='pln'>109</p>
-<p class='pln'>110</p>
-<p class='pln'>111</p>
-<p class='pln'>112</p>
-<p class='pln'>113</p>
-<p class='stm mis'>114</p>
-<p class='pln'>115</p>
-<p class='stm run hide'>116</p>
-<p class='stm mis'>117</p>
-<p class='stm mis'>118</p>
-<p class='pln'>119</p>
-<p class='stm run hide'>120</p>
-<p class='stm mis'>121</p>
-<p class='stm mis'>122</p>
-<p class='pln'>123</p>
-<p class='stm run hide'>124</p>
-<p class='stm mis'>125</p>
-<p class='stm mis'>126</p>
-<p class='pln'>127</p>
-<p class='stm run hide'>128</p>
-<p class='pln'>129</p>
-<p class='pln'>130</p>
-<p class='pln'>131</p>
-<p class='pln'>132</p>
-<p class='pln'>133</p>
-<p class='pln'>134</p>
-<p class='stm run hide'>135</p>
-<p class='pln'>136</p>
-<p class='pln'>137</p>
-<p class='pln'>138</p>
-<p class='pln'>139</p>
-<p class='pln'>140</p>
-<p class='pln'>141</p>
-<p class='stm run hide'>142</p>
-<p class='pln'>143</p>
-<p class='pln'>144</p>
-<p class='pln'>145</p>
-<p class='pln'>146</p>
-<p class='pln'>147</p>
-<p class='pln'>148</p>
-<p class='pln'>149</p>
-<p class='stm run hide'>150</p>
-<p class='pln'>151</p>
-<p class='pln'>152</p>
-<p class='pln'>153</p>
-<p class='stm run hide'>154</p>
-<p class='pln'>155</p>
-<p class='pln'>156</p>
-<p class='pln'>157</p>
-<p class='pln'>158</p>
-<p class='pln'>159</p>
-<p class='stm run hide'>160</p>
-<p class='pln'>161</p>
-<p class='stm mis'>162</p>
-<p class='stm mis'>163</p>
-<p class='pln'>164</p>
-<p class='stm run hide'>165</p>
-<p class='pln'>166</p>
-<p class='pln'>167</p>
-<p class='pln'>168</p>
-<p class='pln'>169</p>
-<p class='pln'>170</p>
-<p class='pln'>171</p>
-<p class='stm mis'>172</p>
-<p class='stm mis'>173</p>
-<p class='pln'>174</p>
-<p class='stm run hide'>175</p>
-<p class='pln'>176</p>
-<p class='pln'>177</p>
-<p class='pln'>178</p>
-<p class='pln'>179</p>
-<p class='pln'>180</p>
-<p class='pln'>181</p>
-<p class='pln'>182</p>
-<p class='pln'>183</p>
-<p class='pln'>184</p>
-<p class='pln'>185</p>
-<p class='pln'>186</p>
-<p class='pln'>187</p>
-<p class='pln'>188</p>
-<p class='stm mis'>189</p>
-<p class='stm mis'>190</p>
-<p class='pln'>191</p>
-<p class='stm run hide'>192</p>
-<p class='pln'>193</p>
-<p class='pln'>194</p>
-<p class='pln'>195</p>
-<p class='pln'>196</p>
-<p class='pln'>197</p>
-<p class='stm mis'>198</p>
-<p class='pln'>199</p>
-<p class='stm run hide'>200</p>
-<p class='stm run hide'>201</p>
-<p class='stm mis'>202</p>
-<p class='stm mis'>203</p>
-<p class='pln'>204</p>
-<p class='stm run hide'>205</p>
-<p class='stm mis'>206</p>
-<p class='stm mis'>207</p>
-<p class='pln'>208</p>
-<p class='stm run hide'>209</p>
-<p class='pln'>210</p>
-<p class='pln'>211</p>
-<p class='pln'>212</p>
-<p class='pln'>213</p>
-<p class='stm run hide'>214</p>
-<p class='pln'>215</p>
-<p class='pln'>216</p>
-<p class='pln'>217</p>
-<p class='pln'>218</p>
-<p class='stm mis'>219</p>
-<p class='pln'>220</p>
-<p class='stm run hide'>221</p>
-<p class='pln'>222</p>
-<p class='pln'>223</p>
-<p class='pln'>224</p>
-<p class='pln'>225</p>
-<p class='pln'>226</p>
-<p class='pln'>227</p>
-<p class='pln'>228</p>
-<p class='pln'>229</p>
-<p class='pln'>230</p>
-<p class='stm mis'>231</p>
-<p class='stm mis'>232</p>
-<p class='stm mis'>233</p>
-<p class='stm mis'>234</p>
-<p class='stm mis'>235</p>
-<p class='stm mis'>236</p>
-<p class='stm mis'>237</p>
-<p class='stm mis'>238</p>
-<p class='stm mis'>239</p>
-<p class='stm mis'>240</p>
-<p class='stm mis'>241</p>
-<p class='pln'>242</p>
-<p class='stm run hide'>243</p>
-<p class='pln'>244</p>
-<p class='pln'>245</p>
-<p class='pln'>246</p>
-<p class='stm mis'>247</p>
-<p class='stm mis'>248</p>
-<p class='pln'>249</p>
-<p class='stm run hide'>250</p>
-<p class='pln'>251</p>
-<p class='pln'>252</p>
-<p class='pln'>253</p>
-<p class='pln'>254</p>
-<p class='pln'>255</p>
-<p class='pln'>256</p>
-<p class='stm mis'>257</p>
-<p class='stm mis'>258</p>
-<p class='pln'>259</p>
-<p class='stm mis'>260</p>
-<p class='pln'>261</p>
-<p class='stm mis'>262</p>
-<p class='pln'>263</p>
-<p class='stm mis'>264</p>
-<p class='pln'>265</p>
-<p class='stm mis'>266</p>
-<p class='pln'>267</p>
-<p class='pln'>268</p>
-<p class='stm mis'>269</p>
-<p class='stm mis'>270</p>
-<p class='stm mis'>271</p>
-<p class='stm mis'>272</p>
-<p class='stm mis'>273</p>
-<p class='pln'>274</p>
-<p class='pln'>275</p>
-<p class='pln'>276</p>
-<p class='pln'>277</p>
-<p class='stm mis'>278</p>
-<p class='pln'>279</p>
-<p class='stm mis'>280</p>
-<p class='stm mis'>281</p>
-<p class='pln'>282</p>
-<p class='stm mis'>283</p>
-<p class='pln'>284</p>
-<p class='stm mis'>285</p>
-<p class='pln'>286</p>
-<p class='pln'>287</p>
-<p class='pln'>288</p>
-<p class='pln'>289</p>
-<p class='stm run hide'>290</p>
-<p class='pln'>291</p>
-<p class='pln'>292</p>
-<p class='pln'>293</p>
-<p class='pln'>294</p>
-<p class='pln'>295</p>
-<p class='pln'>296</p>
-<p class='pln'>297</p>
-<p class='pln'>298</p>
-<p class='pln'>299</p>
-<p class='pln'>300</p>
-<p class='stm mis'>301</p>
-<p class='stm mis'>302</p>
-<p class='stm mis'>303</p>
-<p class='stm mis'>304</p>
-<p class='pln'>305</p>
-<p class='stm run hide'>306</p>
-<p class='pln'>307</p>
-<p class='pln'>308</p>
-<p class='pln'>309</p>
-<p class='pln'>310</p>
-<p class='pln'>311</p>
-<p class='pln'>312</p>
-<p class='pln'>313</p>
-<p class='pln'>314</p>
-<p class='pln'>315</p>
-<p class='pln'>316</p>
-<p class='stm mis'>317</p>
-<p class='pln'>318</p>
-<p class='stm run hide'>319</p>
-<p class='pln'>320</p>
-<p class='pln'>321</p>
-<p class='pln'>322</p>
-<p class='pln'>323</p>
-<p class='pln'>324</p>
-<p class='pln'>325</p>
-<p class='pln'>326</p>
-<p class='pln'>327</p>
-<p class='pln'>328</p>
-<p class='pln'>329</p>
-<p class='stm mis'>330</p>
-<p class='pln'>331</p>
-<p class='stm run hide'>332</p>
-<p class='pln'>333</p>
-<p class='pln'>334</p>
-<p class='pln'>335</p>
-<p class='pln'>336</p>
-<p class='pln'>337</p>
-<p class='pln'>338</p>
-<p class='pln'>339</p>
-<p class='pln'>340</p>
-<p class='pln'>341</p>
-<p class='stm mis'>342</p>
-<p class='stm mis'>343</p>
-<p class='stm mis'>344</p>
-<p class='stm mis'>345</p>
-<p class='stm mis'>346</p>
-<p class='stm mis'>347</p>
-<p class='pln'>348</p>
-<p class='stm run hide'>349</p>
-<p class='pln'>350</p>
-<p class='pln'>351</p>
-<p class='pln'>352</p>
-<p class='pln'>353</p>
-<p class='pln'>354</p>
-<p class='pln'>355</p>
-<p class='pln'>356</p>
-<p class='stm mis'>357</p>
-<p class='stm mis'>358</p>
-<p class='stm mis'>359</p>
-<p class='stm mis'>360</p>
-<p class='stm mis'>361</p>
-<p class='pln'>362</p>
-<p class='stm run hide'>363</p>
-<p class='pln'>364</p>
-<p class='pln'>365</p>
-<p class='pln'>366</p>
-<p class='pln'>367</p>
-<p class='pln'>368</p>
-<p class='pln'>369</p>
-<p class='pln'>370</p>
-<p class='stm mis'>371</p>
-<p class='stm mis'>372</p>
-<p class='stm mis'>373</p>
-<p class='stm mis'>374</p>
-<p class='stm mis'>375</p>
-<p class='stm mis'>376</p>
-<p class='stm mis'>377</p>
-<p class='pln'>378</p>
-<p class='stm run hide'>379</p>
-<p class='pln'>380</p>
-<p class='pln'>381</p>
-<p class='pln'>382</p>
-<p class='pln'>383</p>
-<p class='pln'>384</p>
-<p class='stm mis'>385</p>
-<p class='pln'>386</p>
-<p class='stm run hide'>387</p>
-<p class='pln'>388</p>
-<p class='pln'>389</p>
-<p class='pln'>390</p>
-<p class='pln'>391</p>
-<p class='pln'>392</p>
-<p class='pln'>393</p>
-<p class='pln'>394</p>
-<p class='stm mis'>395</p>
-<p class='pln'>396</p>
-<p class='pln'>397</p>
-<p class='pln'>398</p>
-<p class='pln'>399</p>
-<p class='stm run hide'>400</p>
-<p class='pln'>401</p>
-<p class='stm mis'>402</p>
-<p class='pln'>403</p>
-<p class='stm run hide'>404</p>
-<p class='pln'>405</p>
-<p class='stm mis'>406</p>
-<p class='stm mis'>407</p>
-<p class='stm mis'>408</p>
-<p class='pln'>409</p>
-<p class='stm mis'>410</p>
-<p class='pln'>411</p>
-<p class='stm run hide'>412</p>
-<p class='pln'>413</p>
-<p class='pln'>414</p>
-<p class='pln'>415</p>
-<p class='pln'>416</p>
-<p class='pln'>417</p>
-<p class='stm mis'>418</p>
-<p class='stm mis'>419</p>
-<p class='pln'>420</p>
-<p class='stm mis'>421</p>
-<p class='stm mis'>422</p>
-<p class='stm mis'>423</p>
-<p class='stm mis'>424</p>
-<p class='pln'>425</p>
-<p class='stm mis'>426</p>
-<p class='pln'>427</p>
-<p class='stm run hide'>428</p>
-<p class='pln'>429</p>
-<p class='pln'>430</p>
-<p class='pln'>431</p>
-<p class='pln'>432</p>
-<p class='pln'>433</p>
-<p class='pln'>434</p>
-<p class='pln'>435</p>
-<p class='pln'>436</p>
-<p class='pln'>437</p>
-<p class='pln'>438</p>
-<p class='pln'>439</p>
-<p class='pln'>440</p>
-<p class='pln'>441</p>
-<p class='pln'>442</p>
-<p class='stm mis'>443</p>
-<p class='pln'>444</p>
-<p class='stm mis'>445</p>
-<p class='stm mis'>446</p>
-<p class='stm mis'>447</p>
-<p class='pln'>448</p>
-<p class='stm mis'>449</p>
-<p class='pln'>450</p>
-<p class='pln'>451</p>
-<p class='stm mis'>452</p>
-<p class='pln'>453</p>
-<p class='pln'>454</p>
-<p class='stm mis'>455</p>
-<p class='stm mis'>456</p>
-<p class='pln'>457</p>
-<p class='stm mis'>458</p>
-<p class='stm mis'>459</p>
-<p class='pln'>460</p>
-<p class='stm run hide'>461</p>
-<p class='pln'>462</p>
-<p class='pln'>463</p>
-<p class='pln'>464</p>
-<p class='pln'>465</p>
-<p class='pln'>466</p>
-<p class='pln'>467</p>
-<p class='pln'>468</p>
-<p class='pln'>469</p>
-<p class='pln'>470</p>
-<p class='pln'>471</p>
-<p class='pln'>472</p>
-<p class='pln'>473</p>
-<p class='pln'>474</p>
-<p class='pln'>475</p>
-<p class='pln'>476</p>
-<p class='pln'>477</p>
-<p class='pln'>478</p>
-<p class='pln'>479</p>
-<p class='pln'>480</p>
-<p class='pln'>481</p>
-<p class='pln'>482</p>
-<p class='pln'>483</p>
-<p class='pln'>484</p>
-<p class='pln'>485</p>
-<p class='pln'>486</p>
-<p class='pln'>487</p>
-<p class='pln'>488</p>
-<p class='pln'>489</p>
-<p class='pln'>490</p>
-<p class='pln'>491</p>
-<p class='pln'>492</p>
-<p class='pln'>493</p>
-<p class='pln'>494</p>
-<p class='stm mis'>495</p>
-<p class='stm mis'>496</p>
-<p class='stm mis'>497</p>
-<p class='stm mis'>498</p>
-<p class='stm mis'>499</p>
-<p class='stm mis'>500</p>
-<p class='pln'>501</p>
-<p class='stm mis'>502</p>
-<p class='stm mis'>503</p>
-<p class='pln'>504</p>
-<p class='stm mis'>505</p>
-<p class='stm mis'>506</p>
-<p class='stm mis'>507</p>
-<p class='stm mis'>508</p>
-<p class='pln'>509</p>
-<p class='stm mis'>510</p>
-<p class='pln'>511</p>
-<p class='stm run hide'>512</p>
-<p class='pln'>513</p>
-<p class='pln'>514</p>
-<p class='pln'>515</p>
-<p class='pln'>516</p>
-<p class='pln'>517</p>
-<p class='pln'>518</p>
-<p class='pln'>519</p>
-<p class='pln'>520</p>
-<p class='pln'>521</p>
-<p class='pln'>522</p>
-<p class='pln'>523</p>
-<p class='pln'>524</p>
-<p class='pln'>525</p>
-<p class='pln'>526</p>
-<p class='pln'>527</p>
-<p class='pln'>528</p>
-<p class='stm mis'>529</p>
-<p class='stm mis'>530</p>
-<p class='stm mis'>531</p>
-<p class='stm mis'>532</p>
-<p class='pln'>533</p>
-<p class='stm mis'>534</p>
-<p class='pln'>535</p>
-<p class='stm mis'>536</p>
-<p class='pln'>537</p>
-<p class='stm run hide'>538</p>
-<p class='pln'>539</p>
-<p class='pln'>540</p>
-<p class='pln'>541</p>
-<p class='pln'>542</p>
-<p class='pln'>543</p>
-<p class='pln'>544</p>
-<p class='pln'>545</p>
-<p class='pln'>546</p>
-<p class='pln'>547</p>
-<p class='pln'>548</p>
-<p class='pln'>549</p>
-<p class='stm mis'>550</p>
-<p class='stm mis'>551</p>
-<p class='stm mis'>552</p>
-<p class='stm mis'>553</p>
-<p class='stm mis'>554</p>
-<p class='stm mis'>555</p>
-<p class='stm mis'>556</p>
-<p class='stm mis'>557</p>
-<p class='stm mis'>558</p>
-<p class='stm mis'>559</p>
-<p class='pln'>560</p>
-<p class='stm mis'>561</p>
-<p class='pln'>562</p>
-<p class='pln'>563</p>
-<p class='pln'>564</p>
-<p class='pln'>565</p>
-<p class='stm run hide'>566</p>
-<p class='stm run hide'>567</p>
-<p class='stm run hide'>568</p>
-<p class='stm run hide'>569</p>
-<p class='stm run hide'>570</p>
-<p class='stm run hide'>571</p>
-<p class='pln'>572</p>
-<p class='stm run hide'>573</p>
-<p class='stm mis'>574</p>
-<p class='pln'>575</p>
-<p class='stm run hide'>576</p>
-<p class='stm run hide'>577</p>
-<p class='pln'>578</p>
-<p class='pln'>579</p>
-<p class='pln'>580</p>
-<p class='stm run hide'>581</p>
-<p class='stm run hide'>582</p>
-<p class='pln'>583</p>
-<p class='pln'>584</p>
-<p class='pln'>585</p>
-<p class='stm run hide'>586</p>
-<p class='stm run hide'>587</p>
-<p class='stm run hide'>588</p>
-<p class='pln'>589</p>
-<p class='pln'>590</p>
-<p class='pln'>591</p>
-<p class='stm run hide'>592</p>
-<p class='stm run hide'>593</p>
-<p class='pln'>594</p>
-<p class='pln'>595</p>
-<p class='pln'>596</p>
-<p class='stm run hide'>597</p>
-<p class='stm run hide'>598</p>
-<p class='pln'>599</p>
-<p class='pln'>600</p>
-<p class='pln'>601</p>
-<p class='pln'>602</p>
-<p class='stm mis'>603</p>
-<p class='pln'>604</p>
-<p class='stm run hide'>605</p>
-<p class='pln'>606</p>
-<p class='stm mis'>607</p>
-<p class='pln'>608</p>
-<p class='stm run hide'>609</p>
-<p class='pln'>610</p>
-<p class='stm mis'>611</p>
-<p class='pln'>612</p>
-<p class='stm run hide'>613</p>
-<p class='stm mis'>614</p>
-<p class='pln'>615</p>
-<p class='stm mis'>616</p>
-<p class='pln'>617</p>
-<p class='stm run hide'>618</p>
-<p class='stm mis'>619</p>
-<p class='stm mis'>620</p>
-<p class='pln'>621</p>
-<p class='pln'>622</p>
-<p class='pln'>623</p>
-<p class='pln'>624</p>
-<p class='stm run hide'>625</p>
-<p class='pln'>626</p>
-<p class='stm mis'>627</p>
-<p class='pln'>628</p>
-<p class='stm run hide'>629</p>
-<p class='stm mis'>630</p>
-<p class='pln'>631</p>
-<p class='stm run hide'>632</p>
-<p class='stm mis'>633</p>
-<p class='stm mis'>634</p>
-<p class='pln'>635</p>
-<p class='stm run hide'>636</p>
-<p class='stm mis'>637</p>
-<p class='pln'>638</p>
-<p class='stm run hide'>639</p>
-<p class='stm mis'>640</p>
-<p class='pln'>641</p>
-<p class='pln'>642</p>
-<p class='pln'>643</p>
-<p class='pln'>644</p>
-<p class='stm run hide'>645</p>
-<p class='stm mis'>646</p>
-<p class='pln'>647</p>
-<p class='stm run hide'>648</p>
-<p class='stm mis'>649</p>
-<p class='pln'>650</p>
-<p class='stm run hide'>651</p>
-<p class='stm mis'>652</p>
-<p class='pln'>653</p>
-<p class='stm run hide'>654</p>
-<p class='stm mis'>655</p>
-<p class='pln'>656</p>
-<p class='pln'>657</p>
-<p class='pln'>658</p>
-<p class='pln'>659</p>
-<p class='stm run hide'>660</p>
-<p class='pln'>661</p>
-<p class='pln'>662</p>
-<p class='pln'>663</p>
-<p class='stm mis'>664</p>
-<p class='stm mis'>665</p>
-<p class='stm mis'>666</p>
-<p class='pln'>667</p>
-<p class='stm run hide'>668</p>
-<p class='stm mis'>669</p>
-<p class='pln'>670</p>
-<p class='stm run hide'>671</p>
-<p class='stm mis'>672</p>
-<p class='pln'>673</p>
-<p class='pln'>674</p>
-<p class='pln'>675</p>
-<p class='pln'>676</p>
-<p class='stm run hide'>677</p>
-<p class='stm mis'>678</p>
-<p class='pln'>679</p>
-<p class='stm mis'>680</p>
-<p class='pln'>681</p>
-<p class='stm run hide'>682</p>
-<p class='stm mis'>683</p>
-<p class='pln'>684</p>
-<p class='stm mis'>685</p>
-<p class='pln'>686</p>
-<p class='stm run hide'>687</p>
-<p class='stm mis'>688</p>
-<p class='pln'>689</p>
-<p class='pln'>690</p>
-<p class='pln'>691</p>
-<p class='pln'>692</p>
-<p class='stm mis'>693</p>
-<p class='pln'>694</p>
-<p class='stm mis'>695</p>
-<p class='pln'>696</p>
-<p class='pln'>697</p>
-<p class='pln'>698</p>
-<p class='pln'>699</p>
-<p class='stm mis'>700</p>
-<p class='stm mis'>701</p>
-<p class='stm mis'>702</p>
-<p class='pln'>703</p>
-<p class='stm mis'>704</p>
-<p class='pln'>705</p>
-<p class='pln'>706</p>
-<p class='pln'>707</p>
-<p class='pln'>708</p>
-<p class='stm run hide'>709</p>
-<p class='stm run hide'>710</p>
-<p class='stm run hide'>711</p>
-<p class='stm run hide'>712</p>
-<p class='stm run hide'>713</p>
-<p class='stm run hide'>714</p>
-<p class='stm run hide'>715</p>
-<p class='stm run hide'>716</p>
-<p class='stm run hide'>717</p>
-<p class='pln'>718</p>
-<p class='pln'>719</p>
-<p class='pln'>720</p>
-<p class='pln'>721</p>
-<p class='stm run hide'>722</p>
-<p class='stm mis'>723</p>
-<p class='stm mis'>724</p>
-<p class='pln'>725</p>
-<p class='stm run hide'>726</p>
-<p class='stm run hide'>727</p>
-<p class='stm mis'>728</p>
-<p class='pln'>729</p>
-
-</td>
-<td class='text' valign='top'>
-<p class='pln'><span class='str'>""" path.py - An object representing a path to a file or directory.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'>Example:</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'>from path import path</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'>d = path('/home/guido/bin')</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'>for f in d.files('*.py'):</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> f.chmod(0755)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'>This module requires Python 2.2 or later.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'>URL: http://www.jorendorff.com/articles/python/path</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'>Author: Jason Orendorff <jason@jorendorff.com> (and others - see the url!)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'>Date: 29 Feb 2004</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'>"""</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='com'># TODO</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># - Bug in write_text(). It doesn't support Universal newline mode.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># - Better error message in listdir() when self isn't a</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># directory. (On Windows, the error message really sucks.)</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># - Make sure everything has a good docstring.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># - Add methods for regex find and replace.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># - guess_content_type() method?</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># - Perhaps support arguments to touch().</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># - Could add split() and join() methods that generate warnings.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># - Note: __add__() technically has a bug, I think, where</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># it doesn't play nice with other types that implement</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># __radd__(). Test this.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>generators</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>import</span> <span class='nam'>sys</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>,</span> <span class='nam'>fnmatch</span><span class='op'>,</span> <span class='nam'>glob</span><span class='op'>,</span> <span class='nam'>shutil</span><span class='op'>,</span> <span class='nam'>codecs</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='nam'>__version__</span> <span class='op'>=</span> <span class='str'>'2.0.2'</span><span class="strut"> </span></p>
-<p class='stm run hide'><span class='nam'>__all__</span> <span class='op'>=</span> <span class='op'>[</span><span class='str'>'path'</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='com'># Pre-2.3 support. Are unicode filenames supported?</span><span class="strut"> </span></p>
-<p class='stm run hide'><span class='nam'>_base</span> <span class='op'>=</span> <span class='nam'>str</span><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>try</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>supports_unicode_filenames</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>_base</span> <span class='op'>=</span> <span class='nam'>unicode</span><span class="strut"> </span></p>
-<p class='stm mis'><span class='key'>except</span> <span class='nam'>AttributeError</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>pass</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='com'># Pre-2.3 workaround for basestring.</span><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>try</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>basestring</span><span class="strut"> </span></p>
-<p class='stm mis'><span class='key'>except</span> <span class='nam'>NameError</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>basestring</span> <span class='op'>=</span> <span class='op'>(</span><span class='nam'>str</span><span class='op'>,</span> <span class='nam'>unicode</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='com'># Universal newline support</span><span class="strut"> </span></p>
-<p class='stm run hide'><span class='nam'>_textmode</span> <span class='op'>=</span> <span class='str'>'r'</span><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>file</span><span class='op'>,</span> <span class='str'>'newlines'</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>_textmode</span> <span class='op'>=</span> <span class='str'>'U'</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>class</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>_base</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Represents a filesystem path.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> For documentation on individual methods, consult their</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> counterparts in os.path.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># --- Special Python methods.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>__repr__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='str'>'path(%s)'</span> <span class='op'>%</span> <span class='nam'>_base</span><span class='op'>.</span><span class='nam'>__repr__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Adding a path and a string yields a path.</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>__add__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>more</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>_base</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span> <span class='op'>+</span> <span class='nam'>more</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>__radd__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>other</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>other</span> <span class='op'>+</span> <span class='nam'>_base</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># The / operator joins paths.</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>__div__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>rel</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" fp.__div__(rel) == fp / rel == fp.joinpath(rel)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Join two path components, adding a separator character if</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> needed.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>rel</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Make the / operator work even when true division is enabled.</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>__truediv__</span> <span class='op'>=</span> <span class='nam'>__div__</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>getcwd</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Return the current working directory as a path object. """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>getcwd</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>getcwd</span> <span class='op'>=</span> <span class='nam'>staticmethod</span><span class='op'>(</span><span class='nam'>getcwd</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># --- Operations on path strings.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>abspath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>abspath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>normcase</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>normcase</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>normpath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>normpath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>realpath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>realpath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>expanduser</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>expanduser</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>expandvars</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>expandvars</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>dirname</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>dirname</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>basename</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>basename</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>expand</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Clean up a filename by calling expandvars(),</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> expanduser(), and normpath() on it.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This is commonly everything needed to clean up a filename</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> read from a configuration file, for example.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>expandvars</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>expanduser</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>normpath</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>_get_namebase</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>base</span><span class='op'>,</span> <span class='nam'>ext</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>splitext</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>name</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>base</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>_get_ext</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>f</span><span class='op'>,</span> <span class='nam'>ext</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>splitext</span><span class='op'>(</span><span class='nam'>_base</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>ext</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>_get_drive</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>drive</span><span class='op'>,</span> <span class='nam'>r</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>splitdrive</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>drive</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>parent</span> <span class='op'>=</span> <span class='nam'>property</span><span class='op'>(</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>dirname</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" This path's parent directory, as a new path object.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> For example, path('/usr/local/lib/libpython.so').parent == path('/usr/local/lib')</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>name</span> <span class='op'>=</span> <span class='nam'>property</span><span class='op'>(</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>basename</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" The name of this file or directory without the full path.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> For example, path('/usr/local/lib/libpython.so').name == 'libpython.so'</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>namebase</span> <span class='op'>=</span> <span class='nam'>property</span><span class='op'>(</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>_get_namebase</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" The same as path.name, but with one file extension stripped off.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> For example, path('/home/guido/python.tar.gz').name == 'python.tar.gz',</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> but path('/home/guido/python.tar.gz').namebase == 'python.tar'</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>ext</span> <span class='op'>=</span> <span class='nam'>property</span><span class='op'>(</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>_get_ext</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" The file extension, for example '.py'. """</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>drive</span> <span class='op'>=</span> <span class='nam'>property</span><span class='op'>(</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>_get_drive</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" The drive specifier, for example 'C:'.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This is always empty on systems that don't use drive specifiers.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>splitpath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" p.splitpath() -> Return (p.parent, p.name). """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>parent</span><span class='op'>,</span> <span class='nam'>child</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>parent</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>child</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>splitdrive</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" p.splitdrive() -> Return (p.drive, <the rest of p>).</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Split the drive specifier from this path. If there is</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> no drive specifier, p.drive is empty, so the return value</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> is simply (path(''), p). This is always the case on Unix.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>drive</span><span class='op'>,</span> <span class='nam'>rel</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>splitdrive</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>drive</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>rel</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>splitext</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" p.splitext() -> Return (p.stripext(), p.ext).</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Split the filename extension from this path and return</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> the two parts. Either part may be empty.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> The extension is everything from '.' to the end of the</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> last path segment. This has the property that if</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> (a, b) == p.splitext(), then a + b == p.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Cast to plain string using _base because Python 2.2</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># implementations of os.path.splitext use "for c in path:..."</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># which means something different when applied to a path</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># object.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>filename</span><span class='op'>,</span> <span class='nam'>ext</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>splitext</span><span class='op'>(</span><span class='nam'>_base</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>filename</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>ext</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>stripext</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" p.stripext() -> Remove one file extension from the path.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> For example, path('/home/guido/python.tar.gz').stripext()</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> returns path('/home/guido/python.tar').</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>splitext</span><span class='op'>(</span><span class='op'>)</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>,</span> <span class='str'>'splitunc'</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>splitunc</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>unc</span><span class='op'>,</span> <span class='nam'>rest</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>splitunc</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>unc</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>rest</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>_get_uncshare</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>unc</span><span class='op'>,</span> <span class='nam'>r</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>splitunc</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>unc</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>uncshare</span> <span class='op'>=</span> <span class='nam'>property</span><span class='op'>(</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>_get_uncshare</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" The UNC mount point for this path.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This is empty for paths on local drives. """</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>joinpath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Join two or more path components, adding a separator</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> character (os.sep) if needed. Returns a new path</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> object.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>splitall</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Return a list of the path components in this path.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> The first item in the list will be a path. Its value will be</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> either os.curdir, os.pardir, empty, or the root directory of</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> this path (for example, '/' or 'C:\\'). The other items in</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> the list will be strings.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> path.path.joinpath(*result) will yield the original path.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>parts</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>loc</span> <span class='op'>=</span> <span class='nam'>self</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>while</span> <span class='nam'>loc</span> <span class='op'>!=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>curdir</span> <span class='key'>and</span> <span class='nam'>loc</span> <span class='op'>!=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>pardir</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>prev</span> <span class='op'>=</span> <span class='nam'>loc</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>loc</span><span class='op'>,</span> <span class='nam'>child</span> <span class='op'>=</span> <span class='nam'>prev</span><span class='op'>.</span><span class='nam'>splitpath</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>loc</span> <span class='op'>==</span> <span class='nam'>prev</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>break</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>parts</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>child</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>parts</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>loc</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>parts</span><span class='op'>.</span><span class='nam'>reverse</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>parts</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>relpath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Return this path as a relative path,</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> based from the current working directory.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>cwd</span> <span class='op'>=</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>getcwd</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>cwd</span><span class='op'>.</span><span class='nam'>relpathto</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>relpathto</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>dest</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Return a relative path from self to dest.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> If there is no relative path from self to dest, for example if</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> they reside on different drives in Windows, then this returns</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> dest.abspath().</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>origin</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>abspath</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>dest</span> <span class='op'>=</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>dest</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>abspath</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>orig_list</span> <span class='op'>=</span> <span class='nam'>origin</span><span class='op'>.</span><span class='nam'>normcase</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>splitall</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Don't normcase dest! We want to preserve the case.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>dest_list</span> <span class='op'>=</span> <span class='nam'>dest</span><span class='op'>.</span><span class='nam'>splitall</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>orig_list</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span> <span class='op'>!=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>normcase</span><span class='op'>(</span><span class='nam'>dest_list</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Can't get here from there.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>dest</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Find the location where the two paths start to differ.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>i</span> <span class='op'>=</span> <span class='num'>0</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>for</span> <span class='nam'>start_seg</span><span class='op'>,</span> <span class='nam'>dest_seg</span> <span class='key'>in</span> <span class='nam'>zip</span><span class='op'>(</span><span class='nam'>orig_list</span><span class='op'>,</span> <span class='nam'>dest_list</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>start_seg</span> <span class='op'>!=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>normcase</span><span class='op'>(</span><span class='nam'>dest_seg</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>break</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>i</span> <span class='op'>+=</span> <span class='num'>1</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Now i is the point where the two paths diverge.</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Need a certain number of "os.pardir"s to work up</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># from the origin to the point of divergence.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>segments</span> <span class='op'>=</span> <span class='op'>[</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>pardir</span><span class='op'>]</span> <span class='op'>*</span> <span class='op'>(</span><span class='nam'>len</span><span class='op'>(</span><span class='nam'>orig_list</span><span class='op'>)</span> <span class='op'>-</span> <span class='nam'>i</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Need to add the diverging part of dest_list.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>segments</span> <span class='op'>+=</span> <span class='nam'>dest_list</span><span class='op'>[</span><span class='nam'>i</span><span class='op'>:</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>segments</span><span class='op'>)</span> <span class='op'>==</span> <span class='num'>0</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># If they happen to be identical, use os.curdir.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>curdir</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='op'>*</span><span class='nam'>segments</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># --- Listing, searching, walking, and matching</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>listdir</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>pattern</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" D.listdir() -> List of items in this directory.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Use D.files() or D.dirs() instead if you want a listing</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> of just files or just subdirectories.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> The elements of the list are path objects.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> With the optional 'pattern' argument, this only lists</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> items whose names match the given pattern.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>names</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>listdir</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>pattern</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>names</span> <span class='op'>=</span> <span class='nam'>fnmatch</span><span class='op'>.</span><span class='nam'>filter</span><span class='op'>(</span><span class='nam'>names</span><span class='op'>,</span> <span class='nam'>pattern</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='op'>[</span><span class='nam'>self</span> <span class='op'>/</span> <span class='nam'>child</span> <span class='key'>for</span> <span class='nam'>child</span> <span class='key'>in</span> <span class='nam'>names</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>dirs</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>pattern</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" D.dirs() -> List of this directory's subdirectories.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> The elements of the list are path objects.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This does not walk recursively into subdirectories</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> (but see path.walkdirs).</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> With the optional 'pattern' argument, this only lists</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> directories whose names match the given pattern. For</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> example, d.dirs('build-*').</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='op'>[</span><span class='nam'>p</span> <span class='key'>for</span> <span class='nam'>p</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>listdir</span><span class='op'>(</span><span class='nam'>pattern</span><span class='op'>)</span> <span class='key'>if</span> <span class='nam'>p</span><span class='op'>.</span><span class='nam'>isdir</span><span class='op'>(</span><span class='op'>)</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>files</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>pattern</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" D.files() -> List of the files in this directory.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> The elements of the list are path objects.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This does not walk into subdirectories (see path.walkfiles).</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> With the optional 'pattern' argument, this only lists files</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> whose names match the given pattern. For example,</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> d.files('*.pyc').</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='op'>[</span><span class='nam'>p</span> <span class='key'>for</span> <span class='nam'>p</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>listdir</span><span class='op'>(</span><span class='nam'>pattern</span><span class='op'>)</span> <span class='key'>if</span> <span class='nam'>p</span><span class='op'>.</span><span class='nam'>isfile</span><span class='op'>(</span><span class='op'>)</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>walk</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>pattern</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" D.walk() -> iterator over files and subdirs, recursively.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> The iterator yields path objects naming each child item of</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> this directory and its descendants. This requires that</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> D.isdir().</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This performs a depth-first traversal of the directory tree.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Each directory is returned just before all its children.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>for</span> <span class='nam'>child</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>listdir</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>pattern</span> <span class='key'>is</span> <span class='nam'>None</span> <span class='key'>or</span> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>fnmatch</span><span class='op'>(</span><span class='nam'>pattern</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>yield</span> <span class='nam'>child</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>isdir</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>for</span> <span class='nam'>item</span> <span class='key'>in</span> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>walk</span><span class='op'>(</span><span class='nam'>pattern</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>yield</span> <span class='nam'>item</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>walkdirs</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>pattern</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" D.walkdirs() -> iterator over subdirs, recursively.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> With the optional 'pattern' argument, this yields only</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> directories whose names match the given pattern. For</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> example, mydir.walkdirs('*test') yields only directories</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> with names ending in 'test'.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>for</span> <span class='nam'>child</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>dirs</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>pattern</span> <span class='key'>is</span> <span class='nam'>None</span> <span class='key'>or</span> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>fnmatch</span><span class='op'>(</span><span class='nam'>pattern</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>yield</span> <span class='nam'>child</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>for</span> <span class='nam'>subsubdir</span> <span class='key'>in</span> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>walkdirs</span><span class='op'>(</span><span class='nam'>pattern</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>yield</span> <span class='nam'>subsubdir</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>walkfiles</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>pattern</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" D.walkfiles() -> iterator over files in D, recursively.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> The optional argument, pattern, limits the results to files</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> with names that match the pattern. For example,</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> mydir.walkfiles('*.tmp') yields only files with the .tmp</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> extension.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>for</span> <span class='nam'>child</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>listdir</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>isfile</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>pattern</span> <span class='key'>is</span> <span class='nam'>None</span> <span class='key'>or</span> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>fnmatch</span><span class='op'>(</span><span class='nam'>pattern</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>yield</span> <span class='nam'>child</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>elif</span> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>isdir</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>for</span> <span class='nam'>f</span> <span class='key'>in</span> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>walkfiles</span><span class='op'>(</span><span class='nam'>pattern</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>yield</span> <span class='nam'>f</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>fnmatch</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>pattern</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Return True if self.name matches the given pattern.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> pattern - A filename pattern with wildcards,</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> for example '*.py'.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>fnmatch</span><span class='op'>.</span><span class='nam'>fnmatch</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>name</span><span class='op'>,</span> <span class='nam'>pattern</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>glob</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>pattern</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Return a list of path objects that match the pattern.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> pattern - a path relative to this directory, with wildcards.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> For example, path('/users').glob('*/bin/*') returns a list</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> of all the files users have in their bin directories.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>map</span><span class='op'>(</span><span class='nam'>path</span><span class='op'>,</span> <span class='nam'>glob</span><span class='op'>.</span><span class='nam'>glob</span><span class='op'>(</span><span class='nam'>_base</span><span class='op'>(</span><span class='nam'>self</span> <span class='op'>/</span> <span class='nam'>pattern</span><span class='op'>)</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># --- Reading or writing an entire file at once.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>open</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>mode</span><span class='op'>=</span><span class='str'>'r'</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Open this file. Return a file object. """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>file</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>mode</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>bytes</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Open this file, read all bytes, return them as a string. """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>f</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>open</span><span class='op'>(</span><span class='str'>'rb'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>finally</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>write_bytes</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>bytes</span><span class='op'>,</span> <span class='nam'>append</span><span class='op'>=</span><span class='nam'>False</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Open this file and write the given bytes to it.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Default behavior is to overwrite any existing file.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Call this with write_bytes(bytes, append=True) to append instead.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>append</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>mode</span> <span class='op'>=</span> <span class='str'>'ab'</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>mode</span> <span class='op'>=</span> <span class='str'>'wb'</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>f</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>open</span><span class='op'>(</span><span class='nam'>mode</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>bytes</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>finally</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>text</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>encoding</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>errors</span><span class='op'>=</span><span class='str'>'strict'</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Open this file, read it in, return the content as a string.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This uses 'U' mode in Python 2.3 and later, so '\r\n' and '\r'</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> are automatically translated to '\n'.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Optional arguments:</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> encoding - The Unicode encoding (or character set) of</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> the file. If present, the content of the file is</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> decoded and returned as a unicode object; otherwise</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> it is returned as an 8-bit str.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> errors - How to handle Unicode errors; see help(str.decode)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> for the options. Default is 'strict'.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>encoding</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># 8-bit</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>f</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>open</span><span class='op'>(</span><span class='nam'>_textmode</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>finally</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Unicode</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>f</span> <span class='op'>=</span> <span class='nam'>codecs</span><span class='op'>.</span><span class='nam'>open</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>'r'</span><span class='op'>,</span> <span class='nam'>encoding</span><span class='op'>,</span> <span class='nam'>errors</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># (Note - Can't use 'U' mode here, since codecs.open</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># doesn't support 'U' mode, even in Python 2.3.)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>t</span> <span class='op'>=</span> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>finally</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>t</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='str'>u'\r\n'</span><span class='op'>,</span> <span class='str'>u'\n'</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='str'>u'\r'</span><span class='op'>,</span> <span class='str'>u'\n'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>write_text</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>text</span><span class='op'>,</span> <span class='nam'>encoding</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>errors</span><span class='op'>=</span><span class='str'>'strict'</span><span class='op'>,</span> <span class='nam'>append</span><span class='op'>=</span><span class='nam'>False</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Write the given text to this file.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> The default behavior is to overwrite any existing file;</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> to append instead, use the 'append=True' keyword argument.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> There are two differences between path.write_text() and</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> path.write_bytes(): Unicode handling and newline handling.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> --- Unicode</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> If 'text' isn't Unicode, this essentially just does</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> open(self, 'w').write(text). The 'encoding' and 'errors'</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> arguments are ignored.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> If 'text' is Unicode, it is first converted to bytes using the</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> specified 'encoding' (or the default encoding if 'encoding'</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> isn't specified). The 'errors' argument applies only to this</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> conversion.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> --- Newlines</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> write_text() converts from programmer-friendly newlines</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> (always '\n') to platform-specific newlines (see os.linesep;</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> on Windows, for example, the end-of-line marker is '\r\n').</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This applies to Unicode text the same as to 8-bit text.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Because of this conversion, the text should only contain plain</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> newlines ('\n'), just like the return value of path.text().</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> If the text contains the characters '\r\n', it may be written</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> as '\r\r\n' or '\r\r' depending on your platform. (This is</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> exactly the same as when you open a file for writing with</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> fopen(filename, "w") in C or file(filename, 'w') in Python.)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>text</span><span class='op'>,</span> <span class='nam'>unicode</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>text</span> <span class='op'>=</span> <span class='nam'>text</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='str'>u'\n'</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>linesep</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>encoding</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>encoding</span> <span class='op'>=</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>getdefaultencoding</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>bytes</span> <span class='op'>=</span> <span class='nam'>text</span><span class='op'>.</span><span class='nam'>encode</span><span class='op'>(</span><span class='nam'>encoding</span><span class='op'>,</span> <span class='nam'>errors</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>write_bytes</span><span class='op'>(</span><span class='nam'>bytes</span><span class='op'>,</span> <span class='nam'>append</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>append</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>mode</span> <span class='op'>=</span> <span class='str'>'a'</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>mode</span> <span class='op'>=</span> <span class='str'>'w'</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>f</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>open</span><span class='op'>(</span><span class='nam'>mode</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>text</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>finally</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>lines</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>encoding</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>errors</span><span class='op'>=</span><span class='str'>'strict'</span><span class='op'>,</span> <span class='nam'>retain</span><span class='op'>=</span><span class='nam'>True</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Open this file, read all lines, return them in a list.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Optional arguments:</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> encoding - The Unicode encoding (or character set) of</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> the file. The default is None, meaning the content</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> of the file is read as 8-bit characters and returned</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> as a list of (non-Unicode) str objects.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> errors - How to handle Unicode errors; see help(str.decode)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> for the options. Default is 'strict'</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> retain - If true, retain newline characters; but all newline</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> character combinations ('\r', '\n', '\r\n') are</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> translated to '\n'. If false, newline characters are</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> stripped off. Default is True.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This uses 'U' mode in Python 2.3 and later.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>encoding</span> <span class='key'>is</span> <span class='nam'>None</span> <span class='key'>and</span> <span class='nam'>retain</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>f</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>open</span><span class='op'>(</span><span class='nam'>_textmode</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>readlines</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>finally</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>text</span><span class='op'>(</span><span class='nam'>encoding</span><span class='op'>,</span> <span class='nam'>errors</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>splitlines</span><span class='op'>(</span><span class='nam'>retain</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>write_lines</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>lines</span><span class='op'>,</span> <span class='nam'>encoding</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>errors</span><span class='op'>=</span><span class='str'>'strict'</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>linesep</span><span class='op'>=</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>linesep</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Overwrite this file with the given lines of text.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> lines - A list of strings.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> encoding - A Unicode encoding to use. This applies only if</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> 'lines' contains any Unicode strings.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> errors - How to handle errors in Unicode encoding. This</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> also applies only to Unicode strings.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> linesep - A character sequence that will be added at the</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> end of every line that doesn't already have it.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>f</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>open</span><span class='op'>(</span><span class='str'>'wb'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>for</span> <span class='nam'>line</span> <span class='key'>in</span> <span class='nam'>lines</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>line</span><span class='op'>.</span><span class='nam'>endswith</span><span class='op'>(</span><span class='nam'>linesep</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>line</span> <span class='op'>+=</span> <span class='nam'>linesep</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>line</span><span class='op'>,</span> <span class='nam'>unicode</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>encoding</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>encoding</span> <span class='op'>=</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>getdefaultencoding</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>line</span> <span class='op'>=</span> <span class='nam'>line</span><span class='op'>.</span><span class='nam'>encode</span><span class='op'>(</span><span class='nam'>encoding</span><span class='op'>,</span> <span class='nam'>errors</span><span class='op'>=</span><span class='nam'>errors</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>line</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>finally</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># --- Methods for querying the filesystem.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>exists</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>exists</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>isabs</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>isabs</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>isdir</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>isdir</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>isfile</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>isfile</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>islink</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>islink</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>ismount</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>ismount</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>,</span> <span class='str'>'samefile'</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>samefile</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>samefile</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>getatime</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>getatime</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>atime</span> <span class='op'>=</span> <span class='nam'>property</span><span class='op'>(</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>getatime</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Last access time of the file. """</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>getmtime</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>getmtime</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>mtime</span> <span class='op'>=</span> <span class='nam'>property</span><span class='op'>(</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>getmtime</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Last-modified time of the file. """</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>,</span> <span class='str'>'getctime'</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>getctime</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>getctime</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>ctime</span> <span class='op'>=</span> <span class='nam'>property</span><span class='op'>(</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>getctime</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Creation time of the file. """</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>getsize</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>getsize</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>size</span> <span class='op'>=</span> <span class='nam'>property</span><span class='op'>(</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>getsize</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Size of the file, in bytes. """</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>,</span> <span class='str'>'access'</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>access</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>mode</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Return true if current user has access to this path.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> mode - One of the constants os.F_OK, os.R_OK, os.W_OK, os.X_OK</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>access</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>mode</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>stat</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Perform a stat() system call on this path. """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>stat</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>lstat</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Like path.stat(), but do not follow symbolic links. """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>lstat</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>,</span> <span class='str'>'statvfs'</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>def</span> <span class='nam'>statvfs</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Perform a statvfs() system call on this path. """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>statvfs</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>,</span> <span class='str'>'pathconf'</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>def</span> <span class='nam'>pathconf</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>name</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>pathconf</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>name</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># --- Modifying operations on files and directories</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>utime</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>times</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Set the access and modified times of this file. """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>utime</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>times</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>chmod</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>mode</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>chmod</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>mode</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>,</span> <span class='str'>'chown'</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>def</span> <span class='nam'>chown</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>uid</span><span class='op'>,</span> <span class='nam'>gid</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>chown</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>uid</span><span class='op'>,</span> <span class='nam'>gid</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>rename</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>new</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>rename</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>new</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>renames</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>new</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>renames</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>new</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># --- Create/delete operations on directories</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>mkdir</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>mode</span><span class='op'>=</span><span class='num'>0777</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>mkdir</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>mode</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>makedirs</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>mode</span><span class='op'>=</span><span class='num'>0777</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>makedirs</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>mode</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>rmdir</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>rmdir</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>removedirs</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>removedirs</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># --- Modifying operations on files</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>touch</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Set the access/modified times of this file to the current time.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Create the file if it does not exist.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>fd</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>open</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>O_WRONLY</span> <span class='op'>|</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>O_CREAT</span><span class='op'>,</span> <span class='num'>0666</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='nam'>fd</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>utime</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>remove</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>remove</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>unlink</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>unlink</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># --- Links</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>,</span> <span class='str'>'link'</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>def</span> <span class='nam'>link</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>newpath</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Create a hard link at 'newpath', pointing to this file. """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>link</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>newpath</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>,</span> <span class='str'>'symlink'</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>def</span> <span class='nam'>symlink</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>newlink</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Create a symbolic link at 'newlink', pointing here. """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>symlink</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>newlink</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>,</span> <span class='str'>'readlink'</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>def</span> <span class='nam'>readlink</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Return the path to which this symbolic link points.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> The result may be an absolute or a relative path.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>readlink</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>def</span> <span class='nam'>readlinkabs</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Return the path to which this symbolic link points.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> The result is always an absolute path.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>p</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>readlink</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>p</span><span class='op'>.</span><span class='nam'>isabs</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>p</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>parent</span> <span class='op'>/</span> <span class='nam'>p</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>abspath</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># --- High-level functions from shutil</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>copyfile</span> <span class='op'>=</span> <span class='nam'>shutil</span><span class='op'>.</span><span class='nam'>copyfile</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>copymode</span> <span class='op'>=</span> <span class='nam'>shutil</span><span class='op'>.</span><span class='nam'>copymode</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>copystat</span> <span class='op'>=</span> <span class='nam'>shutil</span><span class='op'>.</span><span class='nam'>copystat</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>copy</span> <span class='op'>=</span> <span class='nam'>shutil</span><span class='op'>.</span><span class='nam'>copy</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>copy2</span> <span class='op'>=</span> <span class='nam'>shutil</span><span class='op'>.</span><span class='nam'>copy2</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>copytree</span> <span class='op'>=</span> <span class='nam'>shutil</span><span class='op'>.</span><span class='nam'>copytree</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>shutil</span><span class='op'>,</span> <span class='str'>'move'</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>move</span> <span class='op'>=</span> <span class='nam'>shutil</span><span class='op'>.</span><span class='nam'>move</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>rmtree</span> <span class='op'>=</span> <span class='nam'>shutil</span><span class='op'>.</span><span class='nam'>rmtree</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># --- Special stuff from os</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>,</span> <span class='str'>'chroot'</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>def</span> <span class='nam'>chroot</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>chroot</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>,</span> <span class='str'>'startfile'</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>startfile</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>startfile</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-
-</td>
-</tr>
-</table>
+ <table cellspacing='0' cellpadding='0'>
+ <tr>
+ <td class='linenos' valign='top'>
+<p id='n1' class='pln'>1</p>
+<p id='n2' class='pln'>2</p>
+<p id='n3' class='pln'>3</p>
+<p id='n4' class='pln'>4</p>
+<p id='n5' class='pln'>5</p>
+<p id='n6' class='pln'>6</p>
+<p id='n7' class='pln'>7</p>
+<p id='n8' class='pln'>8</p>
+<p id='n9' class='pln'>9</p>
+<p id='n10' class='pln'>10</p>
+<p id='n11' class='pln'>11</p>
+<p id='n12' class='pln'>12</p>
+<p id='n13' class='pln'>13</p>
+<p id='n14' class='pln'>14</p>
+<p id='n15' class='pln'>15</p>
+<p id='n16' class='pln'>16</p>
+<p id='n17' class='pln'>17</p>
+<p id='n18' class='pln'>18</p>
+<p id='n19' class='pln'>19</p>
+<p id='n20' class='pln'>20</p>
+<p id='n21' class='pln'>21</p>
+<p id='n22' class='pln'>22</p>
+<p id='n23' class='pln'>23</p>
+<p id='n24' class='pln'>24</p>
+<p id='n25' class='pln'>25</p>
+<p id='n26' class='pln'>26</p>
+<p id='n27' class='pln'>27</p>
+<p id='n28' class='pln'>28</p>
+<p id='n29' class='pln'>29</p>
+<p id='n30' class='pln'>30</p>
+<p id='n31' class='pln'>31</p>
+<p id='n32' class='stm run hide_run'>32</p>
+<p id='n33' class='pln'>33</p>
+<p id='n34' class='stm run hide_run'>34</p>
+<p id='n35' class='pln'>35</p>
+<p id='n36' class='stm run hide_run'>36</p>
+<p id='n37' class='stm run hide_run'>37</p>
+<p id='n38' class='pln'>38</p>
+<p id='n39' class='pln'>39</p>
+<p id='n40' class='stm run hide_run'>40</p>
+<p id='n41' class='stm run hide_run'>41</p>
+<p id='n42' class='stm par run hide_run'>42</p>
+<p id='n43' class='stm run hide_run'>43</p>
+<p id='n44' class='stm mis'>44</p>
+<p id='n45' class='stm mis'>45</p>
+<p id='n46' class='pln'>46</p>
+<p id='n47' class='pln'>47</p>
+<p id='n48' class='stm run hide_run'>48</p>
+<p id='n49' class='stm run hide_run'>49</p>
+<p id='n50' class='stm mis'>50</p>
+<p id='n51' class='stm mis'>51</p>
+<p id='n52' class='pln'>52</p>
+<p id='n53' class='pln'>53</p>
+<p id='n54' class='stm run hide_run'>54</p>
+<p id='n55' class='stm par run hide_run'>55</p>
+<p id='n56' class='stm run hide_run'>56</p>
+<p id='n57' class='pln'>57</p>
+<p id='n58' class='pln'>58</p>
+<p id='n59' class='stm run hide_run'>59</p>
+<p id='n60' class='pln'>60</p>
+<p id='n61' class='pln'>61</p>
+<p id='n62' class='pln'>62</p>
+<p id='n63' class='pln'>63</p>
+<p id='n64' class='pln'>64</p>
+<p id='n65' class='pln'>65</p>
+<p id='n66' class='pln'>66</p>
+<p id='n67' class='pln'>67</p>
+<p id='n68' class='stm run hide_run'>68</p>
+<p id='n69' class='stm mis'>69</p>
+<p id='n70' class='pln'>70</p>
+<p id='n71' class='pln'>71</p>
+<p id='n72' class='stm run hide_run'>72</p>
+<p id='n73' class='stm mis'>73</p>
+<p id='n74' class='pln'>74</p>
+<p id='n75' class='stm run hide_run'>75</p>
+<p id='n76' class='stm mis'>76</p>
+<p id='n77' class='pln'>77</p>
+<p id='n78' class='pln'>78</p>
+<p id='n79' class='stm run hide_run'>79</p>
+<p id='n80' class='pln'>80</p>
+<p id='n81' class='pln'>81</p>
+<p id='n82' class='pln'>82</p>
+<p id='n83' class='pln'>83</p>
+<p id='n84' class='pln'>84</p>
+<p id='n85' class='stm mis'>85</p>
+<p id='n86' class='pln'>86</p>
+<p id='n87' class='pln'>87</p>
+<p id='n88' class='stm run hide_run'>88</p>
+<p id='n89' class='pln'>89</p>
+<p id='n90' class='stm run hide_run'>90</p>
+<p id='n91' class='pln'>91</p>
+<p id='n92' class='stm mis'>92</p>
+<p id='n93' class='stm run hide_run'>93</p>
+<p id='n94' class='pln'>94</p>
+<p id='n95' class='pln'>95</p>
+<p id='n96' class='pln'>96</p>
+<p id='n97' class='pln'>97</p>
+<p id='n98' class='stm par run hide_run'>98</p>
+<p id='n99' class='stm par run hide_run'>99</p>
+<p id='n100' class='stm par run hide_run'>100</p>
+<p id='n101' class='stm par run hide_run'>101</p>
+<p id='n102' class='stm par run hide_run'>102</p>
+<p id='n103' class='stm par run hide_run'>103</p>
+<p id='n104' class='stm par run hide_run'>104</p>
+<p id='n105' class='stm run hide_run'>105</p>
+<p id='n106' class='pln'>106</p>
+<p id='n107' class='stm run hide_run'>107</p>
+<p id='n108' class='pln'>108</p>
+<p id='n109' class='pln'>109</p>
+<p id='n110' class='pln'>110</p>
+<p id='n111' class='pln'>111</p>
+<p id='n112' class='pln'>112</p>
+<p id='n113' class='pln'>113</p>
+<p id='n114' class='stm mis'>114</p>
+<p id='n115' class='pln'>115</p>
+<p id='n116' class='stm run hide_run'>116</p>
+<p id='n117' class='stm mis'>117</p>
+<p id='n118' class='stm mis'>118</p>
+<p id='n119' class='pln'>119</p>
+<p id='n120' class='stm run hide_run'>120</p>
+<p id='n121' class='stm mis'>121</p>
+<p id='n122' class='stm mis'>122</p>
+<p id='n123' class='pln'>123</p>
+<p id='n124' class='stm run hide_run'>124</p>
+<p id='n125' class='stm mis'>125</p>
+<p id='n126' class='stm mis'>126</p>
+<p id='n127' class='pln'>127</p>
+<p id='n128' class='stm run hide_run'>128</p>
+<p id='n129' class='pln'>129</p>
+<p id='n130' class='pln'>130</p>
+<p id='n131' class='pln'>131</p>
+<p id='n132' class='pln'>132</p>
+<p id='n133' class='pln'>133</p>
+<p id='n134' class='pln'>134</p>
+<p id='n135' class='stm run hide_run'>135</p>
+<p id='n136' class='pln'>136</p>
+<p id='n137' class='pln'>137</p>
+<p id='n138' class='pln'>138</p>
+<p id='n139' class='pln'>139</p>
+<p id='n140' class='pln'>140</p>
+<p id='n141' class='pln'>141</p>
+<p id='n142' class='stm run hide_run'>142</p>
+<p id='n143' class='pln'>143</p>
+<p id='n144' class='pln'>144</p>
+<p id='n145' class='pln'>145</p>
+<p id='n146' class='pln'>146</p>
+<p id='n147' class='pln'>147</p>
+<p id='n148' class='pln'>148</p>
+<p id='n149' class='pln'>149</p>
+<p id='n150' class='stm run hide_run'>150</p>
+<p id='n151' class='pln'>151</p>
+<p id='n152' class='pln'>152</p>
+<p id='n153' class='pln'>153</p>
+<p id='n154' class='stm run hide_run'>154</p>
+<p id='n155' class='pln'>155</p>
+<p id='n156' class='pln'>156</p>
+<p id='n157' class='pln'>157</p>
+<p id='n158' class='pln'>158</p>
+<p id='n159' class='pln'>159</p>
+<p id='n160' class='stm run hide_run'>160</p>
+<p id='n161' class='pln'>161</p>
+<p id='n162' class='stm mis'>162</p>
+<p id='n163' class='stm mis'>163</p>
+<p id='n164' class='pln'>164</p>
+<p id='n165' class='stm run hide_run'>165</p>
+<p id='n166' class='pln'>166</p>
+<p id='n167' class='pln'>167</p>
+<p id='n168' class='pln'>168</p>
+<p id='n169' class='pln'>169</p>
+<p id='n170' class='pln'>170</p>
+<p id='n171' class='pln'>171</p>
+<p id='n172' class='stm mis'>172</p>
+<p id='n173' class='stm mis'>173</p>
+<p id='n174' class='pln'>174</p>
+<p id='n175' class='stm run hide_run'>175</p>
+<p id='n176' class='pln'>176</p>
+<p id='n177' class='pln'>177</p>
+<p id='n178' class='pln'>178</p>
+<p id='n179' class='pln'>179</p>
+<p id='n180' class='pln'>180</p>
+<p id='n181' class='pln'>181</p>
+<p id='n182' class='pln'>182</p>
+<p id='n183' class='pln'>183</p>
+<p id='n184' class='pln'>184</p>
+<p id='n185' class='pln'>185</p>
+<p id='n186' class='pln'>186</p>
+<p id='n187' class='pln'>187</p>
+<p id='n188' class='pln'>188</p>
+<p id='n189' class='stm mis'>189</p>
+<p id='n190' class='stm mis'>190</p>
+<p id='n191' class='pln'>191</p>
+<p id='n192' class='stm run hide_run'>192</p>
+<p id='n193' class='pln'>193</p>
+<p id='n194' class='pln'>194</p>
+<p id='n195' class='pln'>195</p>
+<p id='n196' class='pln'>196</p>
+<p id='n197' class='pln'>197</p>
+<p id='n198' class='stm mis'>198</p>
+<p id='n199' class='pln'>199</p>
+<p id='n200' class='stm par run hide_run'>200</p>
+<p id='n201' class='stm run hide_run'>201</p>
+<p id='n202' class='stm mis'>202</p>
+<p id='n203' class='stm mis'>203</p>
+<p id='n204' class='pln'>204</p>
+<p id='n205' class='stm run hide_run'>205</p>
+<p id='n206' class='stm mis'>206</p>
+<p id='n207' class='stm mis'>207</p>
+<p id='n208' class='pln'>208</p>
+<p id='n209' class='stm run hide_run'>209</p>
+<p id='n210' class='pln'>210</p>
+<p id='n211' class='pln'>211</p>
+<p id='n212' class='pln'>212</p>
+<p id='n213' class='pln'>213</p>
+<p id='n214' class='stm run hide_run'>214</p>
+<p id='n215' class='pln'>215</p>
+<p id='n216' class='pln'>216</p>
+<p id='n217' class='pln'>217</p>
+<p id='n218' class='pln'>218</p>
+<p id='n219' class='stm mis'>219</p>
+<p id='n220' class='pln'>220</p>
+<p id='n221' class='stm run hide_run'>221</p>
+<p id='n222' class='pln'>222</p>
+<p id='n223' class='pln'>223</p>
+<p id='n224' class='pln'>224</p>
+<p id='n225' class='pln'>225</p>
+<p id='n226' class='pln'>226</p>
+<p id='n227' class='pln'>227</p>
+<p id='n228' class='pln'>228</p>
+<p id='n229' class='pln'>229</p>
+<p id='n230' class='pln'>230</p>
+<p id='n231' class='stm mis'>231</p>
+<p id='n232' class='stm mis'>232</p>
+<p id='n233' class='stm mis'>233</p>
+<p id='n234' class='stm mis'>234</p>
+<p id='n235' class='stm mis'>235</p>
+<p id='n236' class='stm mis'>236</p>
+<p id='n237' class='stm mis'>237</p>
+<p id='n238' class='stm mis'>238</p>
+<p id='n239' class='stm mis'>239</p>
+<p id='n240' class='stm mis'>240</p>
+<p id='n241' class='stm mis'>241</p>
+<p id='n242' class='pln'>242</p>
+<p id='n243' class='stm run hide_run'>243</p>
+<p id='n244' class='pln'>244</p>
+<p id='n245' class='pln'>245</p>
+<p id='n246' class='pln'>246</p>
+<p id='n247' class='stm mis'>247</p>
+<p id='n248' class='stm mis'>248</p>
+<p id='n249' class='pln'>249</p>
+<p id='n250' class='stm run hide_run'>250</p>
+<p id='n251' class='pln'>251</p>
+<p id='n252' class='pln'>252</p>
+<p id='n253' class='pln'>253</p>
+<p id='n254' class='pln'>254</p>
+<p id='n255' class='pln'>255</p>
+<p id='n256' class='pln'>256</p>
+<p id='n257' class='stm mis'>257</p>
+<p id='n258' class='stm mis'>258</p>
+<p id='n259' class='pln'>259</p>
+<p id='n260' class='stm mis'>260</p>
+<p id='n261' class='pln'>261</p>
+<p id='n262' class='stm mis'>262</p>
+<p id='n263' class='pln'>263</p>
+<p id='n264' class='stm mis'>264</p>
+<p id='n265' class='pln'>265</p>
+<p id='n266' class='stm mis'>266</p>
+<p id='n267' class='pln'>267</p>
+<p id='n268' class='pln'>268</p>
+<p id='n269' class='stm mis'>269</p>
+<p id='n270' class='stm mis'>270</p>
+<p id='n271' class='stm mis'>271</p>
+<p id='n272' class='stm mis'>272</p>
+<p id='n273' class='stm mis'>273</p>
+<p id='n274' class='pln'>274</p>
+<p id='n275' class='pln'>275</p>
+<p id='n276' class='pln'>276</p>
+<p id='n277' class='pln'>277</p>
+<p id='n278' class='stm mis'>278</p>
+<p id='n279' class='pln'>279</p>
+<p id='n280' class='stm mis'>280</p>
+<p id='n281' class='stm mis'>281</p>
+<p id='n282' class='pln'>282</p>
+<p id='n283' class='stm mis'>283</p>
+<p id='n284' class='pln'>284</p>
+<p id='n285' class='stm mis'>285</p>
+<p id='n286' class='pln'>286</p>
+<p id='n287' class='pln'>287</p>
+<p id='n288' class='pln'>288</p>
+<p id='n289' class='pln'>289</p>
+<p id='n290' class='stm run hide_run'>290</p>
+<p id='n291' class='pln'>291</p>
+<p id='n292' class='pln'>292</p>
+<p id='n293' class='pln'>293</p>
+<p id='n294' class='pln'>294</p>
+<p id='n295' class='pln'>295</p>
+<p id='n296' class='pln'>296</p>
+<p id='n297' class='pln'>297</p>
+<p id='n298' class='pln'>298</p>
+<p id='n299' class='pln'>299</p>
+<p id='n300' class='pln'>300</p>
+<p id='n301' class='stm mis'>301</p>
+<p id='n302' class='stm mis'>302</p>
+<p id='n303' class='stm mis'>303</p>
+<p id='n304' class='stm mis'>304</p>
+<p id='n305' class='pln'>305</p>
+<p id='n306' class='stm run hide_run'>306</p>
+<p id='n307' class='pln'>307</p>
+<p id='n308' class='pln'>308</p>
+<p id='n309' class='pln'>309</p>
+<p id='n310' class='pln'>310</p>
+<p id='n311' class='pln'>311</p>
+<p id='n312' class='pln'>312</p>
+<p id='n313' class='pln'>313</p>
+<p id='n314' class='pln'>314</p>
+<p id='n315' class='pln'>315</p>
+<p id='n316' class='pln'>316</p>
+<p id='n317' class='stm mis'>317</p>
+<p id='n318' class='pln'>318</p>
+<p id='n319' class='stm run hide_run'>319</p>
+<p id='n320' class='pln'>320</p>
+<p id='n321' class='pln'>321</p>
+<p id='n322' class='pln'>322</p>
+<p id='n323' class='pln'>323</p>
+<p id='n324' class='pln'>324</p>
+<p id='n325' class='pln'>325</p>
+<p id='n326' class='pln'>326</p>
+<p id='n327' class='pln'>327</p>
+<p id='n328' class='pln'>328</p>
+<p id='n329' class='pln'>329</p>
+<p id='n330' class='stm mis'>330</p>
+<p id='n331' class='pln'>331</p>
+<p id='n332' class='stm run hide_run'>332</p>
+<p id='n333' class='pln'>333</p>
+<p id='n334' class='pln'>334</p>
+<p id='n335' class='pln'>335</p>
+<p id='n336' class='pln'>336</p>
+<p id='n337' class='pln'>337</p>
+<p id='n338' class='pln'>338</p>
+<p id='n339' class='pln'>339</p>
+<p id='n340' class='pln'>340</p>
+<p id='n341' class='pln'>341</p>
+<p id='n342' class='stm mis'>342</p>
+<p id='n343' class='stm mis'>343</p>
+<p id='n344' class='stm mis'>344</p>
+<p id='n345' class='stm mis'>345</p>
+<p id='n346' class='stm mis'>346</p>
+<p id='n347' class='stm mis'>347</p>
+<p id='n348' class='pln'>348</p>
+<p id='n349' class='stm run hide_run'>349</p>
+<p id='n350' class='pln'>350</p>
+<p id='n351' class='pln'>351</p>
+<p id='n352' class='pln'>352</p>
+<p id='n353' class='pln'>353</p>
+<p id='n354' class='pln'>354</p>
+<p id='n355' class='pln'>355</p>
+<p id='n356' class='pln'>356</p>
+<p id='n357' class='stm mis'>357</p>
+<p id='n358' class='stm mis'>358</p>
+<p id='n359' class='stm mis'>359</p>
+<p id='n360' class='stm mis'>360</p>
+<p id='n361' class='stm mis'>361</p>
+<p id='n362' class='pln'>362</p>
+<p id='n363' class='stm run hide_run'>363</p>
+<p id='n364' class='pln'>364</p>
+<p id='n365' class='pln'>365</p>
+<p id='n366' class='pln'>366</p>
+<p id='n367' class='pln'>367</p>
+<p id='n368' class='pln'>368</p>
+<p id='n369' class='pln'>369</p>
+<p id='n370' class='pln'>370</p>
+<p id='n371' class='stm mis'>371</p>
+<p id='n372' class='stm mis'>372</p>
+<p id='n373' class='stm mis'>373</p>
+<p id='n374' class='stm mis'>374</p>
+<p id='n375' class='stm mis'>375</p>
+<p id='n376' class='stm mis'>376</p>
+<p id='n377' class='stm mis'>377</p>
+<p id='n378' class='pln'>378</p>
+<p id='n379' class='stm run hide_run'>379</p>
+<p id='n380' class='pln'>380</p>
+<p id='n381' class='pln'>381</p>
+<p id='n382' class='pln'>382</p>
+<p id='n383' class='pln'>383</p>
+<p id='n384' class='pln'>384</p>
+<p id='n385' class='stm mis'>385</p>
+<p id='n386' class='pln'>386</p>
+<p id='n387' class='stm run hide_run'>387</p>
+<p id='n388' class='pln'>388</p>
+<p id='n389' class='pln'>389</p>
+<p id='n390' class='pln'>390</p>
+<p id='n391' class='pln'>391</p>
+<p id='n392' class='pln'>392</p>
+<p id='n393' class='pln'>393</p>
+<p id='n394' class='pln'>394</p>
+<p id='n395' class='stm mis'>395</p>
+<p id='n396' class='pln'>396</p>
+<p id='n397' class='pln'>397</p>
+<p id='n398' class='pln'>398</p>
+<p id='n399' class='pln'>399</p>
+<p id='n400' class='stm run hide_run'>400</p>
+<p id='n401' class='pln'>401</p>
+<p id='n402' class='stm mis'>402</p>
+<p id='n403' class='pln'>403</p>
+<p id='n404' class='stm run hide_run'>404</p>
+<p id='n405' class='pln'>405</p>
+<p id='n406' class='stm mis'>406</p>
+<p id='n407' class='stm mis'>407</p>
+<p id='n408' class='stm mis'>408</p>
+<p id='n409' class='pln'>409</p>
+<p id='n410' class='stm mis'>410</p>
+<p id='n411' class='pln'>411</p>
+<p id='n412' class='stm run hide_run'>412</p>
+<p id='n413' class='pln'>413</p>
+<p id='n414' class='pln'>414</p>
+<p id='n415' class='pln'>415</p>
+<p id='n416' class='pln'>416</p>
+<p id='n417' class='pln'>417</p>
+<p id='n418' class='stm mis'>418</p>
+<p id='n419' class='stm mis'>419</p>
+<p id='n420' class='pln'>420</p>
+<p id='n421' class='stm mis'>421</p>
+<p id='n422' class='stm mis'>422</p>
+<p id='n423' class='stm mis'>423</p>
+<p id='n424' class='stm mis'>424</p>
+<p id='n425' class='pln'>425</p>
+<p id='n426' class='stm mis'>426</p>
+<p id='n427' class='pln'>427</p>
+<p id='n428' class='stm run hide_run'>428</p>
+<p id='n429' class='pln'>429</p>
+<p id='n430' class='pln'>430</p>
+<p id='n431' class='pln'>431</p>
+<p id='n432' class='pln'>432</p>
+<p id='n433' class='pln'>433</p>
+<p id='n434' class='pln'>434</p>
+<p id='n435' class='pln'>435</p>
+<p id='n436' class='pln'>436</p>
+<p id='n437' class='pln'>437</p>
+<p id='n438' class='pln'>438</p>
+<p id='n439' class='pln'>439</p>
+<p id='n440' class='pln'>440</p>
+<p id='n441' class='pln'>441</p>
+<p id='n442' class='pln'>442</p>
+<p id='n443' class='stm mis'>443</p>
+<p id='n444' class='pln'>444</p>
+<p id='n445' class='stm mis'>445</p>
+<p id='n446' class='stm mis'>446</p>
+<p id='n447' class='stm mis'>447</p>
+<p id='n448' class='pln'>448</p>
+<p id='n449' class='stm mis'>449</p>
+<p id='n450' class='pln'>450</p>
+<p id='n451' class='pln'>451</p>
+<p id='n452' class='stm mis'>452</p>
+<p id='n453' class='pln'>453</p>
+<p id='n454' class='pln'>454</p>
+<p id='n455' class='stm mis'>455</p>
+<p id='n456' class='stm mis'>456</p>
+<p id='n457' class='pln'>457</p>
+<p id='n458' class='stm mis'>458</p>
+<p id='n459' class='stm mis'>459</p>
+<p id='n460' class='pln'>460</p>
+<p id='n461' class='stm run hide_run'>461</p>
+<p id='n462' class='pln'>462</p>
+<p id='n463' class='pln'>463</p>
+<p id='n464' class='pln'>464</p>
+<p id='n465' class='pln'>465</p>
+<p id='n466' class='pln'>466</p>
+<p id='n467' class='pln'>467</p>
+<p id='n468' class='pln'>468</p>
+<p id='n469' class='pln'>469</p>
+<p id='n470' class='pln'>470</p>
+<p id='n471' class='pln'>471</p>
+<p id='n472' class='pln'>472</p>
+<p id='n473' class='pln'>473</p>
+<p id='n474' class='pln'>474</p>
+<p id='n475' class='pln'>475</p>
+<p id='n476' class='pln'>476</p>
+<p id='n477' class='pln'>477</p>
+<p id='n478' class='pln'>478</p>
+<p id='n479' class='pln'>479</p>
+<p id='n480' class='pln'>480</p>
+<p id='n481' class='pln'>481</p>
+<p id='n482' class='pln'>482</p>
+<p id='n483' class='pln'>483</p>
+<p id='n484' class='pln'>484</p>
+<p id='n485' class='pln'>485</p>
+<p id='n486' class='pln'>486</p>
+<p id='n487' class='pln'>487</p>
+<p id='n488' class='pln'>488</p>
+<p id='n489' class='pln'>489</p>
+<p id='n490' class='pln'>490</p>
+<p id='n491' class='pln'>491</p>
+<p id='n492' class='pln'>492</p>
+<p id='n493' class='pln'>493</p>
+<p id='n494' class='pln'>494</p>
+<p id='n495' class='stm mis'>495</p>
+<p id='n496' class='stm mis'>496</p>
+<p id='n497' class='stm mis'>497</p>
+<p id='n498' class='stm mis'>498</p>
+<p id='n499' class='stm mis'>499</p>
+<p id='n500' class='stm mis'>500</p>
+<p id='n501' class='pln'>501</p>
+<p id='n502' class='stm mis'>502</p>
+<p id='n503' class='stm mis'>503</p>
+<p id='n504' class='pln'>504</p>
+<p id='n505' class='stm mis'>505</p>
+<p id='n506' class='stm mis'>506</p>
+<p id='n507' class='stm mis'>507</p>
+<p id='n508' class='stm mis'>508</p>
+<p id='n509' class='pln'>509</p>
+<p id='n510' class='stm mis'>510</p>
+<p id='n511' class='pln'>511</p>
+<p id='n512' class='stm run hide_run'>512</p>
+<p id='n513' class='pln'>513</p>
+<p id='n514' class='pln'>514</p>
+<p id='n515' class='pln'>515</p>
+<p id='n516' class='pln'>516</p>
+<p id='n517' class='pln'>517</p>
+<p id='n518' class='pln'>518</p>
+<p id='n519' class='pln'>519</p>
+<p id='n520' class='pln'>520</p>
+<p id='n521' class='pln'>521</p>
+<p id='n522' class='pln'>522</p>
+<p id='n523' class='pln'>523</p>
+<p id='n524' class='pln'>524</p>
+<p id='n525' class='pln'>525</p>
+<p id='n526' class='pln'>526</p>
+<p id='n527' class='pln'>527</p>
+<p id='n528' class='pln'>528</p>
+<p id='n529' class='stm mis'>529</p>
+<p id='n530' class='stm mis'>530</p>
+<p id='n531' class='stm mis'>531</p>
+<p id='n532' class='stm mis'>532</p>
+<p id='n533' class='pln'>533</p>
+<p id='n534' class='stm mis'>534</p>
+<p id='n535' class='pln'>535</p>
+<p id='n536' class='stm mis'>536</p>
+<p id='n537' class='pln'>537</p>
+<p id='n538' class='stm run hide_run'>538</p>
+<p id='n539' class='pln'>539</p>
+<p id='n540' class='pln'>540</p>
+<p id='n541' class='pln'>541</p>
+<p id='n542' class='pln'>542</p>
+<p id='n543' class='pln'>543</p>
+<p id='n544' class='pln'>544</p>
+<p id='n545' class='pln'>545</p>
+<p id='n546' class='pln'>546</p>
+<p id='n547' class='pln'>547</p>
+<p id='n548' class='pln'>548</p>
+<p id='n549' class='pln'>549</p>
+<p id='n550' class='stm mis'>550</p>
+<p id='n551' class='stm mis'>551</p>
+<p id='n552' class='stm mis'>552</p>
+<p id='n553' class='stm mis'>553</p>
+<p id='n554' class='stm mis'>554</p>
+<p id='n555' class='stm mis'>555</p>
+<p id='n556' class='stm mis'>556</p>
+<p id='n557' class='stm mis'>557</p>
+<p id='n558' class='stm mis'>558</p>
+<p id='n559' class='stm mis'>559</p>
+<p id='n560' class='pln'>560</p>
+<p id='n561' class='stm mis'>561</p>
+<p id='n562' class='pln'>562</p>
+<p id='n563' class='pln'>563</p>
+<p id='n564' class='pln'>564</p>
+<p id='n565' class='pln'>565</p>
+<p id='n566' class='stm run hide_run'>566</p>
+<p id='n567' class='stm run hide_run'>567</p>
+<p id='n568' class='stm run hide_run'>568</p>
+<p id='n569' class='stm run hide_run'>569</p>
+<p id='n570' class='stm run hide_run'>570</p>
+<p id='n571' class='stm run hide_run'>571</p>
+<p id='n572' class='pln'>572</p>
+<p id='n573' class='stm par run hide_run'>573</p>
+<p id='n574' class='stm mis'>574</p>
+<p id='n575' class='pln'>575</p>
+<p id='n576' class='stm run hide_run'>576</p>
+<p id='n577' class='stm run hide_run'>577</p>
+<p id='n578' class='pln'>578</p>
+<p id='n579' class='pln'>579</p>
+<p id='n580' class='pln'>580</p>
+<p id='n581' class='stm run hide_run'>581</p>
+<p id='n582' class='stm run hide_run'>582</p>
+<p id='n583' class='pln'>583</p>
+<p id='n584' class='pln'>584</p>
+<p id='n585' class='pln'>585</p>
+<p id='n586' class='stm par run hide_run'>586</p>
+<p id='n587' class='stm run hide_run'>587</p>
+<p id='n588' class='stm run hide_run'>588</p>
+<p id='n589' class='pln'>589</p>
+<p id='n590' class='pln'>590</p>
+<p id='n591' class='pln'>591</p>
+<p id='n592' class='stm run hide_run'>592</p>
+<p id='n593' class='stm run hide_run'>593</p>
+<p id='n594' class='pln'>594</p>
+<p id='n595' class='pln'>595</p>
+<p id='n596' class='pln'>596</p>
+<p id='n597' class='stm par run hide_run'>597</p>
+<p id='n598' class='stm run hide_run'>598</p>
+<p id='n599' class='pln'>599</p>
+<p id='n600' class='pln'>600</p>
+<p id='n601' class='pln'>601</p>
+<p id='n602' class='pln'>602</p>
+<p id='n603' class='stm mis'>603</p>
+<p id='n604' class='pln'>604</p>
+<p id='n605' class='stm run hide_run'>605</p>
+<p id='n606' class='pln'>606</p>
+<p id='n607' class='stm mis'>607</p>
+<p id='n608' class='pln'>608</p>
+<p id='n609' class='stm run hide_run'>609</p>
+<p id='n610' class='pln'>610</p>
+<p id='n611' class='stm mis'>611</p>
+<p id='n612' class='pln'>612</p>
+<p id='n613' class='stm par run hide_run'>613</p>
+<p id='n614' class='stm mis'>614</p>
+<p id='n615' class='pln'>615</p>
+<p id='n616' class='stm mis'>616</p>
+<p id='n617' class='pln'>617</p>
+<p id='n618' class='stm par run hide_run'>618</p>
+<p id='n619' class='stm mis'>619</p>
+<p id='n620' class='stm mis'>620</p>
+<p id='n621' class='pln'>621</p>
+<p id='n622' class='pln'>622</p>
+<p id='n623' class='pln'>623</p>
+<p id='n624' class='pln'>624</p>
+<p id='n625' class='stm run hide_run'>625</p>
+<p id='n626' class='pln'>626</p>
+<p id='n627' class='stm mis'>627</p>
+<p id='n628' class='pln'>628</p>
+<p id='n629' class='stm run hide_run'>629</p>
+<p id='n630' class='stm mis'>630</p>
+<p id='n631' class='pln'>631</p>
+<p id='n632' class='stm par run hide_run'>632</p>
+<p id='n633' class='stm mis'>633</p>
+<p id='n634' class='stm mis'>634</p>
+<p id='n635' class='pln'>635</p>
+<p id='n636' class='stm run hide_run'>636</p>
+<p id='n637' class='stm mis'>637</p>
+<p id='n638' class='pln'>638</p>
+<p id='n639' class='stm run hide_run'>639</p>
+<p id='n640' class='stm mis'>640</p>
+<p id='n641' class='pln'>641</p>
+<p id='n642' class='pln'>642</p>
+<p id='n643' class='pln'>643</p>
+<p id='n644' class='pln'>644</p>
+<p id='n645' class='stm run hide_run'>645</p>
+<p id='n646' class='stm mis'>646</p>
+<p id='n647' class='pln'>647</p>
+<p id='n648' class='stm run hide_run'>648</p>
+<p id='n649' class='stm mis'>649</p>
+<p id='n650' class='pln'>650</p>
+<p id='n651' class='stm run hide_run'>651</p>
+<p id='n652' class='stm mis'>652</p>
+<p id='n653' class='pln'>653</p>
+<p id='n654' class='stm run hide_run'>654</p>
+<p id='n655' class='stm mis'>655</p>
+<p id='n656' class='pln'>656</p>
+<p id='n657' class='pln'>657</p>
+<p id='n658' class='pln'>658</p>
+<p id='n659' class='pln'>659</p>
+<p id='n660' class='stm run hide_run'>660</p>
+<p id='n661' class='pln'>661</p>
+<p id='n662' class='pln'>662</p>
+<p id='n663' class='pln'>663</p>
+<p id='n664' class='stm mis'>664</p>
+<p id='n665' class='stm mis'>665</p>
+<p id='n666' class='stm mis'>666</p>
+<p id='n667' class='pln'>667</p>
+<p id='n668' class='stm run hide_run'>668</p>
+<p id='n669' class='stm mis'>669</p>
+<p id='n670' class='pln'>670</p>
+<p id='n671' class='stm run hide_run'>671</p>
+<p id='n672' class='stm mis'>672</p>
+<p id='n673' class='pln'>673</p>
+<p id='n674' class='pln'>674</p>
+<p id='n675' class='pln'>675</p>
+<p id='n676' class='pln'>676</p>
+<p id='n677' class='stm par run hide_run'>677</p>
+<p id='n678' class='stm mis'>678</p>
+<p id='n679' class='pln'>679</p>
+<p id='n680' class='stm mis'>680</p>
+<p id='n681' class='pln'>681</p>
+<p id='n682' class='stm par run hide_run'>682</p>
+<p id='n683' class='stm mis'>683</p>
+<p id='n684' class='pln'>684</p>
+<p id='n685' class='stm mis'>685</p>
+<p id='n686' class='pln'>686</p>
+<p id='n687' class='stm par run hide_run'>687</p>
+<p id='n688' class='stm mis'>688</p>
+<p id='n689' class='pln'>689</p>
+<p id='n690' class='pln'>690</p>
+<p id='n691' class='pln'>691</p>
+<p id='n692' class='pln'>692</p>
+<p id='n693' class='stm mis'>693</p>
+<p id='n694' class='pln'>694</p>
+<p id='n695' class='stm mis'>695</p>
+<p id='n696' class='pln'>696</p>
+<p id='n697' class='pln'>697</p>
+<p id='n698' class='pln'>698</p>
+<p id='n699' class='pln'>699</p>
+<p id='n700' class='stm mis'>700</p>
+<p id='n701' class='stm mis'>701</p>
+<p id='n702' class='stm mis'>702</p>
+<p id='n703' class='pln'>703</p>
+<p id='n704' class='stm mis'>704</p>
+<p id='n705' class='pln'>705</p>
+<p id='n706' class='pln'>706</p>
+<p id='n707' class='pln'>707</p>
+<p id='n708' class='pln'>708</p>
+<p id='n709' class='stm run hide_run'>709</p>
+<p id='n710' class='stm run hide_run'>710</p>
+<p id='n711' class='stm run hide_run'>711</p>
+<p id='n712' class='stm run hide_run'>712</p>
+<p id='n713' class='stm run hide_run'>713</p>
+<p id='n714' class='stm run hide_run'>714</p>
+<p id='n715' class='stm par run hide_run'>715</p>
+<p id='n716' class='stm run hide_run'>716</p>
+<p id='n717' class='stm run hide_run'>717</p>
+<p id='n718' class='pln'>718</p>
+<p id='n719' class='pln'>719</p>
+<p id='n720' class='pln'>720</p>
+<p id='n721' class='pln'>721</p>
+<p id='n722' class='stm par run hide_run'>722</p>
+<p id='n723' class='stm mis'>723</p>
+<p id='n724' class='stm mis'>724</p>
+<p id='n725' class='pln'>725</p>
+<p id='n726' class='stm par run hide_run'>726</p>
+<p id='n727' class='stm run hide_run'>727</p>
+<p id='n728' class='stm mis'>728</p>
+<p id='n729' class='pln'>729</p>
+
+ </td>
+ <td class='text' valign='top'>
+<p id='t1' class='pln'><span class='str'>""" path.py - An object representing a path to a file or directory.</span><span class='strut'> </span></p>
+<p id='t2' class='pln'><span class='strut'> </span></p>
+<p id='t3' class='pln'><span class='str'>Example:</span><span class='strut'> </span></p>
+<p id='t4' class='pln'><span class='strut'> </span></p>
+<p id='t5' class='pln'><span class='str'>from path import path</span><span class='strut'> </span></p>
+<p id='t6' class='pln'><span class='str'>d = path('/home/guido/bin')</span><span class='strut'> </span></p>
+<p id='t7' class='pln'><span class='str'>for f in d.files('*.py'):</span><span class='strut'> </span></p>
+<p id='t8' class='pln'><span class='str'> f.chmod(0755)</span><span class='strut'> </span></p>
+<p id='t9' class='pln'><span class='strut'> </span></p>
+<p id='t10' class='pln'><span class='str'>This module requires Python 2.2 or later.</span><span class='strut'> </span></p>
+<p id='t11' class='pln'><span class='strut'> </span></p>
+<p id='t12' class='pln'><span class='strut'> </span></p>
+<p id='t13' class='pln'><span class='str'>URL: http://www.jorendorff.com/articles/python/path</span><span class='strut'> </span></p>
+<p id='t14' class='pln'><span class='str'>Author: Jason Orendorff <jason@jorendorff.com> (and others - see the url!)</span><span class='strut'> </span></p>
+<p id='t15' class='pln'><span class='str'>Date: 29 Feb 2004</span><span class='strut'> </span></p>
+<p id='t16' class='pln'><span class='str'>"""</span><span class='strut'> </span></p>
+<p id='t17' class='pln'><span class='strut'> </span></p>
+<p id='t18' class='pln'><span class='strut'> </span></p>
+<p id='t19' class='pln'><span class='com'># TODO</span><span class='strut'> </span></p>
+<p id='t20' class='pln'><span class='com'># - Bug in write_text(). It doesn't support Universal newline mode.</span><span class='strut'> </span></p>
+<p id='t21' class='pln'><span class='com'># - Better error message in listdir() when self isn't a</span><span class='strut'> </span></p>
+<p id='t22' class='pln'><span class='com'># directory. (On Windows, the error message really sucks.)</span><span class='strut'> </span></p>
+<p id='t23' class='pln'><span class='com'># - Make sure everything has a good docstring.</span><span class='strut'> </span></p>
+<p id='t24' class='pln'><span class='com'># - Add methods for regex find and replace.</span><span class='strut'> </span></p>
+<p id='t25' class='pln'><span class='com'># - guess_content_type() method?</span><span class='strut'> </span></p>
+<p id='t26' class='pln'><span class='com'># - Perhaps support arguments to touch().</span><span class='strut'> </span></p>
+<p id='t27' class='pln'><span class='com'># - Could add split() and join() methods that generate warnings.</span><span class='strut'> </span></p>
+<p id='t28' class='pln'><span class='com'># - Note: __add__() technically has a bug, I think, where</span><span class='strut'> </span></p>
+<p id='t29' class='pln'><span class='com'># it doesn't play nice with other types that implement</span><span class='strut'> </span></p>
+<p id='t30' class='pln'><span class='com'># __radd__(). Test this.</span><span class='strut'> </span></p>
+<p id='t31' class='pln'><span class='strut'> </span></p>
+<p id='t32' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>generators</span><span class='strut'> </span></p>
+<p id='t33' class='pln'><span class='strut'> </span></p>
+<p id='t34' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>sys</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>,</span> <span class='nam'>fnmatch</span><span class='op'>,</span> <span class='nam'>glob</span><span class='op'>,</span> <span class='nam'>shutil</span><span class='op'>,</span> <span class='nam'>codecs</span><span class='strut'> </span></p>
+<p id='t35' class='pln'><span class='strut'> </span></p>
+<p id='t36' class='stm run hide_run'><span class='nam'>__version__</span> <span class='op'>=</span> <span class='str'>'2.0.2'</span><span class='strut'> </span></p>
+<p id='t37' class='stm run hide_run'><span class='nam'>__all__</span> <span class='op'>=</span> <span class='op'>[</span><span class='str'>'path'</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t38' class='pln'><span class='strut'> </span></p>
+<p id='t39' class='pln'><span class='com'># Pre-2.3 support. Are unicode filenames supported?</span><span class='strut'> </span></p>
+<p id='t40' class='stm run hide_run'><span class='nam'>_base</span> <span class='op'>=</span> <span class='nam'>str</span><span class='strut'> </span></p>
+<p id='t41' class='stm run hide_run'><span class='key'>try</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t42' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>48</span> <span class='key'>if</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>supports_unicode_filenames</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t43' class='stm run hide_run'> <span class='nam'>_base</span> <span class='op'>=</span> <span class='nam'>unicode</span><span class='strut'> </span></p>
+<p id='t44' class='stm mis'><span class='key'>except</span> <span class='nam'>AttributeError</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t45' class='stm mis'> <span class='key'>pass</span><span class='strut'> </span></p>
+<p id='t46' class='pln'><span class='strut'> </span></p>
+<p id='t47' class='pln'><span class='com'># Pre-2.3 workaround for basestring.</span><span class='strut'> </span></p>
+<p id='t48' class='stm run hide_run'><span class='key'>try</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t49' class='stm run hide_run'> <span class='nam'>basestring</span><span class='strut'> </span></p>
+<p id='t50' class='stm mis'><span class='key'>except</span> <span class='nam'>NameError</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t51' class='stm mis'> <span class='nam'>basestring</span> <span class='op'>=</span> <span class='op'>(</span><span class='nam'>str</span><span class='op'>,</span> <span class='nam'>unicode</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t52' class='pln'><span class='strut'> </span></p>
+<p id='t53' class='pln'><span class='com'># Universal newline support</span><span class='strut'> </span></p>
+<p id='t54' class='stm run hide_run'><span class='nam'>_textmode</span> <span class='op'>=</span> <span class='str'>'r'</span><span class='strut'> </span></p>
+<p id='t55' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>59</span><span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>file</span><span class='op'>,</span> <span class='str'>'newlines'</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t56' class='stm run hide_run'> <span class='nam'>_textmode</span> <span class='op'>=</span> <span class='str'>'U'</span><span class='strut'> </span></p>
+<p id='t57' class='pln'><span class='strut'> </span></p>
+<p id='t58' class='pln'><span class='strut'> </span></p>
+<p id='t59' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>_base</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t60' class='pln'> <span class='str'>""" Represents a filesystem path.</span><span class='strut'> </span></p>
+<p id='t61' class='pln'><span class='strut'> </span></p>
+<p id='t62' class='pln'><span class='str'> For documentation on individual methods, consult their</span><span class='strut'> </span></p>
+<p id='t63' class='pln'><span class='str'> counterparts in os.path.</span><span class='strut'> </span></p>
+<p id='t64' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t65' class='pln'><span class='strut'> </span></p>
+<p id='t66' class='pln'> <span class='com'># --- Special Python methods.</span><span class='strut'> </span></p>
+<p id='t67' class='pln'><span class='strut'> </span></p>
+<p id='t68' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>__repr__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t69' class='stm mis'> <span class='key'>return</span> <span class='str'>'path(%s)'</span> <span class='op'>%</span> <span class='nam'>_base</span><span class='op'>.</span><span class='nam'>__repr__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t70' class='pln'><span class='strut'> </span></p>
+<p id='t71' class='pln'> <span class='com'># Adding a path and a string yields a path.</span><span class='strut'> </span></p>
+<p id='t72' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>__add__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>more</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t73' class='stm mis'> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>_base</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span> <span class='op'>+</span> <span class='nam'>more</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t74' class='pln'><span class='strut'> </span></p>
+<p id='t75' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>__radd__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>other</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t76' class='stm mis'> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>other</span> <span class='op'>+</span> <span class='nam'>_base</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t77' class='pln'><span class='strut'> </span></p>
+<p id='t78' class='pln'> <span class='com'># The / operator joins paths.</span><span class='strut'> </span></p>
+<p id='t79' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>__div__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>rel</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t80' class='pln'> <span class='str'>""" fp.__div__(rel) == fp / rel == fp.joinpath(rel)</span><span class='strut'> </span></p>
+<p id='t81' class='pln'><span class='strut'> </span></p>
+<p id='t82' class='pln'><span class='str'> Join two path components, adding a separator character if</span><span class='strut'> </span></p>
+<p id='t83' class='pln'><span class='str'> needed.</span><span class='strut'> </span></p>
+<p id='t84' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t85' class='stm mis'> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>rel</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t86' class='pln'><span class='strut'> </span></p>
+<p id='t87' class='pln'> <span class='com'># Make the / operator work even when true division is enabled.</span><span class='strut'> </span></p>
+<p id='t88' class='stm run hide_run'> <span class='nam'>__truediv__</span> <span class='op'>=</span> <span class='nam'>__div__</span><span class='strut'> </span></p>
+<p id='t89' class='pln'><span class='strut'> </span></p>
+<p id='t90' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>getcwd</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t91' class='pln'> <span class='str'>""" Return the current working directory as a path object. """</span><span class='strut'> </span></p>
+<p id='t92' class='stm mis'> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>getcwd</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t93' class='stm run hide_run'> <span class='nam'>getcwd</span> <span class='op'>=</span> <span class='nam'>staticmethod</span><span class='op'>(</span><span class='nam'>getcwd</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t94' class='pln'><span class='strut'> </span></p>
+<p id='t95' class='pln'><span class='strut'> </span></p>
+<p id='t96' class='pln'> <span class='com'># --- Operations on path strings.</span><span class='strut'> </span></p>
+<p id='t97' class='pln'><span class='strut'> </span></p>
+<p id='t98' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>exit</span> <span class='key'>def</span> <span class='nam'>abspath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>abspath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t99' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>exit</span> <span class='key'>def</span> <span class='nam'>normcase</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>normcase</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t100' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>exit</span> <span class='key'>def</span> <span class='nam'>normpath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>normpath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t101' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>exit</span> <span class='key'>def</span> <span class='nam'>realpath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>realpath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t102' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>exit</span> <span class='key'>def</span> <span class='nam'>expanduser</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>expanduser</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t103' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>exit</span> <span class='key'>def</span> <span class='nam'>expandvars</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>expandvars</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t104' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>exit</span> <span class='key'>def</span> <span class='nam'>dirname</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>dirname</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t105' class='stm run hide_run'> <span class='nam'>basename</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>basename</span><span class='strut'> </span></p>
+<p id='t106' class='pln'><span class='strut'> </span></p>
+<p id='t107' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>expand</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t108' class='pln'> <span class='str'>""" Clean up a filename by calling expandvars(),</span><span class='strut'> </span></p>
+<p id='t109' class='pln'><span class='str'> expanduser(), and normpath() on it.</span><span class='strut'> </span></p>
+<p id='t110' class='pln'><span class='strut'> </span></p>
+<p id='t111' class='pln'><span class='str'> This is commonly everything needed to clean up a filename</span><span class='strut'> </span></p>
+<p id='t112' class='pln'><span class='str'> read from a configuration file, for example.</span><span class='strut'> </span></p>
+<p id='t113' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t114' class='stm mis'> <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>expandvars</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>expanduser</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>normpath</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t115' class='pln'><span class='strut'> </span></p>
+<p id='t116' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>_get_namebase</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t117' class='stm mis'> <span class='nam'>base</span><span class='op'>,</span> <span class='nam'>ext</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>splitext</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>name</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t118' class='stm mis'> <span class='key'>return</span> <span class='nam'>base</span><span class='strut'> </span></p>
+<p id='t119' class='pln'><span class='strut'> </span></p>
+<p id='t120' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>_get_ext</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t121' class='stm mis'> <span class='nam'>f</span><span class='op'>,</span> <span class='nam'>ext</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>splitext</span><span class='op'>(</span><span class='nam'>_base</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t122' class='stm mis'> <span class='key'>return</span> <span class='nam'>ext</span><span class='strut'> </span></p>
+<p id='t123' class='pln'><span class='strut'> </span></p>
+<p id='t124' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>_get_drive</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t125' class='stm mis'> <span class='nam'>drive</span><span class='op'>,</span> <span class='nam'>r</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>splitdrive</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t126' class='stm mis'> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>drive</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t127' class='pln'><span class='strut'> </span></p>
+<p id='t128' class='stm run hide_run'> <span class='nam'>parent</span> <span class='op'>=</span> <span class='nam'>property</span><span class='op'>(</span><span class='strut'> </span></p>
+<p id='t129' class='pln'> <span class='nam'>dirname</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t130' class='pln'> <span class='str'>""" This path's parent directory, as a new path object.</span><span class='strut'> </span></p>
+<p id='t131' class='pln'><span class='strut'> </span></p>
+<p id='t132' class='pln'><span class='str'> For example, path('/usr/local/lib/libpython.so').parent == path('/usr/local/lib')</span><span class='strut'> </span></p>
+<p id='t133' class='pln'><span class='str'> """</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t134' class='pln'><span class='strut'> </span></p>
+<p id='t135' class='stm run hide_run'> <span class='nam'>name</span> <span class='op'>=</span> <span class='nam'>property</span><span class='op'>(</span><span class='strut'> </span></p>
+<p id='t136' class='pln'> <span class='nam'>basename</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t137' class='pln'> <span class='str'>""" The name of this file or directory without the full path.</span><span class='strut'> </span></p>
+<p id='t138' class='pln'><span class='strut'> </span></p>
+<p id='t139' class='pln'><span class='str'> For example, path('/usr/local/lib/libpython.so').name == 'libpython.so'</span><span class='strut'> </span></p>
+<p id='t140' class='pln'><span class='str'> """</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t141' class='pln'><span class='strut'> </span></p>
+<p id='t142' class='stm run hide_run'> <span class='nam'>namebase</span> <span class='op'>=</span> <span class='nam'>property</span><span class='op'>(</span><span class='strut'> </span></p>
+<p id='t143' class='pln'> <span class='nam'>_get_namebase</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t144' class='pln'> <span class='str'>""" The same as path.name, but with one file extension stripped off.</span><span class='strut'> </span></p>
+<p id='t145' class='pln'><span class='strut'> </span></p>
+<p id='t146' class='pln'><span class='str'> For example, path('/home/guido/python.tar.gz').name == 'python.tar.gz',</span><span class='strut'> </span></p>
+<p id='t147' class='pln'><span class='str'> but path('/home/guido/python.tar.gz').namebase == 'python.tar'</span><span class='strut'> </span></p>
+<p id='t148' class='pln'><span class='str'> """</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t149' class='pln'><span class='strut'> </span></p>
+<p id='t150' class='stm run hide_run'> <span class='nam'>ext</span> <span class='op'>=</span> <span class='nam'>property</span><span class='op'>(</span><span class='strut'> </span></p>
+<p id='t151' class='pln'> <span class='nam'>_get_ext</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t152' class='pln'> <span class='str'>""" The file extension, for example '.py'. """</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t153' class='pln'><span class='strut'> </span></p>
+<p id='t154' class='stm run hide_run'> <span class='nam'>drive</span> <span class='op'>=</span> <span class='nam'>property</span><span class='op'>(</span><span class='strut'> </span></p>
+<p id='t155' class='pln'> <span class='nam'>_get_drive</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t156' class='pln'> <span class='str'>""" The drive specifier, for example 'C:'.</span><span class='strut'> </span></p>
+<p id='t157' class='pln'><span class='str'> This is always empty on systems that don't use drive specifiers.</span><span class='strut'> </span></p>
+<p id='t158' class='pln'><span class='str'> """</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t159' class='pln'><span class='strut'> </span></p>
+<p id='t160' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>splitpath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t161' class='pln'> <span class='str'>""" p.splitpath() -> Return (p.parent, p.name). """</span><span class='strut'> </span></p>
+<p id='t162' class='stm mis'> <span class='nam'>parent</span><span class='op'>,</span> <span class='nam'>child</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t163' class='stm mis'> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>parent</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>child</span><span class='strut'> </span></p>
+<p id='t164' class='pln'><span class='strut'> </span></p>
+<p id='t165' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>splitdrive</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t166' class='pln'> <span class='str'>""" p.splitdrive() -> Return (p.drive, <the rest of p>).</span><span class='strut'> </span></p>
+<p id='t167' class='pln'><span class='strut'> </span></p>
+<p id='t168' class='pln'><span class='str'> Split the drive specifier from this path. If there is</span><span class='strut'> </span></p>
+<p id='t169' class='pln'><span class='str'> no drive specifier, p.drive is empty, so the return value</span><span class='strut'> </span></p>
+<p id='t170' class='pln'><span class='str'> is simply (path(''), p). This is always the case on Unix.</span><span class='strut'> </span></p>
+<p id='t171' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t172' class='stm mis'> <span class='nam'>drive</span><span class='op'>,</span> <span class='nam'>rel</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>splitdrive</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t173' class='stm mis'> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>drive</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>rel</span><span class='strut'> </span></p>
+<p id='t174' class='pln'><span class='strut'> </span></p>
+<p id='t175' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>splitext</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t176' class='pln'> <span class='str'>""" p.splitext() -> Return (p.stripext(), p.ext).</span><span class='strut'> </span></p>
+<p id='t177' class='pln'><span class='strut'> </span></p>
+<p id='t178' class='pln'><span class='str'> Split the filename extension from this path and return</span><span class='strut'> </span></p>
+<p id='t179' class='pln'><span class='str'> the two parts. Either part may be empty.</span><span class='strut'> </span></p>
+<p id='t180' class='pln'><span class='strut'> </span></p>
+<p id='t181' class='pln'><span class='str'> The extension is everything from '.' to the end of the</span><span class='strut'> </span></p>
+<p id='t182' class='pln'><span class='str'> last path segment. This has the property that if</span><span class='strut'> </span></p>
+<p id='t183' class='pln'><span class='str'> (a, b) == p.splitext(), then a + b == p.</span><span class='strut'> </span></p>
+<p id='t184' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t185' class='pln'> <span class='com'># Cast to plain string using _base because Python 2.2</span><span class='strut'> </span></p>
+<p id='t186' class='pln'> <span class='com'># implementations of os.path.splitext use "for c in path:..."</span><span class='strut'> </span></p>
+<p id='t187' class='pln'> <span class='com'># which means something different when applied to a path</span><span class='strut'> </span></p>
+<p id='t188' class='pln'> <span class='com'># object.</span><span class='strut'> </span></p>
+<p id='t189' class='stm mis'> <span class='nam'>filename</span><span class='op'>,</span> <span class='nam'>ext</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>splitext</span><span class='op'>(</span><span class='nam'>_base</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t190' class='stm mis'> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>filename</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>ext</span><span class='strut'> </span></p>
+<p id='t191' class='pln'><span class='strut'> </span></p>
+<p id='t192' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>stripext</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t193' class='pln'> <span class='str'>""" p.stripext() -> Remove one file extension from the path.</span><span class='strut'> </span></p>
+<p id='t194' class='pln'><span class='strut'> </span></p>
+<p id='t195' class='pln'><span class='str'> For example, path('/home/guido/python.tar.gz').stripext()</span><span class='strut'> </span></p>
+<p id='t196' class='pln'><span class='str'> returns path('/home/guido/python.tar').</span><span class='strut'> </span></p>
+<p id='t197' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t198' class='stm mis'> <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>splitext</span><span class='op'>(</span><span class='op'>)</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t199' class='pln'><span class='strut'> </span></p>
+<p id='t200' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>214</span> <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>,</span> <span class='str'>'splitunc'</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t201' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>splitunc</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t202' class='stm mis'> <span class='nam'>unc</span><span class='op'>,</span> <span class='nam'>rest</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>splitunc</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t203' class='stm mis'> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>unc</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>rest</span><span class='strut'> </span></p>
+<p id='t204' class='pln'><span class='strut'> </span></p>
+<p id='t205' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>_get_uncshare</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t206' class='stm mis'> <span class='nam'>unc</span><span class='op'>,</span> <span class='nam'>r</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>splitunc</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t207' class='stm mis'> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>unc</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t208' class='pln'><span class='strut'> </span></p>
+<p id='t209' class='stm run hide_run'> <span class='nam'>uncshare</span> <span class='op'>=</span> <span class='nam'>property</span><span class='op'>(</span><span class='strut'> </span></p>
+<p id='t210' class='pln'> <span class='nam'>_get_uncshare</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t211' class='pln'> <span class='str'>""" The UNC mount point for this path.</span><span class='strut'> </span></p>
+<p id='t212' class='pln'><span class='str'> This is empty for paths on local drives. """</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t213' class='pln'><span class='strut'> </span></p>
+<p id='t214' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>joinpath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t215' class='pln'> <span class='str'>""" Join two or more path components, adding a separator</span><span class='strut'> </span></p>
+<p id='t216' class='pln'><span class='str'> character (os.sep) if needed. Returns a new path</span><span class='strut'> </span></p>
+<p id='t217' class='pln'><span class='str'> object.</span><span class='strut'> </span></p>
+<p id='t218' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t219' class='stm mis'> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t220' class='pln'><span class='strut'> </span></p>
+<p id='t221' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>splitall</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t222' class='pln'> <span class='str'>""" Return a list of the path components in this path.</span><span class='strut'> </span></p>
+<p id='t223' class='pln'><span class='strut'> </span></p>
+<p id='t224' class='pln'><span class='str'> The first item in the list will be a path. Its value will be</span><span class='strut'> </span></p>
+<p id='t225' class='pln'><span class='str'> either os.curdir, os.pardir, empty, or the root directory of</span><span class='strut'> </span></p>
+<p id='t226' class='pln'><span class='str'> this path (for example, '/' or 'C:\\'). The other items in</span><span class='strut'> </span></p>
+<p id='t227' class='pln'><span class='str'> the list will be strings.</span><span class='strut'> </span></p>
+<p id='t228' class='pln'><span class='strut'> </span></p>
+<p id='t229' class='pln'><span class='str'> path.path.joinpath(*result) will yield the original path.</span><span class='strut'> </span></p>
+<p id='t230' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t231' class='stm mis'> <span class='nam'>parts</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t232' class='stm mis'> <span class='nam'>loc</span> <span class='op'>=</span> <span class='nam'>self</span><span class='strut'> </span></p>
+<p id='t233' class='stm mis'> <span class='key'>while</span> <span class='nam'>loc</span> <span class='op'>!=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>curdir</span> <span class='key'>and</span> <span class='nam'>loc</span> <span class='op'>!=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>pardir</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t234' class='stm mis'> <span class='nam'>prev</span> <span class='op'>=</span> <span class='nam'>loc</span><span class='strut'> </span></p>
+<p id='t235' class='stm mis'> <span class='nam'>loc</span><span class='op'>,</span> <span class='nam'>child</span> <span class='op'>=</span> <span class='nam'>prev</span><span class='op'>.</span><span class='nam'>splitpath</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t236' class='stm mis'> <span class='key'>if</span> <span class='nam'>loc</span> <span class='op'>==</span> <span class='nam'>prev</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t237' class='stm mis'> <span class='key'>break</span><span class='strut'> </span></p>
+<p id='t238' class='stm mis'> <span class='nam'>parts</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>child</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t239' class='stm mis'> <span class='nam'>parts</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>loc</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t240' class='stm mis'> <span class='nam'>parts</span><span class='op'>.</span><span class='nam'>reverse</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t241' class='stm mis'> <span class='key'>return</span> <span class='nam'>parts</span><span class='strut'> </span></p>
+<p id='t242' class='pln'><span class='strut'> </span></p>
+<p id='t243' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>relpath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t244' class='pln'> <span class='str'>""" Return this path as a relative path,</span><span class='strut'> </span></p>
+<p id='t245' class='pln'><span class='str'> based from the current working directory.</span><span class='strut'> </span></p>
+<p id='t246' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t247' class='stm mis'> <span class='nam'>cwd</span> <span class='op'>=</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>getcwd</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t248' class='stm mis'> <span class='key'>return</span> <span class='nam'>cwd</span><span class='op'>.</span><span class='nam'>relpathto</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t249' class='pln'><span class='strut'> </span></p>
+<p id='t250' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>relpathto</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>dest</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t251' class='pln'> <span class='str'>""" Return a relative path from self to dest.</span><span class='strut'> </span></p>
+<p id='t252' class='pln'><span class='strut'> </span></p>
+<p id='t253' class='pln'><span class='str'> If there is no relative path from self to dest, for example if</span><span class='strut'> </span></p>
+<p id='t254' class='pln'><span class='str'> they reside on different drives in Windows, then this returns</span><span class='strut'> </span></p>
+<p id='t255' class='pln'><span class='str'> dest.abspath().</span><span class='strut'> </span></p>
+<p id='t256' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t257' class='stm mis'> <span class='nam'>origin</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>abspath</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t258' class='stm mis'> <span class='nam'>dest</span> <span class='op'>=</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>dest</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>abspath</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t259' class='pln'><span class='strut'> </span></p>
+<p id='t260' class='stm mis'> <span class='nam'>orig_list</span> <span class='op'>=</span> <span class='nam'>origin</span><span class='op'>.</span><span class='nam'>normcase</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>splitall</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t261' class='pln'> <span class='com'># Don't normcase dest! We want to preserve the case.</span><span class='strut'> </span></p>
+<p id='t262' class='stm mis'> <span class='nam'>dest_list</span> <span class='op'>=</span> <span class='nam'>dest</span><span class='op'>.</span><span class='nam'>splitall</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t263' class='pln'><span class='strut'> </span></p>
+<p id='t264' class='stm mis'> <span class='key'>if</span> <span class='nam'>orig_list</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span> <span class='op'>!=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>normcase</span><span class='op'>(</span><span class='nam'>dest_list</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t265' class='pln'> <span class='com'># Can't get here from there.</span><span class='strut'> </span></p>
+<p id='t266' class='stm mis'> <span class='key'>return</span> <span class='nam'>dest</span><span class='strut'> </span></p>
+<p id='t267' class='pln'><span class='strut'> </span></p>
+<p id='t268' class='pln'> <span class='com'># Find the location where the two paths start to differ.</span><span class='strut'> </span></p>
+<p id='t269' class='stm mis'> <span class='nam'>i</span> <span class='op'>=</span> <span class='num'>0</span><span class='strut'> </span></p>
+<p id='t270' class='stm mis'> <span class='key'>for</span> <span class='nam'>start_seg</span><span class='op'>,</span> <span class='nam'>dest_seg</span> <span class='key'>in</span> <span class='nam'>zip</span><span class='op'>(</span><span class='nam'>orig_list</span><span class='op'>,</span> <span class='nam'>dest_list</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t271' class='stm mis'> <span class='key'>if</span> <span class='nam'>start_seg</span> <span class='op'>!=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>normcase</span><span class='op'>(</span><span class='nam'>dest_seg</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t272' class='stm mis'> <span class='key'>break</span><span class='strut'> </span></p>
+<p id='t273' class='stm mis'> <span class='nam'>i</span> <span class='op'>+=</span> <span class='num'>1</span><span class='strut'> </span></p>
+<p id='t274' class='pln'><span class='strut'> </span></p>
+<p id='t275' class='pln'> <span class='com'># Now i is the point where the two paths diverge.</span><span class='strut'> </span></p>
+<p id='t276' class='pln'> <span class='com'># Need a certain number of "os.pardir"s to work up</span><span class='strut'> </span></p>
+<p id='t277' class='pln'> <span class='com'># from the origin to the point of divergence.</span><span class='strut'> </span></p>
+<p id='t278' class='stm mis'> <span class='nam'>segments</span> <span class='op'>=</span> <span class='op'>[</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>pardir</span><span class='op'>]</span> <span class='op'>*</span> <span class='op'>(</span><span class='nam'>len</span><span class='op'>(</span><span class='nam'>orig_list</span><span class='op'>)</span> <span class='op'>-</span> <span class='nam'>i</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t279' class='pln'> <span class='com'># Need to add the diverging part of dest_list.</span><span class='strut'> </span></p>
+<p id='t280' class='stm mis'> <span class='nam'>segments</span> <span class='op'>+=</span> <span class='nam'>dest_list</span><span class='op'>[</span><span class='nam'>i</span><span class='op'>:</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t281' class='stm mis'> <span class='key'>if</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>segments</span><span class='op'>)</span> <span class='op'>==</span> <span class='num'>0</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t282' class='pln'> <span class='com'># If they happen to be identical, use os.curdir.</span><span class='strut'> </span></p>
+<p id='t283' class='stm mis'> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>curdir</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t284' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t285' class='stm mis'> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='op'>*</span><span class='nam'>segments</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t286' class='pln'><span class='strut'> </span></p>
+<p id='t287' class='pln'><span class='strut'> </span></p>
+<p id='t288' class='pln'> <span class='com'># --- Listing, searching, walking, and matching</span><span class='strut'> </span></p>
+<p id='t289' class='pln'><span class='strut'> </span></p>
+<p id='t290' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>listdir</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>pattern</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t291' class='pln'> <span class='str'>""" D.listdir() -> List of items in this directory.</span><span class='strut'> </span></p>
+<p id='t292' class='pln'><span class='strut'> </span></p>
+<p id='t293' class='pln'><span class='str'> Use D.files() or D.dirs() instead if you want a listing</span><span class='strut'> </span></p>
+<p id='t294' class='pln'><span class='str'> of just files or just subdirectories.</span><span class='strut'> </span></p>
+<p id='t295' class='pln'><span class='strut'> </span></p>
+<p id='t296' class='pln'><span class='str'> The elements of the list are path objects.</span><span class='strut'> </span></p>
+<p id='t297' class='pln'><span class='strut'> </span></p>
+<p id='t298' class='pln'><span class='str'> With the optional 'pattern' argument, this only lists</span><span class='strut'> </span></p>
+<p id='t299' class='pln'><span class='str'> items whose names match the given pattern.</span><span class='strut'> </span></p>
+<p id='t300' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t301' class='stm mis'> <span class='nam'>names</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>listdir</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t302' class='stm mis'> <span class='key'>if</span> <span class='nam'>pattern</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t303' class='stm mis'> <span class='nam'>names</span> <span class='op'>=</span> <span class='nam'>fnmatch</span><span class='op'>.</span><span class='nam'>filter</span><span class='op'>(</span><span class='nam'>names</span><span class='op'>,</span> <span class='nam'>pattern</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t304' class='stm mis'> <span class='key'>return</span> <span class='op'>[</span><span class='nam'>self</span> <span class='op'>/</span> <span class='nam'>child</span> <span class='key'>for</span> <span class='nam'>child</span> <span class='key'>in</span> <span class='nam'>names</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t305' class='pln'><span class='strut'> </span></p>
+<p id='t306' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>dirs</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>pattern</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t307' class='pln'> <span class='str'>""" D.dirs() -> List of this directory's subdirectories.</span><span class='strut'> </span></p>
+<p id='t308' class='pln'><span class='strut'> </span></p>
+<p id='t309' class='pln'><span class='str'> The elements of the list are path objects.</span><span class='strut'> </span></p>
+<p id='t310' class='pln'><span class='str'> This does not walk recursively into subdirectories</span><span class='strut'> </span></p>
+<p id='t311' class='pln'><span class='str'> (but see path.walkdirs).</span><span class='strut'> </span></p>
+<p id='t312' class='pln'><span class='strut'> </span></p>
+<p id='t313' class='pln'><span class='str'> With the optional 'pattern' argument, this only lists</span><span class='strut'> </span></p>
+<p id='t314' class='pln'><span class='str'> directories whose names match the given pattern. For</span><span class='strut'> </span></p>
+<p id='t315' class='pln'><span class='str'> example, d.dirs('build-*').</span><span class='strut'> </span></p>
+<p id='t316' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t317' class='stm mis'> <span class='key'>return</span> <span class='op'>[</span><span class='nam'>p</span> <span class='key'>for</span> <span class='nam'>p</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>listdir</span><span class='op'>(</span><span class='nam'>pattern</span><span class='op'>)</span> <span class='key'>if</span> <span class='nam'>p</span><span class='op'>.</span><span class='nam'>isdir</span><span class='op'>(</span><span class='op'>)</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t318' class='pln'><span class='strut'> </span></p>
+<p id='t319' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>files</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>pattern</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t320' class='pln'> <span class='str'>""" D.files() -> List of the files in this directory.</span><span class='strut'> </span></p>
+<p id='t321' class='pln'><span class='strut'> </span></p>
+<p id='t322' class='pln'><span class='str'> The elements of the list are path objects.</span><span class='strut'> </span></p>
+<p id='t323' class='pln'><span class='str'> This does not walk into subdirectories (see path.walkfiles).</span><span class='strut'> </span></p>
+<p id='t324' class='pln'><span class='strut'> </span></p>
+<p id='t325' class='pln'><span class='str'> With the optional 'pattern' argument, this only lists files</span><span class='strut'> </span></p>
+<p id='t326' class='pln'><span class='str'> whose names match the given pattern. For example,</span><span class='strut'> </span></p>
+<p id='t327' class='pln'><span class='str'> d.files('*.pyc').</span><span class='strut'> </span></p>
+<p id='t328' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t329' class='pln'><span class='strut'> </span></p>
+<p id='t330' class='stm mis'> <span class='key'>return</span> <span class='op'>[</span><span class='nam'>p</span> <span class='key'>for</span> <span class='nam'>p</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>listdir</span><span class='op'>(</span><span class='nam'>pattern</span><span class='op'>)</span> <span class='key'>if</span> <span class='nam'>p</span><span class='op'>.</span><span class='nam'>isfile</span><span class='op'>(</span><span class='op'>)</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t331' class='pln'><span class='strut'> </span></p>
+<p id='t332' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>walk</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>pattern</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t333' class='pln'> <span class='str'>""" D.walk() -> iterator over files and subdirs, recursively.</span><span class='strut'> </span></p>
+<p id='t334' class='pln'><span class='strut'> </span></p>
+<p id='t335' class='pln'><span class='str'> The iterator yields path objects naming each child item of</span><span class='strut'> </span></p>
+<p id='t336' class='pln'><span class='str'> this directory and its descendants. This requires that</span><span class='strut'> </span></p>
+<p id='t337' class='pln'><span class='str'> D.isdir().</span><span class='strut'> </span></p>
+<p id='t338' class='pln'><span class='strut'> </span></p>
+<p id='t339' class='pln'><span class='str'> This performs a depth-first traversal of the directory tree.</span><span class='strut'> </span></p>
+<p id='t340' class='pln'><span class='str'> Each directory is returned just before all its children.</span><span class='strut'> </span></p>
+<p id='t341' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t342' class='stm mis'> <span class='key'>for</span> <span class='nam'>child</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>listdir</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t343' class='stm mis'> <span class='key'>if</span> <span class='nam'>pattern</span> <span class='key'>is</span> <span class='nam'>None</span> <span class='key'>or</span> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>fnmatch</span><span class='op'>(</span><span class='nam'>pattern</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t344' class='stm mis'> <span class='key'>yield</span> <span class='nam'>child</span><span class='strut'> </span></p>
+<p id='t345' class='stm mis'> <span class='key'>if</span> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>isdir</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t346' class='stm mis'> <span class='key'>for</span> <span class='nam'>item</span> <span class='key'>in</span> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>walk</span><span class='op'>(</span><span class='nam'>pattern</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t347' class='stm mis'> <span class='key'>yield</span> <span class='nam'>item</span><span class='strut'> </span></p>
+<p id='t348' class='pln'><span class='strut'> </span></p>
+<p id='t349' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>walkdirs</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>pattern</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t350' class='pln'> <span class='str'>""" D.walkdirs() -> iterator over subdirs, recursively.</span><span class='strut'> </span></p>
+<p id='t351' class='pln'><span class='strut'> </span></p>
+<p id='t352' class='pln'><span class='str'> With the optional 'pattern' argument, this yields only</span><span class='strut'> </span></p>
+<p id='t353' class='pln'><span class='str'> directories whose names match the given pattern. For</span><span class='strut'> </span></p>
+<p id='t354' class='pln'><span class='str'> example, mydir.walkdirs('*test') yields only directories</span><span class='strut'> </span></p>
+<p id='t355' class='pln'><span class='str'> with names ending in 'test'.</span><span class='strut'> </span></p>
+<p id='t356' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t357' class='stm mis'> <span class='key'>for</span> <span class='nam'>child</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>dirs</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t358' class='stm mis'> <span class='key'>if</span> <span class='nam'>pattern</span> <span class='key'>is</span> <span class='nam'>None</span> <span class='key'>or</span> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>fnmatch</span><span class='op'>(</span><span class='nam'>pattern</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t359' class='stm mis'> <span class='key'>yield</span> <span class='nam'>child</span><span class='strut'> </span></p>
+<p id='t360' class='stm mis'> <span class='key'>for</span> <span class='nam'>subsubdir</span> <span class='key'>in</span> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>walkdirs</span><span class='op'>(</span><span class='nam'>pattern</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t361' class='stm mis'> <span class='key'>yield</span> <span class='nam'>subsubdir</span><span class='strut'> </span></p>
+<p id='t362' class='pln'><span class='strut'> </span></p>
+<p id='t363' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>walkfiles</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>pattern</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t364' class='pln'> <span class='str'>""" D.walkfiles() -> iterator over files in D, recursively.</span><span class='strut'> </span></p>
+<p id='t365' class='pln'><span class='strut'> </span></p>
+<p id='t366' class='pln'><span class='str'> The optional argument, pattern, limits the results to files</span><span class='strut'> </span></p>
+<p id='t367' class='pln'><span class='str'> with names that match the pattern. For example,</span><span class='strut'> </span></p>
+<p id='t368' class='pln'><span class='str'> mydir.walkfiles('*.tmp') yields only files with the .tmp</span><span class='strut'> </span></p>
+<p id='t369' class='pln'><span class='str'> extension.</span><span class='strut'> </span></p>
+<p id='t370' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t371' class='stm mis'> <span class='key'>for</span> <span class='nam'>child</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>listdir</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t372' class='stm mis'> <span class='key'>if</span> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>isfile</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t373' class='stm mis'> <span class='key'>if</span> <span class='nam'>pattern</span> <span class='key'>is</span> <span class='nam'>None</span> <span class='key'>or</span> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>fnmatch</span><span class='op'>(</span><span class='nam'>pattern</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t374' class='stm mis'> <span class='key'>yield</span> <span class='nam'>child</span><span class='strut'> </span></p>
+<p id='t375' class='stm mis'> <span class='key'>elif</span> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>isdir</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t376' class='stm mis'> <span class='key'>for</span> <span class='nam'>f</span> <span class='key'>in</span> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>walkfiles</span><span class='op'>(</span><span class='nam'>pattern</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t377' class='stm mis'> <span class='key'>yield</span> <span class='nam'>f</span><span class='strut'> </span></p>
+<p id='t378' class='pln'><span class='strut'> </span></p>
+<p id='t379' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>fnmatch</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>pattern</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t380' class='pln'> <span class='str'>""" Return True if self.name matches the given pattern.</span><span class='strut'> </span></p>
+<p id='t381' class='pln'><span class='strut'> </span></p>
+<p id='t382' class='pln'><span class='str'> pattern - A filename pattern with wildcards,</span><span class='strut'> </span></p>
+<p id='t383' class='pln'><span class='str'> for example '*.py'.</span><span class='strut'> </span></p>
+<p id='t384' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t385' class='stm mis'> <span class='key'>return</span> <span class='nam'>fnmatch</span><span class='op'>.</span><span class='nam'>fnmatch</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>name</span><span class='op'>,</span> <span class='nam'>pattern</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t386' class='pln'><span class='strut'> </span></p>
+<p id='t387' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>glob</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>pattern</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t388' class='pln'> <span class='str'>""" Return a list of path objects that match the pattern.</span><span class='strut'> </span></p>
+<p id='t389' class='pln'><span class='strut'> </span></p>
+<p id='t390' class='pln'><span class='str'> pattern - a path relative to this directory, with wildcards.</span><span class='strut'> </span></p>
+<p id='t391' class='pln'><span class='strut'> </span></p>
+<p id='t392' class='pln'><span class='str'> For example, path('/users').glob('*/bin/*') returns a list</span><span class='strut'> </span></p>
+<p id='t393' class='pln'><span class='str'> of all the files users have in their bin directories.</span><span class='strut'> </span></p>
+<p id='t394' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t395' class='stm mis'> <span class='key'>return</span> <span class='nam'>map</span><span class='op'>(</span><span class='nam'>path</span><span class='op'>,</span> <span class='nam'>glob</span><span class='op'>.</span><span class='nam'>glob</span><span class='op'>(</span><span class='nam'>_base</span><span class='op'>(</span><span class='nam'>self</span> <span class='op'>/</span> <span class='nam'>pattern</span><span class='op'>)</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t396' class='pln'><span class='strut'> </span></p>
+<p id='t397' class='pln'><span class='strut'> </span></p>
+<p id='t398' class='pln'> <span class='com'># --- Reading or writing an entire file at once.</span><span class='strut'> </span></p>
+<p id='t399' class='pln'><span class='strut'> </span></p>
+<p id='t400' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>open</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>mode</span><span class='op'>=</span><span class='str'>'r'</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t401' class='pln'> <span class='str'>""" Open this file. Return a file object. """</span><span class='strut'> </span></p>
+<p id='t402' class='stm mis'> <span class='key'>return</span> <span class='nam'>file</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>mode</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t403' class='pln'><span class='strut'> </span></p>
+<p id='t404' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>bytes</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t405' class='pln'> <span class='str'>""" Open this file, read all bytes, return them as a string. """</span><span class='strut'> </span></p>
+<p id='t406' class='stm mis'> <span class='nam'>f</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>open</span><span class='op'>(</span><span class='str'>'rb'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t407' class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t408' class='stm mis'> <span class='key'>return</span> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t409' class='pln'> <span class='key'>finally</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t410' class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t411' class='pln'><span class='strut'> </span></p>
+<p id='t412' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>write_bytes</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>bytes</span><span class='op'>,</span> <span class='nam'>append</span><span class='op'>=</span><span class='nam'>False</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t413' class='pln'> <span class='str'>""" Open this file and write the given bytes to it.</span><span class='strut'> </span></p>
+<p id='t414' class='pln'><span class='strut'> </span></p>
+<p id='t415' class='pln'><span class='str'> Default behavior is to overwrite any existing file.</span><span class='strut'> </span></p>
+<p id='t416' class='pln'><span class='str'> Call this with write_bytes(bytes, append=True) to append instead.</span><span class='strut'> </span></p>
+<p id='t417' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t418' class='stm mis'> <span class='key'>if</span> <span class='nam'>append</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t419' class='stm mis'> <span class='nam'>mode</span> <span class='op'>=</span> <span class='str'>'ab'</span><span class='strut'> </span></p>
+<p id='t420' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t421' class='stm mis'> <span class='nam'>mode</span> <span class='op'>=</span> <span class='str'>'wb'</span><span class='strut'> </span></p>
+<p id='t422' class='stm mis'> <span class='nam'>f</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>open</span><span class='op'>(</span><span class='nam'>mode</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t423' class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t424' class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>bytes</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t425' class='pln'> <span class='key'>finally</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t426' class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t427' class='pln'><span class='strut'> </span></p>
+<p id='t428' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>text</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>encoding</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>errors</span><span class='op'>=</span><span class='str'>'strict'</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t429' class='pln'> <span class='str'>""" Open this file, read it in, return the content as a string.</span><span class='strut'> </span></p>
+<p id='t430' class='pln'><span class='strut'> </span></p>
+<p id='t431' class='pln'><span class='str'> This uses 'U' mode in Python 2.3 and later, so '\r\n' and '\r'</span><span class='strut'> </span></p>
+<p id='t432' class='pln'><span class='str'> are automatically translated to '\n'.</span><span class='strut'> </span></p>
+<p id='t433' class='pln'><span class='strut'> </span></p>
+<p id='t434' class='pln'><span class='str'> Optional arguments:</span><span class='strut'> </span></p>
+<p id='t435' class='pln'><span class='strut'> </span></p>
+<p id='t436' class='pln'><span class='str'> encoding - The Unicode encoding (or character set) of</span><span class='strut'> </span></p>
+<p id='t437' class='pln'><span class='str'> the file. If present, the content of the file is</span><span class='strut'> </span></p>
+<p id='t438' class='pln'><span class='str'> decoded and returned as a unicode object; otherwise</span><span class='strut'> </span></p>
+<p id='t439' class='pln'><span class='str'> it is returned as an 8-bit str.</span><span class='strut'> </span></p>
+<p id='t440' class='pln'><span class='str'> errors - How to handle Unicode errors; see help(str.decode)</span><span class='strut'> </span></p>
+<p id='t441' class='pln'><span class='str'> for the options. Default is 'strict'.</span><span class='strut'> </span></p>
+<p id='t442' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t443' class='stm mis'> <span class='key'>if</span> <span class='nam'>encoding</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t444' class='pln'> <span class='com'># 8-bit</span><span class='strut'> </span></p>
+<p id='t445' class='stm mis'> <span class='nam'>f</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>open</span><span class='op'>(</span><span class='nam'>_textmode</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t446' class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t447' class='stm mis'> <span class='key'>return</span> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t448' class='pln'> <span class='key'>finally</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t449' class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t450' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t451' class='pln'> <span class='com'># Unicode</span><span class='strut'> </span></p>
+<p id='t452' class='stm mis'> <span class='nam'>f</span> <span class='op'>=</span> <span class='nam'>codecs</span><span class='op'>.</span><span class='nam'>open</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>'r'</span><span class='op'>,</span> <span class='nam'>encoding</span><span class='op'>,</span> <span class='nam'>errors</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t453' class='pln'> <span class='com'># (Note - Can't use 'U' mode here, since codecs.open</span><span class='strut'> </span></p>
+<p id='t454' class='pln'> <span class='com'># doesn't support 'U' mode, even in Python 2.3.)</span><span class='strut'> </span></p>
+<p id='t455' class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t456' class='stm mis'> <span class='nam'>t</span> <span class='op'>=</span> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t457' class='pln'> <span class='key'>finally</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t458' class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t459' class='stm mis'> <span class='key'>return</span> <span class='nam'>t</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='str'>u'\r\n'</span><span class='op'>,</span> <span class='str'>u'\n'</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='str'>u'\r'</span><span class='op'>,</span> <span class='str'>u'\n'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t460' class='pln'><span class='strut'> </span></p>
+<p id='t461' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>write_text</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>text</span><span class='op'>,</span> <span class='nam'>encoding</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>errors</span><span class='op'>=</span><span class='str'>'strict'</span><span class='op'>,</span> <span class='nam'>append</span><span class='op'>=</span><span class='nam'>False</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t462' class='pln'> <span class='str'>""" Write the given text to this file.</span><span class='strut'> </span></p>
+<p id='t463' class='pln'><span class='strut'> </span></p>
+<p id='t464' class='pln'><span class='str'> The default behavior is to overwrite any existing file;</span><span class='strut'> </span></p>
+<p id='t465' class='pln'><span class='str'> to append instead, use the 'append=True' keyword argument.</span><span class='strut'> </span></p>
+<p id='t466' class='pln'><span class='strut'> </span></p>
+<p id='t467' class='pln'><span class='str'> There are two differences between path.write_text() and</span><span class='strut'> </span></p>
+<p id='t468' class='pln'><span class='str'> path.write_bytes(): Unicode handling and newline handling.</span><span class='strut'> </span></p>
+<p id='t469' class='pln'><span class='strut'> </span></p>
+<p id='t470' class='pln'><span class='str'> --- Unicode</span><span class='strut'> </span></p>
+<p id='t471' class='pln'><span class='strut'> </span></p>
+<p id='t472' class='pln'><span class='str'> If 'text' isn't Unicode, this essentially just does</span><span class='strut'> </span></p>
+<p id='t473' class='pln'><span class='str'> open(self, 'w').write(text). The 'encoding' and 'errors'</span><span class='strut'> </span></p>
+<p id='t474' class='pln'><span class='str'> arguments are ignored.</span><span class='strut'> </span></p>
+<p id='t475' class='pln'><span class='strut'> </span></p>
+<p id='t476' class='pln'><span class='str'> If 'text' is Unicode, it is first converted to bytes using the</span><span class='strut'> </span></p>
+<p id='t477' class='pln'><span class='str'> specified 'encoding' (or the default encoding if 'encoding'</span><span class='strut'> </span></p>
+<p id='t478' class='pln'><span class='str'> isn't specified). The 'errors' argument applies only to this</span><span class='strut'> </span></p>
+<p id='t479' class='pln'><span class='str'> conversion.</span><span class='strut'> </span></p>
+<p id='t480' class='pln'><span class='strut'> </span></p>
+<p id='t481' class='pln'><span class='str'> --- Newlines</span><span class='strut'> </span></p>
+<p id='t482' class='pln'><span class='strut'> </span></p>
+<p id='t483' class='pln'><span class='str'> write_text() converts from programmer-friendly newlines</span><span class='strut'> </span></p>
+<p id='t484' class='pln'><span class='str'> (always '\n') to platform-specific newlines (see os.linesep;</span><span class='strut'> </span></p>
+<p id='t485' class='pln'><span class='str'> on Windows, for example, the end-of-line marker is '\r\n').</span><span class='strut'> </span></p>
+<p id='t486' class='pln'><span class='str'> This applies to Unicode text the same as to 8-bit text.</span><span class='strut'> </span></p>
+<p id='t487' class='pln'><span class='strut'> </span></p>
+<p id='t488' class='pln'><span class='str'> Because of this conversion, the text should only contain plain</span><span class='strut'> </span></p>
+<p id='t489' class='pln'><span class='str'> newlines ('\n'), just like the return value of path.text().</span><span class='strut'> </span></p>
+<p id='t490' class='pln'><span class='str'> If the text contains the characters '\r\n', it may be written</span><span class='strut'> </span></p>
+<p id='t491' class='pln'><span class='str'> as '\r\r\n' or '\r\r' depending on your platform. (This is</span><span class='strut'> </span></p>
+<p id='t492' class='pln'><span class='str'> exactly the same as when you open a file for writing with</span><span class='strut'> </span></p>
+<p id='t493' class='pln'><span class='str'> fopen(filename, "w") in C or file(filename, 'w') in Python.)</span><span class='strut'> </span></p>
+<p id='t494' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t495' class='stm mis'> <span class='key'>if</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>text</span><span class='op'>,</span> <span class='nam'>unicode</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t496' class='stm mis'> <span class='nam'>text</span> <span class='op'>=</span> <span class='nam'>text</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='str'>u'\n'</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>linesep</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t497' class='stm mis'> <span class='key'>if</span> <span class='nam'>encoding</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t498' class='stm mis'> <span class='nam'>encoding</span> <span class='op'>=</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>getdefaultencoding</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t499' class='stm mis'> <span class='nam'>bytes</span> <span class='op'>=</span> <span class='nam'>text</span><span class='op'>.</span><span class='nam'>encode</span><span class='op'>(</span><span class='nam'>encoding</span><span class='op'>,</span> <span class='nam'>errors</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t500' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>write_bytes</span><span class='op'>(</span><span class='nam'>bytes</span><span class='op'>,</span> <span class='nam'>append</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t501' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t502' class='stm mis'> <span class='key'>if</span> <span class='nam'>append</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t503' class='stm mis'> <span class='nam'>mode</span> <span class='op'>=</span> <span class='str'>'a'</span><span class='strut'> </span></p>
+<p id='t504' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t505' class='stm mis'> <span class='nam'>mode</span> <span class='op'>=</span> <span class='str'>'w'</span><span class='strut'> </span></p>
+<p id='t506' class='stm mis'> <span class='nam'>f</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>open</span><span class='op'>(</span><span class='nam'>mode</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t507' class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t508' class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>text</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t509' class='pln'> <span class='key'>finally</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t510' class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t511' class='pln'><span class='strut'> </span></p>
+<p id='t512' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>lines</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>encoding</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>errors</span><span class='op'>=</span><span class='str'>'strict'</span><span class='op'>,</span> <span class='nam'>retain</span><span class='op'>=</span><span class='nam'>True</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t513' class='pln'> <span class='str'>""" Open this file, read all lines, return them in a list.</span><span class='strut'> </span></p>
+<p id='t514' class='pln'><span class='strut'> </span></p>
+<p id='t515' class='pln'><span class='str'> Optional arguments:</span><span class='strut'> </span></p>
+<p id='t516' class='pln'><span class='str'> encoding - The Unicode encoding (or character set) of</span><span class='strut'> </span></p>
+<p id='t517' class='pln'><span class='str'> the file. The default is None, meaning the content</span><span class='strut'> </span></p>
+<p id='t518' class='pln'><span class='str'> of the file is read as 8-bit characters and returned</span><span class='strut'> </span></p>
+<p id='t519' class='pln'><span class='str'> as a list of (non-Unicode) str objects.</span><span class='strut'> </span></p>
+<p id='t520' class='pln'><span class='str'> errors - How to handle Unicode errors; see help(str.decode)</span><span class='strut'> </span></p>
+<p id='t521' class='pln'><span class='str'> for the options. Default is 'strict'</span><span class='strut'> </span></p>
+<p id='t522' class='pln'><span class='str'> retain - If true, retain newline characters; but all newline</span><span class='strut'> </span></p>
+<p id='t523' class='pln'><span class='str'> character combinations ('\r', '\n', '\r\n') are</span><span class='strut'> </span></p>
+<p id='t524' class='pln'><span class='str'> translated to '\n'. If false, newline characters are</span><span class='strut'> </span></p>
+<p id='t525' class='pln'><span class='str'> stripped off. Default is True.</span><span class='strut'> </span></p>
+<p id='t526' class='pln'><span class='strut'> </span></p>
+<p id='t527' class='pln'><span class='str'> This uses 'U' mode in Python 2.3 and later.</span><span class='strut'> </span></p>
+<p id='t528' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t529' class='stm mis'> <span class='key'>if</span> <span class='nam'>encoding</span> <span class='key'>is</span> <span class='nam'>None</span> <span class='key'>and</span> <span class='nam'>retain</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t530' class='stm mis'> <span class='nam'>f</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>open</span><span class='op'>(</span><span class='nam'>_textmode</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t531' class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t532' class='stm mis'> <span class='key'>return</span> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>readlines</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t533' class='pln'> <span class='key'>finally</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t534' class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t535' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t536' class='stm mis'> <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>text</span><span class='op'>(</span><span class='nam'>encoding</span><span class='op'>,</span> <span class='nam'>errors</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>splitlines</span><span class='op'>(</span><span class='nam'>retain</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t537' class='pln'><span class='strut'> </span></p>
+<p id='t538' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>write_lines</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>lines</span><span class='op'>,</span> <span class='nam'>encoding</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>errors</span><span class='op'>=</span><span class='str'>'strict'</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t539' class='pln'> <span class='nam'>linesep</span><span class='op'>=</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>linesep</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t540' class='pln'> <span class='str'>""" Overwrite this file with the given lines of text.</span><span class='strut'> </span></p>
+<p id='t541' class='pln'><span class='strut'> </span></p>
+<p id='t542' class='pln'><span class='str'> lines - A list of strings.</span><span class='strut'> </span></p>
+<p id='t543' class='pln'><span class='str'> encoding - A Unicode encoding to use. This applies only if</span><span class='strut'> </span></p>
+<p id='t544' class='pln'><span class='str'> 'lines' contains any Unicode strings.</span><span class='strut'> </span></p>
+<p id='t545' class='pln'><span class='str'> errors - How to handle errors in Unicode encoding. This</span><span class='strut'> </span></p>
+<p id='t546' class='pln'><span class='str'> also applies only to Unicode strings.</span><span class='strut'> </span></p>
+<p id='t547' class='pln'><span class='str'> linesep - A character sequence that will be added at the</span><span class='strut'> </span></p>
+<p id='t548' class='pln'><span class='str'> end of every line that doesn't already have it.</span><span class='strut'> </span></p>
+<p id='t549' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t550' class='stm mis'> <span class='nam'>f</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>open</span><span class='op'>(</span><span class='str'>'wb'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t551' class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t552' class='stm mis'> <span class='key'>for</span> <span class='nam'>line</span> <span class='key'>in</span> <span class='nam'>lines</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t553' class='stm mis'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>line</span><span class='op'>.</span><span class='nam'>endswith</span><span class='op'>(</span><span class='nam'>linesep</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t554' class='stm mis'> <span class='nam'>line</span> <span class='op'>+=</span> <span class='nam'>linesep</span><span class='strut'> </span></p>
+<p id='t555' class='stm mis'> <span class='key'>if</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>line</span><span class='op'>,</span> <span class='nam'>unicode</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t556' class='stm mis'> <span class='key'>if</span> <span class='nam'>encoding</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t557' class='stm mis'> <span class='nam'>encoding</span> <span class='op'>=</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>getdefaultencoding</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t558' class='stm mis'> <span class='nam'>line</span> <span class='op'>=</span> <span class='nam'>line</span><span class='op'>.</span><span class='nam'>encode</span><span class='op'>(</span><span class='nam'>encoding</span><span class='op'>,</span> <span class='nam'>errors</span><span class='op'>=</span><span class='nam'>errors</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t559' class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>line</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t560' class='pln'> <span class='key'>finally</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t561' class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t562' class='pln'><span class='strut'> </span></p>
+<p id='t563' class='pln'><span class='strut'> </span></p>
+<p id='t564' class='pln'> <span class='com'># --- Methods for querying the filesystem.</span><span class='strut'> </span></p>
+<p id='t565' class='pln'><span class='strut'> </span></p>
+<p id='t566' class='stm run hide_run'> <span class='nam'>exists</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>exists</span><span class='strut'> </span></p>
+<p id='t567' class='stm run hide_run'> <span class='nam'>isabs</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>isabs</span><span class='strut'> </span></p>
+<p id='t568' class='stm run hide_run'> <span class='nam'>isdir</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>isdir</span><span class='strut'> </span></p>
+<p id='t569' class='stm run hide_run'> <span class='nam'>isfile</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>isfile</span><span class='strut'> </span></p>
+<p id='t570' class='stm run hide_run'> <span class='nam'>islink</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>islink</span><span class='strut'> </span></p>
+<p id='t571' class='stm run hide_run'> <span class='nam'>ismount</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>ismount</span><span class='strut'> </span></p>
+<p id='t572' class='pln'><span class='strut'> </span></p>
+<p id='t573' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>574</span> <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>,</span> <span class='str'>'samefile'</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t574' class='stm mis'> <span class='nam'>samefile</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>samefile</span><span class='strut'> </span></p>
+<p id='t575' class='pln'><span class='strut'> </span></p>
+<p id='t576' class='stm run hide_run'> <span class='nam'>getatime</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>getatime</span><span class='strut'> </span></p>
+<p id='t577' class='stm run hide_run'> <span class='nam'>atime</span> <span class='op'>=</span> <span class='nam'>property</span><span class='op'>(</span><span class='strut'> </span></p>
+<p id='t578' class='pln'> <span class='nam'>getatime</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t579' class='pln'> <span class='str'>""" Last access time of the file. """</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t580' class='pln'><span class='strut'> </span></p>
+<p id='t581' class='stm run hide_run'> <span class='nam'>getmtime</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>getmtime</span><span class='strut'> </span></p>
+<p id='t582' class='stm run hide_run'> <span class='nam'>mtime</span> <span class='op'>=</span> <span class='nam'>property</span><span class='op'>(</span><span class='strut'> </span></p>
+<p id='t583' class='pln'> <span class='nam'>getmtime</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t584' class='pln'> <span class='str'>""" Last-modified time of the file. """</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t585' class='pln'><span class='strut'> </span></p>
+<p id='t586' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>592</span> <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>,</span> <span class='str'>'getctime'</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t587' class='stm run hide_run'> <span class='nam'>getctime</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>getctime</span><span class='strut'> </span></p>
+<p id='t588' class='stm run hide_run'> <span class='nam'>ctime</span> <span class='op'>=</span> <span class='nam'>property</span><span class='op'>(</span><span class='strut'> </span></p>
+<p id='t589' class='pln'> <span class='nam'>getctime</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t590' class='pln'> <span class='str'>""" Creation time of the file. """</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t591' class='pln'><span class='strut'> </span></p>
+<p id='t592' class='stm run hide_run'> <span class='nam'>getsize</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>getsize</span><span class='strut'> </span></p>
+<p id='t593' class='stm run hide_run'> <span class='nam'>size</span> <span class='op'>=</span> <span class='nam'>property</span><span class='op'>(</span><span class='strut'> </span></p>
+<p id='t594' class='pln'> <span class='nam'>getsize</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t595' class='pln'> <span class='str'>""" Size of the file, in bytes. """</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t596' class='pln'><span class='strut'> </span></p>
+<p id='t597' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>605</span> <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>,</span> <span class='str'>'access'</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t598' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>access</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>mode</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t599' class='pln'> <span class='str'>""" Return true if current user has access to this path.</span><span class='strut'> </span></p>
+<p id='t600' class='pln'><span class='strut'> </span></p>
+<p id='t601' class='pln'><span class='str'> mode - One of the constants os.F_OK, os.R_OK, os.W_OK, os.X_OK</span><span class='strut'> </span></p>
+<p id='t602' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t603' class='stm mis'> <span class='key'>return</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>access</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>mode</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t604' class='pln'><span class='strut'> </span></p>
+<p id='t605' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>stat</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t606' class='pln'> <span class='str'>""" Perform a stat() system call on this path. """</span><span class='strut'> </span></p>
+<p id='t607' class='stm mis'> <span class='key'>return</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>stat</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t608' class='pln'><span class='strut'> </span></p>
+<p id='t609' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>lstat</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t610' class='pln'> <span class='str'>""" Like path.stat(), but do not follow symbolic links. """</span><span class='strut'> </span></p>
+<p id='t611' class='stm mis'> <span class='key'>return</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>lstat</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t612' class='pln'><span class='strut'> </span></p>
+<p id='t613' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>614</span> <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>,</span> <span class='str'>'statvfs'</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t614' class='stm mis'> <span class='key'>def</span> <span class='nam'>statvfs</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t615' class='pln'> <span class='str'>""" Perform a statvfs() system call on this path. """</span><span class='strut'> </span></p>
+<p id='t616' class='stm mis'> <span class='key'>return</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>statvfs</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t617' class='pln'><span class='strut'> </span></p>
+<p id='t618' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>619</span> <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>,</span> <span class='str'>'pathconf'</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t619' class='stm mis'> <span class='key'>def</span> <span class='nam'>pathconf</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>name</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t620' class='stm mis'> <span class='key'>return</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>pathconf</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>name</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t621' class='pln'><span class='strut'> </span></p>
+<p id='t622' class='pln'><span class='strut'> </span></p>
+<p id='t623' class='pln'> <span class='com'># --- Modifying operations on files and directories</span><span class='strut'> </span></p>
+<p id='t624' class='pln'><span class='strut'> </span></p>
+<p id='t625' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>utime</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>times</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t626' class='pln'> <span class='str'>""" Set the access and modified times of this file. """</span><span class='strut'> </span></p>
+<p id='t627' class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>utime</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>times</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t628' class='pln'><span class='strut'> </span></p>
+<p id='t629' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>chmod</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>mode</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t630' class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>chmod</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>mode</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t631' class='pln'><span class='strut'> </span></p>
+<p id='t632' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>633</span> <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>,</span> <span class='str'>'chown'</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t633' class='stm mis'> <span class='key'>def</span> <span class='nam'>chown</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>uid</span><span class='op'>,</span> <span class='nam'>gid</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t634' class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>chown</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>uid</span><span class='op'>,</span> <span class='nam'>gid</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t635' class='pln'><span class='strut'> </span></p>
+<p id='t636' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>rename</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>new</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t637' class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>rename</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>new</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t638' class='pln'><span class='strut'> </span></p>
+<p id='t639' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>renames</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>new</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t640' class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>renames</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>new</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t641' class='pln'><span class='strut'> </span></p>
+<p id='t642' class='pln'><span class='strut'> </span></p>
+<p id='t643' class='pln'> <span class='com'># --- Create/delete operations on directories</span><span class='strut'> </span></p>
+<p id='t644' class='pln'><span class='strut'> </span></p>
+<p id='t645' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>mkdir</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>mode</span><span class='op'>=</span><span class='num'>0777</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t646' class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>mkdir</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>mode</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t647' class='pln'><span class='strut'> </span></p>
+<p id='t648' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>makedirs</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>mode</span><span class='op'>=</span><span class='num'>0777</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t649' class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>makedirs</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>mode</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t650' class='pln'><span class='strut'> </span></p>
+<p id='t651' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>rmdir</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t652' class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>rmdir</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t653' class='pln'><span class='strut'> </span></p>
+<p id='t654' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>removedirs</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t655' class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>removedirs</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t656' class='pln'><span class='strut'> </span></p>
+<p id='t657' class='pln'><span class='strut'> </span></p>
+<p id='t658' class='pln'> <span class='com'># --- Modifying operations on files</span><span class='strut'> </span></p>
+<p id='t659' class='pln'><span class='strut'> </span></p>
+<p id='t660' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>touch</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t661' class='pln'> <span class='str'>""" Set the access/modified times of this file to the current time.</span><span class='strut'> </span></p>
+<p id='t662' class='pln'><span class='str'> Create the file if it does not exist.</span><span class='strut'> </span></p>
+<p id='t663' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t664' class='stm mis'> <span class='nam'>fd</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>open</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>O_WRONLY</span> <span class='op'>|</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>O_CREAT</span><span class='op'>,</span> <span class='num'>0666</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t665' class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='nam'>fd</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t666' class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>utime</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t667' class='pln'><span class='strut'> </span></p>
+<p id='t668' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>remove</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t669' class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>remove</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t670' class='pln'><span class='strut'> </span></p>
+<p id='t671' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>unlink</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t672' class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>unlink</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t673' class='pln'><span class='strut'> </span></p>
+<p id='t674' class='pln'><span class='strut'> </span></p>
+<p id='t675' class='pln'> <span class='com'># --- Links</span><span class='strut'> </span></p>
+<p id='t676' class='pln'><span class='strut'> </span></p>
+<p id='t677' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>678</span> <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>,</span> <span class='str'>'link'</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t678' class='stm mis'> <span class='key'>def</span> <span class='nam'>link</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>newpath</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t679' class='pln'> <span class='str'>""" Create a hard link at 'newpath', pointing to this file. """</span><span class='strut'> </span></p>
+<p id='t680' class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>link</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>newpath</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t681' class='pln'><span class='strut'> </span></p>
+<p id='t682' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>683</span> <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>,</span> <span class='str'>'symlink'</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t683' class='stm mis'> <span class='key'>def</span> <span class='nam'>symlink</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>newlink</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t684' class='pln'> <span class='str'>""" Create a symbolic link at 'newlink', pointing here. """</span><span class='strut'> </span></p>
+<p id='t685' class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>symlink</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>newlink</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t686' class='pln'><span class='strut'> </span></p>
+<p id='t687' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>688</span> <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>,</span> <span class='str'>'readlink'</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t688' class='stm mis'> <span class='key'>def</span> <span class='nam'>readlink</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t689' class='pln'> <span class='str'>""" Return the path to which this symbolic link points.</span><span class='strut'> </span></p>
+<p id='t690' class='pln'><span class='strut'> </span></p>
+<p id='t691' class='pln'><span class='str'> The result may be an absolute or a relative path.</span><span class='strut'> </span></p>
+<p id='t692' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t693' class='stm mis'> <span class='key'>return</span> <span class='nam'>path</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>readlink</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t694' class='pln'><span class='strut'> </span></p>
+<p id='t695' class='stm mis'> <span class='key'>def</span> <span class='nam'>readlinkabs</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t696' class='pln'> <span class='str'>""" Return the path to which this symbolic link points.</span><span class='strut'> </span></p>
+<p id='t697' class='pln'><span class='strut'> </span></p>
+<p id='t698' class='pln'><span class='str'> The result is always an absolute path.</span><span class='strut'> </span></p>
+<p id='t699' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t700' class='stm mis'> <span class='nam'>p</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>readlink</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t701' class='stm mis'> <span class='key'>if</span> <span class='nam'>p</span><span class='op'>.</span><span class='nam'>isabs</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t702' class='stm mis'> <span class='key'>return</span> <span class='nam'>p</span><span class='strut'> </span></p>
+<p id='t703' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t704' class='stm mis'> <span class='key'>return</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>parent</span> <span class='op'>/</span> <span class='nam'>p</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>abspath</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t705' class='pln'><span class='strut'> </span></p>
+<p id='t706' class='pln'><span class='strut'> </span></p>
+<p id='t707' class='pln'> <span class='com'># --- High-level functions from shutil</span><span class='strut'> </span></p>
+<p id='t708' class='pln'><span class='strut'> </span></p>
+<p id='t709' class='stm run hide_run'> <span class='nam'>copyfile</span> <span class='op'>=</span> <span class='nam'>shutil</span><span class='op'>.</span><span class='nam'>copyfile</span><span class='strut'> </span></p>
+<p id='t710' class='stm run hide_run'> <span class='nam'>copymode</span> <span class='op'>=</span> <span class='nam'>shutil</span><span class='op'>.</span><span class='nam'>copymode</span><span class='strut'> </span></p>
+<p id='t711' class='stm run hide_run'> <span class='nam'>copystat</span> <span class='op'>=</span> <span class='nam'>shutil</span><span class='op'>.</span><span class='nam'>copystat</span><span class='strut'> </span></p>
+<p id='t712' class='stm run hide_run'> <span class='nam'>copy</span> <span class='op'>=</span> <span class='nam'>shutil</span><span class='op'>.</span><span class='nam'>copy</span><span class='strut'> </span></p>
+<p id='t713' class='stm run hide_run'> <span class='nam'>copy2</span> <span class='op'>=</span> <span class='nam'>shutil</span><span class='op'>.</span><span class='nam'>copy2</span><span class='strut'> </span></p>
+<p id='t714' class='stm run hide_run'> <span class='nam'>copytree</span> <span class='op'>=</span> <span class='nam'>shutil</span><span class='op'>.</span><span class='nam'>copytree</span><span class='strut'> </span></p>
+<p id='t715' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>717</span> <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>shutil</span><span class='op'>,</span> <span class='str'>'move'</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t716' class='stm run hide_run'> <span class='nam'>move</span> <span class='op'>=</span> <span class='nam'>shutil</span><span class='op'>.</span><span class='nam'>move</span><span class='strut'> </span></p>
+<p id='t717' class='stm run hide_run'> <span class='nam'>rmtree</span> <span class='op'>=</span> <span class='nam'>shutil</span><span class='op'>.</span><span class='nam'>rmtree</span><span class='strut'> </span></p>
+<p id='t718' class='pln'><span class='strut'> </span></p>
+<p id='t719' class='pln'><span class='strut'> </span></p>
+<p id='t720' class='pln'> <span class='com'># --- Special stuff from os</span><span class='strut'> </span></p>
+<p id='t721' class='pln'><span class='strut'> </span></p>
+<p id='t722' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>723</span> <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>,</span> <span class='str'>'chroot'</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t723' class='stm mis'> <span class='key'>def</span> <span class='nam'>chroot</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t724' class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>chroot</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t725' class='pln'><span class='strut'> </span></p>
+<p id='t726' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>exit</span> <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>,</span> <span class='str'>'startfile'</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t727' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>startfile</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t728' class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>startfile</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t729' class='pln'><span class='strut'> </span></p>
+
+ </td>
+ </tr>
+ </table>
</div>
</body>
diff --git a/doc/sample_html/cogapp_cogapp.html b/doc/sample_html/cogapp_cogapp.html index 555756f3..30b1c6bb 100644 --- a/doc/sample_html/cogapp_cogapp.html +++ b/doc/sample_html/cogapp_cogapp.html @@ -1,1467 +1,1460 @@ -<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
-<title>Coverage for cogapp\cogapp</title>
-<link rel='stylesheet' href='style.css' type='text/css'>
-<script src='jquery-1.3.2.min.js'></script>
-<script>
-function toggle_lines(btn, cls) {
- var btn = $(btn);
- if (btn.hasClass("hide")) {
- $("#source ."+cls).removeClass("hide");
- btn.removeClass("hide");
- }
- else {
- $("#source ."+cls).addClass("hide");
- btn.addClass("hide");
- }
-}
-</script>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+ <title>Coverage for cogapp\cogapp: 51%</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
</head>
<body>
+
<div id='header'>
<div class='content'>
<h1>Coverage for <b>cogapp\cogapp</b> :
- <span class='pc_cov'>57%</span>
+ <span class='pc_cov'>51%</span>
</h1>
<h2 class='stats'>
387 statements
- <span class='run hide' onclick='toggle_lines(this, "run")'>219 run</span>
+ <span class='run hide_run' onclick='toggle_lines(this, "run")'>219 run</span>
<span class='exc' onclick='toggle_lines(this, "exc")'>3 excluded</span>
<span class='mis' onclick='toggle_lines(this, "mis")'>168 missing</span>
+
+ <span class='par run hide_run' onclick='toggle_lines(this, "par")'>26 partial</span>
+
</h2>
</div>
</div>
<div id='source'>
-<table cellspacing='0' cellpadding='0'>
-<tr>
-<td class='linenos' valign='top'>
-<p class='pln'>1</p>
-<p class='pln'>2</p>
-<p class='pln'>3</p>
-<p class='pln'>4</p>
-<p class='pln'>5</p>
-<p class='pln'>6</p>
-<p class='stm run hide'>7</p>
-<p class='stm run hide'>8</p>
-<p class='pln'>9</p>
-<p class='pln'>10</p>
-<p class='stm run hide'>11</p>
-<p class='stm run hide'>12</p>
-<p class='stm run hide'>13</p>
-<p class='stm mis'>14</p>
-<p class='stm mis'>15</p>
-<p class='stm mis'>16</p>
-<p class='pln'>17</p>
-<p class='stm run hide'>18</p>
-<p class='pln'>19</p>
-<p class='stm run hide'>20</p>
-<p class='pln'>21</p>
-<p class='stm run hide'>22</p>
-<p class='pln'>23</p>
-<p class='pln'>24</p>
-<p class='pln'>25</p>
-<p class='pln'>26</p>
-<p class='pln'>27</p>
-<p class='pln'>28</p>
-<p class='pln'>29</p>
-<p class='pln'>30</p>
-<p class='pln'>31</p>
-<p class='pln'>32</p>
-<p class='pln'>33</p>
-<p class='pln'>34</p>
-<p class='pln'>35</p>
-<p class='pln'>36</p>
-<p class='pln'>37</p>
-<p class='pln'>38</p>
-<p class='pln'>39</p>
-<p class='pln'>40</p>
-<p class='pln'>41</p>
-<p class='pln'>42</p>
-<p class='pln'>43</p>
-<p class='pln'>44</p>
-<p class='pln'>45</p>
-<p class='pln'>46</p>
-<p class='pln'>47</p>
-<p class='pln'>48</p>
-<p class='pln'>49</p>
-<p class='stm run hide'>50</p>
-<p class='pln'>51</p>
-<p class='stm run hide'>52</p>
-<p class='pln'>53</p>
-<p class='pln'>54</p>
-<p class='stm run hide'>55</p>
-<p class='stm run hide'>56</p>
-<p class='stm run hide'>57</p>
-<p class='pln'>58</p>
-<p class='stm mis'>59</p>
-<p class='pln'>60</p>
-<p class='stm run hide'>61</p>
-<p class='pln'>62</p>
-<p class='pln'>63</p>
-<p class='exc'>64</p>
-<p class='pln'>65</p>
-<p class='stm run hide'>66</p>
-<p class='pln'>67</p>
-<p class='pln'>68</p>
-<p class='exc'>69</p>
-<p class='pln'>70</p>
-<p class='stm run hide'>71</p>
-<p class='pln'>72</p>
-<p class='pln'>73</p>
-<p class='exc'>74</p>
-<p class='pln'>75</p>
-<p class='stm run hide'>76</p>
-<p class='pln'>77</p>
-<p class='pln'>78</p>
-<p class='stm run hide'>79</p>
-<p class='stm run hide'>80</p>
-<p class='stm run hide'>81</p>
-<p class='pln'>82</p>
-<p class='stm run hide'>83</p>
-<p class='pln'>84</p>
-<p class='pln'>85</p>
-<p class='stm run hide'>86</p>
-<p class='stm run hide'>87</p>
-<p class='stm run hide'>88</p>
-<p class='stm mis'>89</p>
-<p class='pln'>90</p>
-<p class='stm run hide'>91</p>
-<p class='pln'>92</p>
-<p class='pln'>93</p>
-<p class='stm run hide'>94</p>
-<p class='stm run hide'>95</p>
-<p class='stm run hide'>96</p>
-<p class='stm run hide'>97</p>
-<p class='pln'>98</p>
-<p class='stm run hide'>99</p>
-<p class='stm run hide'>100</p>
-<p class='pln'>101</p>
-<p class='stm run hide'>102</p>
-<p class='stm run hide'>103</p>
-<p class='pln'>104</p>
-<p class='stm run hide'>105</p>
-<p class='pln'>106</p>
-<p class='pln'>107</p>
-<p class='pln'>108</p>
-<p class='pln'>109</p>
-<p class='pln'>110</p>
-<p class='stm run hide'>111</p>
-<p class='stm run hide'>112</p>
-<p class='stm run hide'>113</p>
-<p class='stm run hide'>114</p>
-<p class='pln'>115</p>
-<p class='stm run hide'>116</p>
-<p class='pln'>117</p>
-<p class='stm run hide'>118</p>
-<p class='pln'>119</p>
-<p class='stm run hide'>120</p>
-<p class='pln'>121</p>
-<p class='stm run hide'>122</p>
-<p class='stm run hide'>123</p>
-<p class='stm run hide'>124</p>
-<p class='pln'>125</p>
-<p class='pln'>126</p>
-<p class='stm run hide'>127</p>
-<p class='stm run hide'>128</p>
-<p class='pln'>129</p>
-<p class='pln'>130</p>
-<p class='stm run hide'>131</p>
-<p class='stm run hide'>132</p>
-<p class='stm run hide'>133</p>
-<p class='stm run hide'>134</p>
-<p class='pln'>135</p>
-<p class='stm run hide'>136</p>
-<p class='stm run hide'>137</p>
-<p class='pln'>138</p>
-<p class='pln'>139</p>
-<p class='pln'>140</p>
-<p class='pln'>141</p>
-<p class='stm run hide'>142</p>
-<p class='stm run hide'>143</p>
-<p class='pln'>144</p>
-<p class='stm run hide'>145</p>
-<p class='pln'>146</p>
-<p class='stm run hide'>147</p>
-<p class='stm mis'>148</p>
-<p class='pln'>149</p>
-<p class='stm run hide'>150</p>
-<p class='pln'>151</p>
-<p class='pln'>152</p>
-<p class='stm run hide'>153</p>
-<p class='stm run hide'>154</p>
-<p class='stm run hide'>155</p>
-<p class='stm run hide'>156</p>
-<p class='stm run hide'>157</p>
-<p class='stm run hide'>158</p>
-<p class='stm run hide'>159</p>
-<p class='stm run hide'>160</p>
-<p class='stm run hide'>161</p>
-<p class='stm run hide'>162</p>
-<p class='pln'>163</p>
-<p class='stm run hide'>164</p>
-<p class='pln'>165</p>
-<p class='pln'>166</p>
-<p class='stm run hide'>167</p>
-<p class='stm run hide'>168</p>
-<p class='pln'>169</p>
-<p class='stm run hide'>170</p>
-<p class='pln'>171</p>
-<p class='pln'>172</p>
-<p class='pln'>173</p>
-<p class='pln'>174</p>
-<p class='pln'>175</p>
-<p class='stm mis'>176</p>
-<p class='pln'>177</p>
-<p class='pln'>178</p>
-<p class='stm run hide'>179</p>
-<p class='pln'>180</p>
-<p class='pln'>181</p>
-<p class='stm run hide'>182</p>
-<p class='stm run hide'>183</p>
-<p class='stm run hide'>184</p>
-<p class='pln'>185</p>
-<p class='stm run hide'>186</p>
-<p class='stm run hide'>187</p>
-<p class='stm run hide'>188</p>
-<p class='stm run hide'>189</p>
-<p class='stm run hide'>190</p>
-<p class='pln'>191</p>
-<p class='stm run hide'>192</p>
-<p class='stm run hide'>193</p>
-<p class='pln'>194</p>
-<p class='pln'>195</p>
-<p class='stm run hide'>196</p>
-<p class='pln'>197</p>
-<p class='pln'>198</p>
-<p class='stm run hide'>199</p>
-<p class='pln'>200</p>
-<p class='stm run hide'>201</p>
-<p class='stm run hide'>202</p>
-<p class='stm run hide'>203</p>
-<p class='stm run hide'>204</p>
-<p class='stm run hide'>205</p>
-<p class='stm run hide'>206</p>
-<p class='stm run hide'>207</p>
-<p class='stm run hide'>208</p>
-<p class='stm run hide'>209</p>
-<p class='stm run hide'>210</p>
-<p class='stm run hide'>211</p>
-<p class='stm run hide'>212</p>
-<p class='stm run hide'>213</p>
-<p class='stm run hide'>214</p>
-<p class='pln'>215</p>
-<p class='stm run hide'>216</p>
-<p class='pln'>217</p>
-<p class='pln'>218</p>
-<p class='stm mis'>219</p>
-<p class='pln'>220</p>
-<p class='stm run hide'>221</p>
-<p class='pln'>222</p>
-<p class='pln'>223</p>
-<p class='stm mis'>224</p>
-<p class='pln'>225</p>
-<p class='stm run hide'>226</p>
-<p class='pln'>227</p>
-<p class='pln'>228</p>
-<p class='stm mis'>229</p>
-<p class='stm mis'>230</p>
-<p class='pln'>231</p>
-<p class='stm run hide'>232</p>
-<p class='pln'>233</p>
-<p class='stm mis'>234</p>
-<p class='stm mis'>235</p>
-<p class='stm mis'>236</p>
-<p class='stm mis'>237</p>
-<p class='pln'>238</p>
-<p class='pln'>239</p>
-<p class='stm mis'>240</p>
-<p class='stm mis'>241</p>
-<p class='stm mis'>242</p>
-<p class='stm mis'>243</p>
-<p class='stm mis'>244</p>
-<p class='stm mis'>245</p>
-<p class='stm mis'>246</p>
-<p class='stm mis'>247</p>
-<p class='stm mis'>248</p>
-<p class='stm mis'>249</p>
-<p class='stm mis'>250</p>
-<p class='stm mis'>251</p>
-<p class='stm mis'>252</p>
-<p class='stm mis'>253</p>
-<p class='stm mis'>254</p>
-<p class='stm mis'>255</p>
-<p class='stm mis'>256</p>
-<p class='stm mis'>257</p>
-<p class='stm mis'>258</p>
-<p class='stm mis'>259</p>
-<p class='stm mis'>260</p>
-<p class='stm mis'>261</p>
-<p class='stm mis'>262</p>
-<p class='stm mis'>263</p>
-<p class='stm mis'>264</p>
-<p class='stm mis'>265</p>
-<p class='stm mis'>266</p>
-<p class='stm mis'>267</p>
-<p class='stm mis'>268</p>
-<p class='stm mis'>269</p>
-<p class='pln'>270</p>
-<p class='pln'>271</p>
-<p class='pln'>272</p>
-<p class='stm mis'>273</p>
-<p class='pln'>274</p>
-<p class='stm run hide'>275</p>
-<p class='pln'>276</p>
-<p class='pln'>277</p>
-<p class='stm mis'>278</p>
-<p class='stm mis'>279</p>
-<p class='pln'>280</p>
-<p class='stm mis'>281</p>
-<p class='stm mis'>282</p>
-<p class='pln'>283</p>
-<p class='pln'>284</p>
-<p class='stm run hide'>285</p>
-<p class='pln'>286</p>
-<p class='pln'>287</p>
-<p class='stm run hide'>288</p>
-<p class='stm run hide'>289</p>
-<p class='stm run hide'>290</p>
-<p class='stm run hide'>291</p>
-<p class='stm run hide'>292</p>
-<p class='stm run hide'>293</p>
-<p class='stm run hide'>294</p>
-<p class='pln'>295</p>
-<p class='stm run hide'>296</p>
-<p class='stm run hide'>297</p>
-<p class='pln'>298</p>
-<p class='stm run hide'>299</p>
-<p class='pln'>300</p>
-<p class='stm run hide'>301</p>
-<p class='stm mis'>302</p>
-<p class='pln'>303</p>
-<p class='stm run hide'>304</p>
-<p class='stm run hide'>305</p>
-<p class='pln'>306</p>
-<p class='stm run hide'>307</p>
-<p class='stm run hide'>308</p>
-<p class='pln'>309</p>
-<p class='pln'>310</p>
-<p class='stm run hide'>311</p>
-<p class='stm run hide'>312</p>
-<p class='pln'>313</p>
-<p class='stm run hide'>314</p>
-<p class='pln'>315</p>
-<p class='pln'>316</p>
-<p class='pln'>317</p>
-<p class='stm run hide'>318</p>
-<p class='stm run hide'>319</p>
-<p class='stm run hide'>320</p>
-<p class='pln'>321</p>
-<p class='stm run hide'>322</p>
-<p class='pln'>323</p>
-<p class='pln'>324</p>
-<p class='pln'>325</p>
-<p class='pln'>326</p>
-<p class='stm run hide'>327</p>
-<p class='stm run hide'>328</p>
-<p class='stm run hide'>329</p>
-<p class='pln'>330</p>
-<p class='stm run hide'>331</p>
-<p class='pln'>332</p>
-<p class='stm mis'>333</p>
-<p class='stm mis'>334</p>
-<p class='stm run hide'>335</p>
-<p class='pln'>336</p>
-<p class='stm mis'>337</p>
-<p class='stm mis'>338</p>
-<p class='pln'>339</p>
-<p class='stm run hide'>340</p>
-<p class='stm run hide'>341</p>
-<p class='pln'>342</p>
-<p class='stm run hide'>343</p>
-<p class='pln'>344</p>
-<p class='stm run hide'>345</p>
-<p class='stm run hide'>346</p>
-<p class='pln'>347</p>
-<p class='pln'>348</p>
-<p class='stm run hide'>349</p>
-<p class='stm run hide'>350</p>
-<p class='pln'>351</p>
-<p class='pln'>352</p>
-<p class='stm run hide'>353</p>
-<p class='pln'>354</p>
-<p class='pln'>355</p>
-<p class='stm run hide'>356</p>
-<p class='stm run hide'>357</p>
-<p class='pln'>358</p>
-<p class='stm run hide'>359</p>
-<p class='stm run hide'>360</p>
-<p class='stm mis'>361</p>
-<p class='pln'>362</p>
-<p class='stm run hide'>363</p>
-<p class='stm mis'>364</p>
-<p class='pln'>365</p>
-<p class='stm run hide'>366</p>
-<p class='stm run hide'>367</p>
-<p class='stm run hide'>368</p>
-<p class='stm run hide'>369</p>
-<p class='stm run hide'>370</p>
-<p class='stm run hide'>371</p>
-<p class='pln'>372</p>
-<p class='pln'>373</p>
-<p class='stm run hide'>374</p>
-<p class='stm run hide'>375</p>
-<p class='stm run hide'>376</p>
-<p class='stm run hide'>377</p>
-<p class='stm run hide'>378</p>
-<p class='pln'>379</p>
-<p class='pln'>380</p>
-<p class='pln'>381</p>
-<p class='stm run hide'>382</p>
-<p class='stm run hide'>383</p>
-<p class='stm run hide'>384</p>
-<p class='stm run hide'>385</p>
-<p class='stm run hide'>386</p>
-<p class='pln'>387</p>
-<p class='pln'>388</p>
-<p class='stm run hide'>389</p>
-<p class='stm run hide'>390</p>
-<p class='pln'>391</p>
-<p class='pln'>392</p>
-<p class='stm run hide'>393</p>
-<p class='pln'>394</p>
-<p class='pln'>395</p>
-<p class='stm run hide'>396</p>
-<p class='stm run hide'>397</p>
-<p class='stm mis'>398</p>
-<p class='pln'>399</p>
-<p class='stm run hide'>400</p>
-<p class='stm mis'>401</p>
-<p class='pln'>402</p>
-<p class='stm run hide'>403</p>
-<p class='stm run hide'>404</p>
-<p class='stm run hide'>405</p>
-<p class='stm run hide'>406</p>
-<p class='stm run hide'>407</p>
-<p class='stm mis'>408</p>
-<p class='pln'>409</p>
-<p class='pln'>410</p>
-<p class='pln'>411</p>
-<p class='stm run hide'>412</p>
-<p class='stm run hide'>413</p>
-<p class='stm run hide'>414</p>
-<p class='pln'>415</p>
-<p class='stm run hide'>416</p>
-<p class='pln'>417</p>
-<p class='pln'>418</p>
-<p class='pln'>419</p>
-<p class='stm run hide'>420</p>
-<p class='stm run hide'>421</p>
-<p class='stm run hide'>422</p>
-<p class='stm mis'>423</p>
-<p class='pln'>424</p>
-<p class='stm run hide'>425</p>
-<p class='stm mis'>426</p>
-<p class='pln'>427</p>
-<p class='stm run hide'>428</p>
-<p class='stm run hide'>429</p>
-<p class='stm run hide'>430</p>
-<p class='pln'>431</p>
-<p class='stm run hide'>432</p>
-<p class='pln'>433</p>
-<p class='stm mis'>434</p>
-<p class='pln'>435</p>
-<p class='pln'>436</p>
-<p class='pln'>437</p>
-<p class='pln'>438</p>
-<p class='stm run hide'>439</p>
-<p class='stm run hide'>440</p>
-<p class='stm run hide'>441</p>
-<p class='stm run hide'>442</p>
-<p class='stm run hide'>443</p>
-<p class='stm run hide'>444</p>
-<p class='stm run hide'>445</p>
-<p class='stm run hide'>446</p>
-<p class='pln'>447</p>
-<p class='stm run hide'>448</p>
-<p class='pln'>449</p>
-<p class='pln'>450</p>
-<p class='stm run hide'>451</p>
-<p class='stm run hide'>452</p>
-<p class='stm mis'>453</p>
-<p class='stm mis'>454</p>
-<p class='stm mis'>455</p>
-<p class='stm mis'>456</p>
-<p class='pln'>457</p>
-<p class='pln'>458</p>
-<p class='stm mis'>459</p>
-<p class='pln'>460</p>
-<p class='pln'>461</p>
-<p class='stm mis'>462</p>
-<p class='stm mis'>463</p>
-<p class='pln'>464</p>
-<p class='pln'>465</p>
-<p class='pln'>466</p>
-<p class='stm run hide'>467</p>
-<p class='stm mis'>468</p>
-<p class='pln'>469</p>
-<p class='stm run hide'>470</p>
-<p class='stm run hide'>471</p>
-<p class='stm run hide'>472</p>
-<p class='pln'>473</p>
-<p class='stm run hide'>474</p>
-<p class='stm mis'>475</p>
-<p class='pln'>476</p>
-<p class='stm run hide'>477</p>
-<p class='stm mis'>478</p>
-<p class='stm run hide'>479</p>
-<p class='stm mis'>480</p>
-<p class='pln'>481</p>
-<p class='pln'>482</p>
-<p class='pln'>483</p>
-<p class='stm run hide'>484</p>
-<p class='pln'>485</p>
-<p class='stm run hide'>486</p>
-<p class='pln'>487</p>
-<p class='pln'>488</p>
-<p class='pln'>489</p>
-<p class='stm run hide'>490</p>
-<p class='pln'>491</p>
-<p class='stm mis'>492</p>
-<p class='stm mis'>493</p>
-<p class='stm run hide'>494</p>
-<p class='pln'>495</p>
-<p class='stm run hide'>496</p>
-<p class='pln'>497</p>
-<p class='pln'>498</p>
-<p class='pln'>499</p>
-<p class='stm run hide'>500</p>
-<p class='stm run hide'>501</p>
-<p class='stm run hide'>502</p>
-<p class='stm run hide'>503</p>
-<p class='pln'>504</p>
-<p class='stm run hide'>505</p>
-<p class='pln'>506</p>
-<p class='pln'>507</p>
-<p class='stm mis'>508</p>
-<p class='pln'>509</p>
-<p class='stm mis'>510</p>
-<p class='pln'>511</p>
-<p class='stm mis'>512</p>
-<p class='stm mis'>513</p>
-<p class='stm mis'>514</p>
-<p class='stm mis'>515</p>
-<p class='pln'>516</p>
-<p class='pln'>517</p>
-<p class='stm mis'>518</p>
-<p class='stm mis'>519</p>
-<p class='stm mis'>520</p>
-<p class='stm mis'>521</p>
-<p class='pln'>522</p>
-<p class='stm run hide'>523</p>
-<p class='stm mis'>524</p>
-<p class='stm mis'>525</p>
-<p class='pln'>526</p>
-<p class='stm run hide'>527</p>
-<p class='stm mis'>528</p>
-<p class='stm mis'>529</p>
-<p class='stm mis'>530</p>
-<p class='pln'>531</p>
-<p class='stm run hide'>532</p>
-<p class='stm mis'>533</p>
-<p class='stm mis'>534</p>
-<p class='pln'>535</p>
-<p class='stm run hide'>536</p>
-<p class='pln'>537</p>
-<p class='pln'>538</p>
-<p class='pln'>539</p>
-<p class='stm mis'>540</p>
-<p class='pln'>541</p>
-<p class='stm mis'>542</p>
-<p class='stm mis'>543</p>
-<p class='pln'>544</p>
-<p class='pln'>545</p>
-<p class='stm mis'>546</p>
-<p class='pln'>547</p>
-<p class='pln'>548</p>
-<p class='pln'>549</p>
-<p class='stm mis'>550</p>
-<p class='stm mis'>551</p>
-<p class='stm mis'>552</p>
-<p class='pln'>553</p>
-<p class='pln'>554</p>
-<p class='stm mis'>555</p>
-<p class='stm mis'>556</p>
-<p class='stm mis'>557</p>
-<p class='pln'>558</p>
-<p class='pln'>559</p>
-<p class='stm mis'>560</p>
-<p class='stm mis'>561</p>
-<p class='pln'>562</p>
-<p class='stm mis'>563</p>
-<p class='stm mis'>564</p>
-<p class='stm mis'>565</p>
-<p class='stm mis'>566</p>
-<p class='stm mis'>567</p>
-<p class='stm mis'>568</p>
-<p class='stm mis'>569</p>
-<p class='stm mis'>570</p>
-<p class='stm mis'>571</p>
-<p class='pln'>572</p>
-<p class='pln'>573</p>
-<p class='pln'>574</p>
-<p class='pln'>575</p>
-<p class='pln'>576</p>
-<p class='stm mis'>577</p>
-<p class='stm mis'>578</p>
-<p class='pln'>579</p>
-<p class='stm mis'>580</p>
-<p class='pln'>581</p>
-<p class='stm mis'>582</p>
-<p class='pln'>583</p>
-<p class='stm run hide'>584</p>
-<p class='pln'>585</p>
-<p class='pln'>586</p>
-<p class='stm mis'>587</p>
-<p class='stm mis'>588</p>
-<p class='stm mis'>589</p>
-<p class='stm mis'>590</p>
-<p class='pln'>591</p>
-<p class='stm mis'>592</p>
-<p class='stm mis'>593</p>
-<p class='stm mis'>594</p>
-<p class='pln'>595</p>
-<p class='stm mis'>596</p>
-<p class='stm mis'>597</p>
-<p class='stm mis'>598</p>
-<p class='stm mis'>599</p>
-<p class='pln'>600</p>
-<p class='stm run hide'>601</p>
-<p class='pln'>602</p>
-<p class='pln'>603</p>
-<p class='stm mis'>604</p>
-<p class='stm mis'>605</p>
-<p class='pln'>606</p>
-<p class='stm mis'>607</p>
-<p class='stm mis'>608</p>
-<p class='pln'>609</p>
-<p class='stm mis'>610</p>
-<p class='stm mis'>611</p>
-<p class='stm mis'>612</p>
-<p class='stm mis'>613</p>
-<p class='pln'>614</p>
-<p class='stm mis'>615</p>
-<p class='pln'>616</p>
-<p class='stm mis'>617</p>
-<p class='pln'>618</p>
-<p class='stm run hide'>619</p>
-<p class='pln'>620</p>
-<p class='pln'>621</p>
-<p class='pln'>622</p>
-<p class='pln'>623</p>
-<p class='stm mis'>624</p>
-<p class='pln'>625</p>
-<p class='pln'>626</p>
-<p class='stm mis'>627</p>
-<p class='stm mis'>628</p>
-<p class='stm mis'>629</p>
-<p class='pln'>630</p>
-<p class='stm mis'>631</p>
-<p class='stm mis'>632</p>
-<p class='pln'>633</p>
-<p class='stm mis'>634</p>
-<p class='stm mis'>635</p>
-<p class='stm mis'>636</p>
-<p class='pln'>637</p>
-<p class='stm mis'>638</p>
-<p class='stm mis'>639</p>
-<p class='stm mis'>640</p>
-<p class='pln'>641</p>
-<p class='stm mis'>642</p>
-<p class='pln'>643</p>
-<p class='stm run hide'>644</p>
-<p class='pln'>645</p>
-<p class='pln'>646</p>
-<p class='pln'>647</p>
-<p class='stm mis'>648</p>
-<p class='stm mis'>649</p>
-<p class='stm mis'>650</p>
-<p class='stm mis'>651</p>
-<p class='stm mis'>652</p>
-<p class='stm mis'>653</p>
-<p class='stm mis'>654</p>
-<p class='stm mis'>655</p>
-<p class='stm mis'>656</p>
-<p class='stm mis'>657</p>
-<p class='stm mis'>658</p>
-<p class='stm mis'>659</p>
-<p class='stm mis'>660</p>
-<p class='stm mis'>661</p>
-<p class='stm mis'>662</p>
-<p class='stm mis'>663</p>
-<p class='pln'>664</p>
-<p class='pln'>665</p>
-<p class='pln'>666</p>
-<p class='pln'>667</p>
-<p class='pln'>668</p>
-<p class='pln'>669</p>
-<p class='pln'>670</p>
-<p class='pln'>671</p>
-<p class='pln'>672</p>
-<p class='pln'>673</p>
-<p class='pln'>674</p>
-<p class='pln'>675</p>
-<p class='pln'>676</p>
-<p class='pln'>677</p>
-<p class='pln'>678</p>
-<p class='pln'>679</p>
-<p class='pln'>680</p>
-<p class='pln'>681</p>
-<p class='pln'>682</p>
-<p class='pln'>683</p>
-<p class='pln'>684</p>
-<p class='pln'>685</p>
-<p class='pln'>686</p>
-<p class='pln'>687</p>
-<p class='pln'>688</p>
-<p class='pln'>689</p>
-<p class='pln'>690</p>
-<p class='pln'>691</p>
-<p class='pln'>692</p>
-<p class='pln'>693</p>
-<p class='pln'>694</p>
-<p class='pln'>695</p>
-<p class='pln'>696</p>
-<p class='pln'>697</p>
-<p class='pln'>698</p>
-<p class='pln'>699</p>
-<p class='pln'>700</p>
-<p class='pln'>701</p>
-<p class='pln'>702</p>
-<p class='pln'>703</p>
-<p class='pln'>704</p>
-<p class='pln'>705</p>
-<p class='pln'>706</p>
-<p class='pln'>707</p>
-<p class='pln'>708</p>
-<p class='pln'>709</p>
-
-</td>
-<td class='text' valign='top'>
-<p class='pln'><span class='str'>""" Cog code generation tool.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> http://nedbatchelder.com/code/cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> </span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Copyright 2004-2009, Ned Batchelder.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'>"""</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>import</span> <span class='nam'>copy</span><span class='op'>,</span> <span class='nam'>getopt</span><span class='op'>,</span> <span class='nam'>imp</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>,</span> <span class='nam'>re</span><span class='op'>,</span> <span class='nam'>shlex</span><span class='op'>,</span> <span class='nam'>string</span><span class='op'>,</span> <span class='nam'>sys</span><span class='op'>,</span> <span class='nam'>traceback</span><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>from</span> <span class='nam'>cStringIO</span> <span class='key'>import</span> <span class='nam'>StringIO</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='com'># The recommended way to compute md5's changed in Python 2.5</span><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>try</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>import</span> <span class='nam'>hashlib</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>hash_factory</span> <span class='op'>=</span> <span class='nam'>hashlib</span><span class='op'>.</span><span class='nam'>md5</span><span class="strut"> </span></p>
-<p class='stm mis'><span class='key'>except</span> <span class='nam'>ImportError</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>import</span> <span class='nam'>md5</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>hash_factory</span> <span class='op'>=</span> <span class='nam'>md5</span><span class='op'>.</span><span class='nam'>new</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='nam'>__all__</span> <span class='op'>=</span> <span class='op'>[</span><span class='str'>'Cog'</span><span class='op'>,</span> <span class='str'>'CogUsageError'</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='nam'>__version__</span> <span class='op'>=</span> <span class='str'>'2.2'</span> <span class='com'># History at the end of the file.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='nam'>usage</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'>cog - generate code with inlined Python code.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'>cog [OPTIONS] [INFILE | @FILELIST] ...</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'>INFILE is the name of an input file.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'>FILELIST is the name of a text file containing file names or</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> other @FILELISTs.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'>OPTIONS:</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> -c Checksum the output to protect it against accidental change.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> -d Delete the generator code from the output file.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> -D name=val Define a global string available to your generator code.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> -e Warn if a file has no cog code in it.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> -I PATH Add PATH to the list of directories for data files and modules.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> -o OUTNAME Write the output to OUTNAME.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> -r Replace the input file with the output.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> -s STRING Suffix all generated output lines with STRING.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> -U Write the output with Unix newlines (only LF line-endings).</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> -w CMD Use CMD if the output file needs to be made writable.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> A %s in the CMD will be filled with the filename.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> -x Excise all the generated output without running the generators.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> -z The [[[end]]] marker can be omitted, and is assumed at eof.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> -v Print the version of cog and exit.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> -h Print this help.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'>"""</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='com'># Other package modules</span><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>from</span> <span class='nam'>whiteutils</span> <span class='key'>import</span> <span class='op'>*</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>class</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='nam'>Exception</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Any exception raised by Cog.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>,</span> <span class='nam'>file</span><span class='op'>=</span><span class='str'>''</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='num'>0</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>file</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>Exception</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>"%s(%d): %s"</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>file</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>Exception</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>class</span> <span class='nam'>CogUsageError</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" An error in usage of command-line arguments in cog.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='exc'> <span class='key'>pass</span> <span class='com'>#pragma: no cover</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>class</span> <span class='nam'>CogInternalError</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" An error in the coding of Cog. Should never happen.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='exc'> <span class='key'>pass</span> <span class='com'>#pragma: no cover</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>class</span> <span class='nam'>CogGeneratedError</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" An error raised by a user's cog generator.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='exc'> <span class='key'>pass</span> <span class='com'>#pragma: no cover</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>class</span> <span class='nam'>Redirectable</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" An object with its own stdout and stderr files.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span> <span class='op'>=</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>stdout</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>stderr</span> <span class='op'>=</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>stderr</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>setOutput</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>stdout</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>stderr</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Assign new files for standard out and/or standard error.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>stdout</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span> <span class='op'>=</span> <span class='nam'>stdout</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>stderr</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>stderr</span> <span class='op'>=</span> <span class='nam'>stderr</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>class</span> <span class='nam'>CogGenerator</span><span class='op'>(</span><span class='nam'>Redirectable</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" A generator pulled from a source file.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>Redirectable</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>markers</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>parseMarker</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>markers</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>parseLine</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>.</span><span class='nam'>strip</span><span class='op'>(</span><span class='str'>'\n'</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>getCode</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Extract the executable Python code from the generator.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># If the markers and lines all have the same prefix</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># (end-of-line comment chars, for example),</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># then remove it from all the lines.</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>prefIn</span> <span class='op'>=</span> <span class='nam'>commonPrefix</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>markers</span> <span class='op'>+</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>prefIn</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>markers</span> <span class='op'>=</span> <span class='op'>[</span> <span class='nam'>l</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='nam'>prefIn</span><span class='op'>,</span> <span class='str'>''</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span> <span class='key'>for</span> <span class='nam'>l</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>markers</span> <span class='op'>]</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines</span> <span class='op'>=</span> <span class='op'>[</span> <span class='nam'>l</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='nam'>prefIn</span><span class='op'>,</span> <span class='str'>''</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span> <span class='key'>for</span> <span class='nam'>l</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines</span> <span class='op'>]</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>return</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines</span><span class='op'>,</span> <span class='str'>''</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>evaluate</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>cog</span><span class='op'>,</span> <span class='nam'>globals</span><span class='op'>,</span> <span class='nam'>fname</span><span class='op'>=</span><span class='str'>'cog generator'</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># figure out the right whitespace prefix for the output</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>prefOut</span> <span class='op'>=</span> <span class='nam'>whitePrefix</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>markers</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>intext</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>getCode</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>intext</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>return</span> <span class='str'>''</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># In Python 2.2, the last line has to end in a newline.</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>intext</span> <span class='op'>=</span> <span class='str'>"import cog\n"</span> <span class='op'>+</span> <span class='nam'>intext</span> <span class='op'>+</span> <span class='str'>"\n"</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>code</span> <span class='op'>=</span> <span class='nam'>compile</span><span class='op'>(</span><span class='nam'>intext</span><span class='op'>,</span> <span class='nam'>str</span><span class='op'>(</span><span class='nam'>fname</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'exec'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Make sure the "cog" module has our state.</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>cog</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>msg</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>msg</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>cog</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>out</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>out</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>cog</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>outl</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>outl</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>cog</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>error</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>error</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>outstring</span> <span class='op'>=</span> <span class='str'>''</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>eval</span><span class='op'>(</span><span class='nam'>code</span><span class='op'>,</span> <span class='nam'>globals</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># We need to make sure that the last line in the output</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># ends with a newline, or it will be joined to the</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># end-output line, ruining cog's idempotency.</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>outstring</span> <span class='key'>and</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>outstring</span><span class='op'>[</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span> <span class='op'>!=</span> <span class='str'>'\n'</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>outstring</span> <span class='op'>+=</span> <span class='str'>'\n'</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>return</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>outstring</span><span class='op'>,</span> <span class='nam'>prefOut</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>msg</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>s</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span><span class='op'>,</span> <span class='str'>"Message: "</span><span class='op'>+</span><span class='nam'>s</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>out</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>sOut</span><span class='op'>=</span><span class='str'>''</span><span class='op'>,</span> <span class='nam'>dedent</span><span class='op'>=</span><span class='nam'>False</span><span class='op'>,</span> <span class='nam'>trimblanklines</span><span class='op'>=</span><span class='nam'>False</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" The cog.out function.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>trimblanklines</span> <span class='key'>and</span> <span class='op'>(</span><span class='str'>'\n'</span> <span class='key'>in</span> <span class='nam'>sOut</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>lines</span> <span class='op'>=</span> <span class='nam'>sOut</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>'\n'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>lines</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>strip</span><span class='op'>(</span><span class='op'>)</span> <span class='op'>==</span> <span class='str'>''</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>del</span> <span class='nam'>lines</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>lines</span> <span class='key'>and</span> <span class='nam'>lines</span><span class='op'>[</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>strip</span><span class='op'>(</span><span class='op'>)</span> <span class='op'>==</span> <span class='str'>''</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>del</span> <span class='nam'>lines</span><span class='op'>[</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>sOut</span> <span class='op'>=</span> <span class='str'>'\n'</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>lines</span><span class='op'>)</span><span class='op'>+</span><span class='str'>'\n'</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>dedent</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>sOut</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>sOut</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>outstring</span> <span class='op'>+=</span> <span class='nam'>sOut</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>outl</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>sOut</span><span class='op'>=</span><span class='str'>''</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kw</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" The cog.outl function.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>out</span><span class='op'>(</span><span class='nam'>sOut</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kw</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>out</span><span class='op'>(</span><span class='str'>'\n'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>error</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>=</span><span class='str'>'Error raised by cog generator.'</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" The cog.error function.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Instead of raising standard python errors, cog generators can use</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> this function. It will display the error without a scary Python</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> traceback.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogGeneratedError</span><span class='op'>(</span><span class='nam'>msg</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>class</span> <span class='nam'>NumberedFileReader</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" A decorator for files that counts the readline()'s called.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>f</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>f</span> <span class='op'>=</span> <span class='nam'>f</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>n</span> <span class='op'>=</span> <span class='num'>0</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>readline</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>f</span><span class='op'>.</span><span class='nam'>readline</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>l</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>n</span> <span class='op'>+=</span> <span class='num'>1</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>return</span> <span class='nam'>l</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>linenumber</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>n</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>class</span> <span class='nam'>CogOptions</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Options for a run of cog.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Defaults for argument values.</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>args</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>includePath</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>defines</span> <span class='op'>=</span> <span class='op'>{</span><span class='op'>}</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bShowVersion</span> <span class='op'>=</span> <span class='nam'>False</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sMakeWritableCmd</span> <span class='op'>=</span> <span class='nam'>None</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bReplace</span> <span class='op'>=</span> <span class='nam'>False</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bNoGenerate</span> <span class='op'>=</span> <span class='nam'>False</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sOutputName</span> <span class='op'>=</span> <span class='nam'>None</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bWarnEmpty</span> <span class='op'>=</span> <span class='nam'>False</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bHashOutput</span> <span class='op'>=</span> <span class='nam'>False</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bDeleteCode</span> <span class='op'>=</span> <span class='nam'>False</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bEofCanBeEnd</span> <span class='op'>=</span> <span class='nam'>False</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sSuffix</span> <span class='op'>=</span> <span class='nam'>None</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bNewlines</span> <span class='op'>=</span> <span class='nam'>False</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>__cmp__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>other</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Comparison operator for tests to use.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>__dict__</span><span class='op'>.</span><span class='nam'>__cmp__</span><span class='op'>(</span><span class='nam'>other</span><span class='op'>.</span><span class='nam'>__dict__</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>clone</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Make a clone of these options, for further refinement.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='nam'>copy</span><span class='op'>.</span><span class='nam'>deepcopy</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>addToIncludePath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>dirs</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Add directories to the include path.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>dirs</span> <span class='op'>=</span> <span class='nam'>dirs</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>pathsep</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>includePath</span><span class='op'>.</span><span class='nam'>extend</span><span class='op'>(</span><span class='nam'>dirs</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>parseArgs</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>argv</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Parse the command line arguments.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>opts</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>args</span> <span class='op'>=</span> <span class='nam'>getopt</span><span class='op'>.</span><span class='nam'>getopt</span><span class='op'>(</span><span class='nam'>argv</span><span class='op'>,</span> <span class='str'>'cdD:eI:o:rs:Uvw:xz'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>except</span> <span class='nam'>getopt</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogUsageError</span><span class='op'>(</span><span class='nam'>msg</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Handle the command line arguments.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>for</span> <span class='nam'>o</span><span class='op'>,</span> <span class='nam'>a</span> <span class='key'>in</span> <span class='nam'>opts</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-c'</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bHashOutput</span> <span class='op'>=</span> <span class='nam'>True</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-d'</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bDeleteCode</span> <span class='op'>=</span> <span class='nam'>True</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-D'</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>a</span><span class='op'>.</span><span class='nam'>count</span><span class='op'>(</span><span class='str'>'='</span><span class='op'>)</span> <span class='op'><</span> <span class='num'>1</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogUsageError</span><span class='op'>(</span><span class='str'>"-D takes a name=value argument"</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>name</span><span class='op'>,</span> <span class='nam'>value</span> <span class='op'>=</span> <span class='nam'>a</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>'='</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>defines</span><span class='op'>[</span><span class='nam'>name</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>value</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-e'</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bWarnEmpty</span> <span class='op'>=</span> <span class='nam'>True</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-I'</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>addToIncludePath</span><span class='op'>(</span><span class='nam'>a</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-o'</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sOutputName</span> <span class='op'>=</span> <span class='nam'>a</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-r'</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bReplace</span> <span class='op'>=</span> <span class='nam'>True</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-s'</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sSuffix</span> <span class='op'>=</span> <span class='nam'>a</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-U'</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bNewlines</span> <span class='op'>=</span> <span class='nam'>True</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-v'</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bShowVersion</span> <span class='op'>=</span> <span class='nam'>True</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-w'</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sMakeWritableCmd</span> <span class='op'>=</span> <span class='nam'>a</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-x'</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bNoGenerate</span> <span class='op'>=</span> <span class='nam'>True</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-z'</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bEofCanBeEnd</span> <span class='op'>=</span> <span class='nam'>True</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Since getopt.getopt is given a list of possible flags,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># this is an internal error.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogInternalError</span><span class='op'>(</span><span class='str'>"Don't understand argument %s"</span> <span class='op'>%</span> <span class='nam'>o</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>validate</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Does nothing if everything is OK, raises CogError's if it's not.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bReplace</span> <span class='key'>and</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bDeleteCode</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogUsageError</span><span class='op'>(</span><span class='str'>"Can't use -d with -r (or you would delete all your source!)"</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bReplace</span> <span class='key'>and</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sOutputName</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogUsageError</span><span class='op'>(</span><span class='str'>"Can't use -o with -r (they are opposites)"</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>class</span> <span class='nam'>Cog</span><span class='op'>(</span><span class='nam'>Redirectable</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" The Cog engine.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>Redirectable</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sBeginSpec</span> <span class='op'>=</span> <span class='str'>'[[[cog'</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndSpec</span> <span class='op'>=</span> <span class='str'>']]]'</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndOutput</span> <span class='op'>=</span> <span class='str'>'[[[end]]]'</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>reEndOutput</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>compile</span><span class='op'>(</span><span class='str'>r'\[\[\[end]]](?P<hashsect> *\(checksum: (?P<hash>[a-f0-9]+)\))'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndFormat</span> <span class='op'>=</span> <span class='str'>'[[[end]]] (checksum: %s)'</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span> <span class='op'>=</span> <span class='nam'>CogOptions</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sOutputMode</span> <span class='op'>=</span> <span class='str'>'w'</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>installCogModule</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>showWarning</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span><span class='op'>,</span> <span class='str'>"Warning:"</span><span class='op'>,</span> <span class='nam'>msg</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>isBeginSpecLine</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>s</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>return</span> <span class='nam'>string</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='nam'>s</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sBeginSpec</span><span class='op'>)</span> <span class='op'>>=</span> <span class='num'>0</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>isEndSpecLine</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>s</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>return</span> <span class='nam'>string</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='nam'>s</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndSpec</span><span class='op'>)</span> <span class='op'>>=</span> <span class='num'>0</span> <span class='key'>and</span> <span class='xx'>\</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isEndOutputLine</span><span class='op'>(</span><span class='nam'>s</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>isEndOutputLine</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>s</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>return</span> <span class='nam'>string</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='nam'>s</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndOutput</span><span class='op'>)</span> <span class='op'>>=</span> <span class='num'>0</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>installCogModule</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Magic mumbo-jumbo so that imported Python modules</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> can say "import cog" and get our state.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cogmodule</span> <span class='op'>=</span> <span class='nam'>imp</span><span class='op'>.</span><span class='nam'>new_module</span><span class='op'>(</span><span class='str'>'cog'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>path</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>modules</span><span class='op'>[</span><span class='str'>'cog'</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>processFile</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>fIn</span><span class='op'>,</span> <span class='nam'>fOut</span><span class='op'>,</span> <span class='nam'>fname</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>globals</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Process an input file object to an output file object.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> fIn and fOut can be file objects, or file names.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>sFileIn</span> <span class='op'>=</span> <span class='nam'>fname</span> <span class='key'>or</span> <span class='str'>''</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>sFileOut</span> <span class='op'>=</span> <span class='nam'>fname</span> <span class='key'>or</span> <span class='str'>''</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>fInToClose</span> <span class='op'>=</span> <span class='nam'>fOutToClose</span> <span class='op'>=</span> <span class='nam'>None</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Convert filenames to files.</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>fIn</span><span class='op'>,</span> <span class='nam'>basestring</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Open the input file.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>sFileIn</span> <span class='op'>=</span> <span class='nam'>fIn</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>fIn</span> <span class='op'>=</span> <span class='nam'>fInToClose</span> <span class='op'>=</span> <span class='nam'>open</span><span class='op'>(</span><span class='nam'>fIn</span><span class='op'>,</span> <span class='str'>'r'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>fOut</span><span class='op'>,</span> <span class='nam'>basestring</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Open the output file.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>sFileOut</span> <span class='op'>=</span> <span class='nam'>fOut</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>fOut</span> <span class='op'>=</span> <span class='nam'>fOutToClose</span> <span class='op'>=</span> <span class='nam'>open</span><span class='op'>(</span><span class='nam'>fOut</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sOutputMode</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>try</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>fIn</span> <span class='op'>=</span> <span class='nam'>NumberedFileReader</span><span class='op'>(</span><span class='nam'>fIn</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>bSawCog</span> <span class='op'>=</span> <span class='nam'>False</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>inFile</span> <span class='op'>=</span> <span class='nam'>sFileIn</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>outFile</span> <span class='op'>=</span> <span class='nam'>sFileOut</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># The globals dict we'll use for this file.</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>globals</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>globals</span> <span class='op'>=</span> <span class='op'>{</span><span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># If there are any global defines, put them in the globals.</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>globals</span><span class='op'>.</span><span class='nam'>update</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>defines</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># loop over generator chunks</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>readline</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>while</span> <span class='nam'>l</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Find the next spec begin</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>while</span> <span class='nam'>l</span> <span class='key'>and</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBeginSpecLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isEndSpecLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Unexpected '%s'"</span> <span class='op'>%</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndSpec</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>linenumber</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isEndOutputLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Unexpected '%s'"</span> <span class='op'>%</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndOutput</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>linenumber</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>fOut</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>readline</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>l</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>break</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bDeleteCode</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>fOut</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># l is the begin spec</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>gen</span> <span class='op'>=</span> <span class='nam'>CogGenerator</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>gen</span><span class='op'>.</span><span class='nam'>setOutput</span><span class='op'>(</span><span class='nam'>stdout</span><span class='op'>=</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>gen</span><span class='op'>.</span><span class='nam'>parseMarker</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>firstLineNum</span> <span class='op'>=</span> <span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>linenumber</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>firstLineNum</span> <span class='op'>=</span> <span class='nam'>firstLineNum</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># If the spec begin is also a spec end, then process the single</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># line of code inside.</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isEndSpecLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>beg</span> <span class='op'>=</span> <span class='nam'>string</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sBeginSpec</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>end</span> <span class='op'>=</span> <span class='nam'>string</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndSpec</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>beg</span> <span class='op'>></span> <span class='nam'>end</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Cog code markers inverted"</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>firstLineNum</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>sCode</span> <span class='op'>=</span> <span class='nam'>l</span><span class='op'>[</span><span class='nam'>beg</span><span class='op'>+</span><span class='nam'>len</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>sBeginSpec</span><span class='op'>)</span><span class='op'>:</span><span class='nam'>end</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>strip</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>gen</span><span class='op'>.</span><span class='nam'>parseLine</span><span class='op'>(</span><span class='nam'>sCode</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Deal with an ordinary code block.</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>readline</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Get all the lines in the spec</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>while</span> <span class='nam'>l</span> <span class='key'>and</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isEndSpecLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBeginSpecLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Unexpected '%s'"</span> <span class='op'>%</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sBeginSpec</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>linenumber</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isEndOutputLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Unexpected '%s'"</span> <span class='op'>%</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndOutput</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>linenumber</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bDeleteCode</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>fOut</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>gen</span><span class='op'>.</span><span class='nam'>parseLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>readline</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>l</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>"Cog block begun but never ended."</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>firstLineNum</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bDeleteCode</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>fOut</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>gen</span><span class='op'>.</span><span class='nam'>parseMarker</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>readline</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Eat all the lines in the output section. While reading past</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># them, compute the md5 hash of the old output.</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>hasher</span> <span class='op'>=</span> <span class='nam'>hash_factory</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>while</span> <span class='nam'>l</span> <span class='key'>and</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isEndOutputLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBeginSpecLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Unexpected '%s'"</span> <span class='op'>%</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sBeginSpec</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>linenumber</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isEndSpecLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Unexpected '%s'"</span> <span class='op'>%</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndSpec</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>linenumber</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>hasher</span><span class='op'>.</span><span class='nam'>update</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>readline</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>curHash</span> <span class='op'>=</span> <span class='nam'>hasher</span><span class='op'>.</span><span class='nam'>hexdigest</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>l</span> <span class='key'>and</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bEofCanBeEnd</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># We reached end of file before we found the end output line.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Missing '%s' before end of file."</span> <span class='op'>%</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndOutput</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>linenumber</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Write the output of the spec to be the new output if we're </span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># supposed to generate code.</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>hasher</span> <span class='op'>=</span> <span class='nam'>hash_factory</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bNoGenerate</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>sFile</span> <span class='op'>=</span> <span class='str'>"%s+%d"</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>firstLineNum</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>sGen</span> <span class='op'>=</span> <span class='nam'>gen</span><span class='op'>.</span><span class='nam'>evaluate</span><span class='op'>(</span><span class='nam'>cog</span><span class='op'>=</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>globals</span><span class='op'>=</span><span class='nam'>globals</span><span class='op'>,</span> <span class='nam'>fname</span><span class='op'>=</span><span class='nam'>sFile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>sGen</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>suffixLines</span><span class='op'>(</span><span class='nam'>sGen</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>hasher</span><span class='op'>.</span><span class='nam'>update</span><span class='op'>(</span><span class='nam'>sGen</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>fOut</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>sGen</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>newHash</span> <span class='op'>=</span> <span class='nam'>hasher</span><span class='op'>.</span><span class='nam'>hexdigest</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>bSawCog</span> <span class='op'>=</span> <span class='nam'>True</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Write the ending output line</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>hashMatch</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>reEndOutput</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bHashOutput</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>hashMatch</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>oldHash</span> <span class='op'>=</span> <span class='nam'>hashMatch</span><span class='op'>.</span><span class='nam'>groupdict</span><span class='op'>(</span><span class='op'>)</span><span class='op'>[</span><span class='str'>'hash'</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>oldHash</span> <span class='op'>!=</span> <span class='nam'>curHash</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Output has been edited! Delete old checksum to unprotect."</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>linenumber</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Create a new end line with the correct hash.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>endpieces</span> <span class='op'>=</span> <span class='nam'>l</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='nam'>hashMatch</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>0</span><span class='op'>)</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># There was no old hash, but we want a new hash.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>endpieces</span> <span class='op'>=</span> <span class='nam'>l</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndOutput</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>l</span> <span class='op'>=</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndFormat</span> <span class='op'>%</span> <span class='nam'>newHash</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>endpieces</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># We don't want hashes output, so if there was one, get rid of</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># it.</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>hashMatch</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>l</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='nam'>hashMatch</span><span class='op'>.</span><span class='nam'>groupdict</span><span class='op'>(</span><span class='op'>)</span><span class='op'>[</span><span class='str'>'hashsect'</span><span class='op'>]</span><span class='op'>,</span> <span class='str'>''</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bDeleteCode</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>fOut</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>readline</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>bSawCog</span> <span class='key'>and</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bWarnEmpty</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>showWarning</span><span class='op'>(</span><span class='str'>"no cog code found in %s"</span> <span class='op'>%</span> <span class='nam'>sFileIn</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>finally</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>fInToClose</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>fInToClose</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>fOutToClose</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>fOutToClose</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># A regex for non-empty lines, used by suffixLines.</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>reNonEmptyLines</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>compile</span><span class='op'>(</span><span class='str'>"^\s*\S+.*$"</span><span class='op'>,</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>MULTILINE</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>suffixLines</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>text</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Add suffixes to the lines in text, if our options desire it.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> text is many lines, as a single string.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>sSuffix</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Find all non-blank lines, and add the suffix to the end.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>repl</span> <span class='op'>=</span> <span class='str'>r"\g<0>"</span> <span class='op'>+</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>sSuffix</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='str'>'\\'</span><span class='op'>,</span> <span class='str'>'\\\\'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>text</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>reNonEmptyLines</span><span class='op'>.</span><span class='nam'>sub</span><span class='op'>(</span><span class='nam'>repl</span><span class='op'>,</span> <span class='nam'>text</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>return</span> <span class='nam'>text</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>processString</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>sInput</span><span class='op'>,</span> <span class='nam'>fname</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Process sInput as the text to cog.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Return the cogged output as a string.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>fOld</span> <span class='op'>=</span> <span class='nam'>StringIO</span><span class='op'>(</span><span class='nam'>sInput</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>fNew</span> <span class='op'>=</span> <span class='nam'>StringIO</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>processFile</span><span class='op'>(</span><span class='nam'>fOld</span><span class='op'>,</span> <span class='nam'>fNew</span><span class='op'>,</span> <span class='nam'>fname</span><span class='op'>=</span><span class='nam'>fname</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>return</span> <span class='nam'>fNew</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>replaceFile</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>sOldPath</span><span class='op'>,</span> <span class='nam'>sNewText</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Replace file sOldPath with the contents sNewText</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>access</span><span class='op'>(</span><span class='nam'>sOldPath</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>W_OK</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Need to ensure we can write.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>sMakeWritableCmd</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Use an external command to make the file writable.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>cmd</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>sMakeWritableCmd</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='str'>'%s'</span><span class='op'>,</span> <span class='nam'>sOldPath</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>popen</span><span class='op'>(</span><span class='nam'>cmd</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>access</span><span class='op'>(</span><span class='nam'>sOldPath</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>W_OK</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Couldn't make %s writable"</span> <span class='op'>%</span> <span class='nam'>sOldPath</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Can't write!</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Can't overwrite %s"</span> <span class='op'>%</span> <span class='nam'>sOldPath</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>f</span> <span class='op'>=</span> <span class='nam'>open</span><span class='op'>(</span><span class='nam'>sOldPath</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sOutputMode</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>sNewText</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>saveIncludePath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>savedInclude</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>includePath</span><span class='op'>[</span><span class='op'>:</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>savedSysPath</span> <span class='op'>=</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>[</span><span class='op'>:</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>restoreIncludePath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>includePath</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>savedInclude</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>path</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>includePath</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>path</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>savedSysPath</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>addToIncludePath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>includePath</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>extend</span><span class='op'>(</span><span class='nam'>includePath</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>extend</span><span class='op'>(</span><span class='nam'>includePath</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>processOneFile</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>sFile</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Process one filename through cog.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>saveIncludePath</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>addToIncludePath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>includePath</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Since we know where the input file came from,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># push its directory onto the include path.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>addToIncludePath</span><span class='op'>(</span><span class='op'>[</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>dirname</span><span class='op'>(</span><span class='nam'>sFile</span><span class='op'>)</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Set the file output mode based on whether we want \n or native</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># line endings.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sOutputMode</span> <span class='op'>=</span> <span class='str'>'w'</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bNewlines</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sOutputMode</span> <span class='op'>=</span> <span class='str'>'wb'</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># How we process the file depends on where the output is going.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>sOutputName</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>processFile</span><span class='op'>(</span><span class='nam'>sFile</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>sOutputName</span><span class='op'>,</span> <span class='nam'>sFile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>elif</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bReplace</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># We want to replace the cog file with the output,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># but only if they differ.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span><span class='op'>,</span> <span class='str'>"Cogging %s"</span> <span class='op'>%</span> <span class='nam'>sFile</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>bNeedNewline</span> <span class='op'>=</span> <span class='nam'>True</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>fOldFile</span> <span class='op'>=</span> <span class='nam'>open</span><span class='op'>(</span><span class='nam'>sFile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>sOldText</span> <span class='op'>=</span> <span class='nam'>fOldFile</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>fOldFile</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>sNewText</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>sOldText</span><span class='op'>,</span> <span class='nam'>fname</span><span class='op'>=</span><span class='nam'>sFile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>sOldText</span> <span class='op'>!=</span> <span class='nam'>sNewText</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span><span class='op'>,</span> <span class='str'>" (changed)"</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>bNeedNewline</span> <span class='op'>=</span> <span class='nam'>False</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>replaceFile</span><span class='op'>(</span><span class='nam'>sFile</span><span class='op'>,</span> <span class='nam'>sNewText</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>finally</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># The try-finally block is so we can print a partial line</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># with the name of the file, and print (changed) on the</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># same line, but also make sure to break the line before</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># any traceback.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>bNeedNewline</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>processFile</span><span class='op'>(</span><span class='nam'>sFile</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span><span class='op'>,</span> <span class='nam'>sFile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>finally</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>restoreIncludePath</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>processFileList</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>sFileList</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Process the files in a file list.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>flist</span> <span class='op'>=</span> <span class='nam'>open</span><span class='op'>(</span><span class='nam'>sFileList</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>lines</span> <span class='op'>=</span> <span class='nam'>flist</span><span class='op'>.</span><span class='nam'>readlines</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>flist</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>for</span> <span class='nam'>l</span> <span class='key'>in</span> <span class='nam'>lines</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Use shlex to parse the line like a shell.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>lex</span> <span class='op'>=</span> <span class='nam'>shlex</span><span class='op'>.</span><span class='nam'>shlex</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>,</span> <span class='nam'>posix</span><span class='op'>=</span><span class='nam'>True</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>lex</span><span class='op'>.</span><span class='nam'>whitespace_split</span> <span class='op'>=</span> <span class='nam'>True</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>lex</span><span class='op'>.</span><span class='nam'>commenters</span> <span class='op'>=</span> <span class='str'>'#'</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># No escapes, so that backslash can be part of the path</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>lex</span><span class='op'>.</span><span class='nam'>escape</span> <span class='op'>=</span> <span class='str'>''</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>args</span> <span class='op'>=</span> <span class='nam'>list</span><span class='op'>(</span><span class='nam'>lex</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>args</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>processArguments</span><span class='op'>(</span><span class='nam'>args</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>processArguments</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>args</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Process one command-line.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>saved_options</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>clone</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>parseArgs</span><span class='op'>(</span><span class='nam'>args</span><span class='op'>[</span><span class='num'>1</span><span class='op'>:</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>validate</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>args</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span> <span class='op'>==</span> <span class='str'>'@'</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>sOutputName</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogUsageError</span><span class='op'>(</span><span class='str'>"Can't use -o with @file"</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>processFileList</span><span class='op'>(</span><span class='nam'>args</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>[</span><span class='num'>1</span><span class='op'>:</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>processOneFile</span><span class='op'>(</span><span class='nam'>args</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span> <span class='op'>=</span> <span class='nam'>saved_options</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>callableMain</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>argv</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" All of command-line cog, but in a callable form.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This is used by main.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> argv is the equivalent of sys.argv.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>argv0</span> <span class='op'>=</span> <span class='nam'>argv</span><span class='op'>.</span><span class='nam'>pop</span><span class='op'>(</span><span class='num'>0</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Provide help if asked for anywhere in the command line.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='str'>'-?'</span> <span class='key'>in</span> <span class='nam'>argv</span> <span class='key'>or</span> <span class='str'>'-h'</span> <span class='key'>in</span> <span class='nam'>argv</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stderr</span><span class='op'>,</span> <span class='nam'>usage</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>parseArgs</span><span class='op'>(</span><span class='nam'>argv</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>validate</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bShowVersion</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span><span class='op'>,</span> <span class='str'>"Cog version %s"</span> <span class='op'>%</span> <span class='nam'>__version__</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>args</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>for</span> <span class='nam'>a</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>args</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>processArguments</span><span class='op'>(</span><span class='op'>[</span><span class='nam'>a</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogUsageError</span><span class='op'>(</span><span class='str'>"No files to process"</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>main</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>argv</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Handle the command-line execution for cog.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='nam'>argv</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='num'>0</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>except</span> <span class='nam'>CogUsageError</span><span class='op'>,</span> <span class='nam'>err</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stderr</span><span class='op'>,</span> <span class='nam'>err</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stderr</span><span class='op'>,</span> <span class='str'>"(for help use -?)"</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='num'>2</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>except</span> <span class='nam'>CogGeneratedError</span><span class='op'>,</span> <span class='nam'>err</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stderr</span><span class='op'>,</span> <span class='str'>"Error: %s"</span> <span class='op'>%</span> <span class='nam'>err</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='num'>3</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>except</span> <span class='nam'>CogError</span><span class='op'>,</span> <span class='nam'>err</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stderr</span><span class='op'>,</span> <span class='nam'>err</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='num'>1</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>except</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>traceback</span><span class='op'>.</span><span class='nam'>print_exc</span><span class='op'>(</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>stderr</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='num'>1</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='com'># History:</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># 20040210: First public version.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># 20040220: Text preceding the start and end marker are removed from Python lines.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># -v option on the command line shows the version.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># 20040311: Make sure the last line of output is properly ended with a newline.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># 20040605: Fixed some blank line handling in cog.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># Fixed problems with assigning to xml elements in handyxml.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># 20040621: Changed all line-ends to LF from CRLF.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># 20041002: Refactor some option handling to simplify unittesting the options.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># 20041118: cog.out and cog.outl have optional string arguments.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># 20041119: File names weren't being properly passed around for warnings, etc.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># 20041122: Added cog.firstLineNum: a property with the line number of the [[[cog line.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># Added cog.inFile and cog.outFile: the names of the input and output file.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># 20041218: Single-line cog generators, with start marker and end marker on</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># the same line.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># 20041230: Keep a single globals dict for all the code fragments in a single</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># file so they can share state.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># 20050206: Added the -x switch to remove all generated output.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># 20050218: Now code can be on the marker lines as well.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># 20050219: Added -c switch to checksum the output so that edits can be</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># detected before they are obliterated.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># 20050521: Added cog.error, contributed by Alexander Belchenko.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># 20050720: Added code deletion and settable globals contributed by Blake Winton.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># 20050724: Many tweaks to improve code coverage.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># 20050726: Error messages are now printed with no traceback.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># Code can no longer appear on the marker lines,</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># except for single-line style.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># -z allows omission of the [[[end]]] marker, and it will be assumed</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># at the end of the file.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># 20050729: Refactor option parsing into a separate class, in preparation for</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># future features.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># 20050805: The cogmodule.path wasn't being properly maintained.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># 20050808: Added the -D option to define a global value.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># 20050810: The %s in the -w command is dealt with more robustly.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># Added the -s option to suffix output lines with a marker.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># 20050817: Now @files can have arguments on each line to change the cog's</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># behavior for that line.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># 20051006: Version 2.0</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># 20080521: -U options lets you create Unix newlines on Windows. Thanks,</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># Alexander Belchenko.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># 20080522: It's now ok to have -d with output to stdout, and now we validate</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># the args after each line of an @file.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># 20090520: Use hashlib where it's available, to avoid a warning.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># Use the builtin compile() instead of compiler, for Jython.</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># Explicitly close files we opened, Jython likes this.</span><span class="strut"> </span></p>
-
-</td>
-</tr>
-</table>
+ <table cellspacing='0' cellpadding='0'>
+ <tr>
+ <td class='linenos' valign='top'>
+<p id='n1' class='pln'>1</p>
+<p id='n2' class='pln'>2</p>
+<p id='n3' class='pln'>3</p>
+<p id='n4' class='pln'>4</p>
+<p id='n5' class='pln'>5</p>
+<p id='n6' class='pln'>6</p>
+<p id='n7' class='stm run hide_run'>7</p>
+<p id='n8' class='stm run hide_run'>8</p>
+<p id='n9' class='pln'>9</p>
+<p id='n10' class='pln'>10</p>
+<p id='n11' class='stm run hide_run'>11</p>
+<p id='n12' class='stm run hide_run'>12</p>
+<p id='n13' class='stm run hide_run'>13</p>
+<p id='n14' class='stm mis'>14</p>
+<p id='n15' class='stm mis'>15</p>
+<p id='n16' class='stm mis'>16</p>
+<p id='n17' class='pln'>17</p>
+<p id='n18' class='stm run hide_run'>18</p>
+<p id='n19' class='pln'>19</p>
+<p id='n20' class='stm run hide_run'>20</p>
+<p id='n21' class='pln'>21</p>
+<p id='n22' class='stm run hide_run'>22</p>
+<p id='n23' class='pln'>23</p>
+<p id='n24' class='pln'>24</p>
+<p id='n25' class='pln'>25</p>
+<p id='n26' class='pln'>26</p>
+<p id='n27' class='pln'>27</p>
+<p id='n28' class='pln'>28</p>
+<p id='n29' class='pln'>29</p>
+<p id='n30' class='pln'>30</p>
+<p id='n31' class='pln'>31</p>
+<p id='n32' class='pln'>32</p>
+<p id='n33' class='pln'>33</p>
+<p id='n34' class='pln'>34</p>
+<p id='n35' class='pln'>35</p>
+<p id='n36' class='pln'>36</p>
+<p id='n37' class='pln'>37</p>
+<p id='n38' class='pln'>38</p>
+<p id='n39' class='pln'>39</p>
+<p id='n40' class='pln'>40</p>
+<p id='n41' class='pln'>41</p>
+<p id='n42' class='pln'>42</p>
+<p id='n43' class='pln'>43</p>
+<p id='n44' class='pln'>44</p>
+<p id='n45' class='pln'>45</p>
+<p id='n46' class='pln'>46</p>
+<p id='n47' class='pln'>47</p>
+<p id='n48' class='pln'>48</p>
+<p id='n49' class='pln'>49</p>
+<p id='n50' class='stm run hide_run'>50</p>
+<p id='n51' class='pln'>51</p>
+<p id='n52' class='stm run hide_run'>52</p>
+<p id='n53' class='pln'>53</p>
+<p id='n54' class='pln'>54</p>
+<p id='n55' class='stm run hide_run'>55</p>
+<p id='n56' class='stm par run hide_run'>56</p>
+<p id='n57' class='stm run hide_run'>57</p>
+<p id='n58' class='pln'>58</p>
+<p id='n59' class='stm mis'>59</p>
+<p id='n60' class='pln'>60</p>
+<p id='n61' class='stm run hide_run'>61</p>
+<p id='n62' class='pln'>62</p>
+<p id='n63' class='pln'>63</p>
+<p id='n64' class='exc'>64</p>
+<p id='n65' class='pln'>65</p>
+<p id='n66' class='stm run hide_run'>66</p>
+<p id='n67' class='pln'>67</p>
+<p id='n68' class='pln'>68</p>
+<p id='n69' class='exc'>69</p>
+<p id='n70' class='pln'>70</p>
+<p id='n71' class='stm run hide_run'>71</p>
+<p id='n72' class='pln'>72</p>
+<p id='n73' class='pln'>73</p>
+<p id='n74' class='exc'>74</p>
+<p id='n75' class='pln'>75</p>
+<p id='n76' class='stm run hide_run'>76</p>
+<p id='n77' class='pln'>77</p>
+<p id='n78' class='pln'>78</p>
+<p id='n79' class='stm run hide_run'>79</p>
+<p id='n80' class='stm run hide_run'>80</p>
+<p id='n81' class='stm run hide_run'>81</p>
+<p id='n82' class='pln'>82</p>
+<p id='n83' class='stm run hide_run'>83</p>
+<p id='n84' class='pln'>84</p>
+<p id='n85' class='pln'>85</p>
+<p id='n86' class='stm par run hide_run'>86</p>
+<p id='n87' class='stm run hide_run'>87</p>
+<p id='n88' class='stm par run hide_run'>88</p>
+<p id='n89' class='stm mis'>89</p>
+<p id='n90' class='pln'>90</p>
+<p id='n91' class='stm run hide_run'>91</p>
+<p id='n92' class='pln'>92</p>
+<p id='n93' class='pln'>93</p>
+<p id='n94' class='stm run hide_run'>94</p>
+<p id='n95' class='stm run hide_run'>95</p>
+<p id='n96' class='stm run hide_run'>96</p>
+<p id='n97' class='stm run hide_run'>97</p>
+<p id='n98' class='pln'>98</p>
+<p id='n99' class='stm run hide_run'>99</p>
+<p id='n100' class='stm run hide_run'>100</p>
+<p id='n101' class='pln'>101</p>
+<p id='n102' class='stm run hide_run'>102</p>
+<p id='n103' class='stm run hide_run'>103</p>
+<p id='n104' class='pln'>104</p>
+<p id='n105' class='stm run hide_run'>105</p>
+<p id='n106' class='pln'>106</p>
+<p id='n107' class='pln'>107</p>
+<p id='n108' class='pln'>108</p>
+<p id='n109' class='pln'>109</p>
+<p id='n110' class='pln'>110</p>
+<p id='n111' class='stm run hide_run'>111</p>
+<p id='n112' class='stm run hide_run'>112</p>
+<p id='n113' class='stm run hide_run'>113</p>
+<p id='n114' class='stm run hide_run'>114</p>
+<p id='n115' class='pln'>115</p>
+<p id='n116' class='stm run hide_run'>116</p>
+<p id='n117' class='pln'>117</p>
+<p id='n118' class='stm run hide_run'>118</p>
+<p id='n119' class='pln'>119</p>
+<p id='n120' class='stm run hide_run'>120</p>
+<p id='n121' class='pln'>121</p>
+<p id='n122' class='stm run hide_run'>122</p>
+<p id='n123' class='stm run hide_run'>123</p>
+<p id='n124' class='stm run hide_run'>124</p>
+<p id='n125' class='pln'>125</p>
+<p id='n126' class='pln'>126</p>
+<p id='n127' class='stm run hide_run'>127</p>
+<p id='n128' class='stm run hide_run'>128</p>
+<p id='n129' class='pln'>129</p>
+<p id='n130' class='pln'>130</p>
+<p id='n131' class='stm run hide_run'>131</p>
+<p id='n132' class='stm run hide_run'>132</p>
+<p id='n133' class='stm run hide_run'>133</p>
+<p id='n134' class='stm run hide_run'>134</p>
+<p id='n135' class='pln'>135</p>
+<p id='n136' class='stm run hide_run'>136</p>
+<p id='n137' class='stm run hide_run'>137</p>
+<p id='n138' class='pln'>138</p>
+<p id='n139' class='pln'>139</p>
+<p id='n140' class='pln'>140</p>
+<p id='n141' class='pln'>141</p>
+<p id='n142' class='stm run hide_run'>142</p>
+<p id='n143' class='stm run hide_run'>143</p>
+<p id='n144' class='pln'>144</p>
+<p id='n145' class='stm run hide_run'>145</p>
+<p id='n146' class='pln'>146</p>
+<p id='n147' class='stm run hide_run'>147</p>
+<p id='n148' class='stm mis'>148</p>
+<p id='n149' class='pln'>149</p>
+<p id='n150' class='stm run hide_run'>150</p>
+<p id='n151' class='pln'>151</p>
+<p id='n152' class='pln'>152</p>
+<p id='n153' class='stm run hide_run'>153</p>
+<p id='n154' class='stm run hide_run'>154</p>
+<p id='n155' class='stm run hide_run'>155</p>
+<p id='n156' class='stm run hide_run'>156</p>
+<p id='n157' class='stm par run hide_run'>157</p>
+<p id='n158' class='stm run hide_run'>158</p>
+<p id='n159' class='stm run hide_run'>159</p>
+<p id='n160' class='stm run hide_run'>160</p>
+<p id='n161' class='stm run hide_run'>161</p>
+<p id='n162' class='stm run hide_run'>162</p>
+<p id='n163' class='pln'>163</p>
+<p id='n164' class='stm run hide_run'>164</p>
+<p id='n165' class='pln'>165</p>
+<p id='n166' class='pln'>166</p>
+<p id='n167' class='stm run hide_run'>167</p>
+<p id='n168' class='stm run hide_run'>168</p>
+<p id='n169' class='pln'>169</p>
+<p id='n170' class='stm run hide_run'>170</p>
+<p id='n171' class='pln'>171</p>
+<p id='n172' class='pln'>172</p>
+<p id='n173' class='pln'>173</p>
+<p id='n174' class='pln'>174</p>
+<p id='n175' class='pln'>175</p>
+<p id='n176' class='stm mis'>176</p>
+<p id='n177' class='pln'>177</p>
+<p id='n178' class='pln'>178</p>
+<p id='n179' class='stm run hide_run'>179</p>
+<p id='n180' class='pln'>180</p>
+<p id='n181' class='pln'>181</p>
+<p id='n182' class='stm run hide_run'>182</p>
+<p id='n183' class='stm run hide_run'>183</p>
+<p id='n184' class='stm run hide_run'>184</p>
+<p id='n185' class='pln'>185</p>
+<p id='n186' class='stm run hide_run'>186</p>
+<p id='n187' class='stm run hide_run'>187</p>
+<p id='n188' class='stm run hide_run'>188</p>
+<p id='n189' class='stm run hide_run'>189</p>
+<p id='n190' class='stm run hide_run'>190</p>
+<p id='n191' class='pln'>191</p>
+<p id='n192' class='stm run hide_run'>192</p>
+<p id='n193' class='stm run hide_run'>193</p>
+<p id='n194' class='pln'>194</p>
+<p id='n195' class='pln'>195</p>
+<p id='n196' class='stm run hide_run'>196</p>
+<p id='n197' class='pln'>197</p>
+<p id='n198' class='pln'>198</p>
+<p id='n199' class='stm run hide_run'>199</p>
+<p id='n200' class='pln'>200</p>
+<p id='n201' class='stm run hide_run'>201</p>
+<p id='n202' class='stm run hide_run'>202</p>
+<p id='n203' class='stm run hide_run'>203</p>
+<p id='n204' class='stm run hide_run'>204</p>
+<p id='n205' class='stm run hide_run'>205</p>
+<p id='n206' class='stm run hide_run'>206</p>
+<p id='n207' class='stm run hide_run'>207</p>
+<p id='n208' class='stm run hide_run'>208</p>
+<p id='n209' class='stm run hide_run'>209</p>
+<p id='n210' class='stm run hide_run'>210</p>
+<p id='n211' class='stm run hide_run'>211</p>
+<p id='n212' class='stm run hide_run'>212</p>
+<p id='n213' class='stm run hide_run'>213</p>
+<p id='n214' class='stm run hide_run'>214</p>
+<p id='n215' class='pln'>215</p>
+<p id='n216' class='stm run hide_run'>216</p>
+<p id='n217' class='pln'>217</p>
+<p id='n218' class='pln'>218</p>
+<p id='n219' class='stm mis'>219</p>
+<p id='n220' class='pln'>220</p>
+<p id='n221' class='stm run hide_run'>221</p>
+<p id='n222' class='pln'>222</p>
+<p id='n223' class='pln'>223</p>
+<p id='n224' class='stm mis'>224</p>
+<p id='n225' class='pln'>225</p>
+<p id='n226' class='stm run hide_run'>226</p>
+<p id='n227' class='pln'>227</p>
+<p id='n228' class='pln'>228</p>
+<p id='n229' class='stm mis'>229</p>
+<p id='n230' class='stm mis'>230</p>
+<p id='n231' class='pln'>231</p>
+<p id='n232' class='stm run hide_run'>232</p>
+<p id='n233' class='pln'>233</p>
+<p id='n234' class='stm mis'>234</p>
+<p id='n235' class='stm mis'>235</p>
+<p id='n236' class='stm mis'>236</p>
+<p id='n237' class='stm mis'>237</p>
+<p id='n238' class='pln'>238</p>
+<p id='n239' class='pln'>239</p>
+<p id='n240' class='stm mis'>240</p>
+<p id='n241' class='stm mis'>241</p>
+<p id='n242' class='stm mis'>242</p>
+<p id='n243' class='stm mis'>243</p>
+<p id='n244' class='stm mis'>244</p>
+<p id='n245' class='stm mis'>245</p>
+<p id='n246' class='stm mis'>246</p>
+<p id='n247' class='stm mis'>247</p>
+<p id='n248' class='stm mis'>248</p>
+<p id='n249' class='stm mis'>249</p>
+<p id='n250' class='stm mis'>250</p>
+<p id='n251' class='stm mis'>251</p>
+<p id='n252' class='stm mis'>252</p>
+<p id='n253' class='stm mis'>253</p>
+<p id='n254' class='stm mis'>254</p>
+<p id='n255' class='stm mis'>255</p>
+<p id='n256' class='stm mis'>256</p>
+<p id='n257' class='stm mis'>257</p>
+<p id='n258' class='stm mis'>258</p>
+<p id='n259' class='stm mis'>259</p>
+<p id='n260' class='stm mis'>260</p>
+<p id='n261' class='stm mis'>261</p>
+<p id='n262' class='stm mis'>262</p>
+<p id='n263' class='stm mis'>263</p>
+<p id='n264' class='stm mis'>264</p>
+<p id='n265' class='stm mis'>265</p>
+<p id='n266' class='stm mis'>266</p>
+<p id='n267' class='stm mis'>267</p>
+<p id='n268' class='stm mis'>268</p>
+<p id='n269' class='stm mis'>269</p>
+<p id='n270' class='pln'>270</p>
+<p id='n271' class='pln'>271</p>
+<p id='n272' class='pln'>272</p>
+<p id='n273' class='stm mis'>273</p>
+<p id='n274' class='pln'>274</p>
+<p id='n275' class='stm run hide_run'>275</p>
+<p id='n276' class='pln'>276</p>
+<p id='n277' class='pln'>277</p>
+<p id='n278' class='stm mis'>278</p>
+<p id='n279' class='stm mis'>279</p>
+<p id='n280' class='pln'>280</p>
+<p id='n281' class='stm mis'>281</p>
+<p id='n282' class='stm mis'>282</p>
+<p id='n283' class='pln'>283</p>
+<p id='n284' class='pln'>284</p>
+<p id='n285' class='stm run hide_run'>285</p>
+<p id='n286' class='pln'>286</p>
+<p id='n287' class='pln'>287</p>
+<p id='n288' class='stm run hide_run'>288</p>
+<p id='n289' class='stm run hide_run'>289</p>
+<p id='n290' class='stm run hide_run'>290</p>
+<p id='n291' class='stm run hide_run'>291</p>
+<p id='n292' class='stm run hide_run'>292</p>
+<p id='n293' class='stm run hide_run'>293</p>
+<p id='n294' class='stm run hide_run'>294</p>
+<p id='n295' class='pln'>295</p>
+<p id='n296' class='stm run hide_run'>296</p>
+<p id='n297' class='stm run hide_run'>297</p>
+<p id='n298' class='pln'>298</p>
+<p id='n299' class='stm run hide_run'>299</p>
+<p id='n300' class='pln'>300</p>
+<p id='n301' class='stm run hide_run'>301</p>
+<p id='n302' class='stm mis'>302</p>
+<p id='n303' class='pln'>303</p>
+<p id='n304' class='stm run hide_run'>304</p>
+<p id='n305' class='stm run hide_run'>305</p>
+<p id='n306' class='pln'>306</p>
+<p id='n307' class='stm run hide_run'>307</p>
+<p id='n308' class='stm run hide_run'>308</p>
+<p id='n309' class='pln'>309</p>
+<p id='n310' class='pln'>310</p>
+<p id='n311' class='stm run hide_run'>311</p>
+<p id='n312' class='stm run hide_run'>312</p>
+<p id='n313' class='pln'>313</p>
+<p id='n314' class='stm run hide_run'>314</p>
+<p id='n315' class='pln'>315</p>
+<p id='n316' class='pln'>316</p>
+<p id='n317' class='pln'>317</p>
+<p id='n318' class='stm run hide_run'>318</p>
+<p id='n319' class='stm run hide_run'>319</p>
+<p id='n320' class='stm run hide_run'>320</p>
+<p id='n321' class='pln'>321</p>
+<p id='n322' class='stm run hide_run'>322</p>
+<p id='n323' class='pln'>323</p>
+<p id='n324' class='pln'>324</p>
+<p id='n325' class='pln'>325</p>
+<p id='n326' class='pln'>326</p>
+<p id='n327' class='stm run hide_run'>327</p>
+<p id='n328' class='stm run hide_run'>328</p>
+<p id='n329' class='stm run hide_run'>329</p>
+<p id='n330' class='pln'>330</p>
+<p id='n331' class='stm par run hide_run'>331</p>
+<p id='n332' class='pln'>332</p>
+<p id='n333' class='stm mis'>333</p>
+<p id='n334' class='stm mis'>334</p>
+<p id='n335' class='stm par run hide_run'>335</p>
+<p id='n336' class='pln'>336</p>
+<p id='n337' class='stm mis'>337</p>
+<p id='n338' class='stm mis'>338</p>
+<p id='n339' class='pln'>339</p>
+<p id='n340' class='stm run hide_run'>340</p>
+<p id='n341' class='stm run hide_run'>341</p>
+<p id='n342' class='pln'>342</p>
+<p id='n343' class='stm run hide_run'>343</p>
+<p id='n344' class='pln'>344</p>
+<p id='n345' class='stm run hide_run'>345</p>
+<p id='n346' class='stm run hide_run'>346</p>
+<p id='n347' class='pln'>347</p>
+<p id='n348' class='pln'>348</p>
+<p id='n349' class='stm par run hide_run'>349</p>
+<p id='n350' class='stm run hide_run'>350</p>
+<p id='n351' class='pln'>351</p>
+<p id='n352' class='pln'>352</p>
+<p id='n353' class='stm run hide_run'>353</p>
+<p id='n354' class='pln'>354</p>
+<p id='n355' class='pln'>355</p>
+<p id='n356' class='stm run hide_run'>356</p>
+<p id='n357' class='stm run hide_run'>357</p>
+<p id='n358' class='pln'>358</p>
+<p id='n359' class='stm run hide_run'>359</p>
+<p id='n360' class='stm par run hide_run'>360</p>
+<p id='n361' class='stm mis'>361</p>
+<p id='n362' class='pln'>362</p>
+<p id='n363' class='stm par run hide_run'>363</p>
+<p id='n364' class='stm mis'>364</p>
+<p id='n365' class='pln'>365</p>
+<p id='n366' class='stm run hide_run'>366</p>
+<p id='n367' class='stm run hide_run'>367</p>
+<p id='n368' class='stm run hide_run'>368</p>
+<p id='n369' class='stm run hide_run'>369</p>
+<p id='n370' class='stm par run hide_run'>370</p>
+<p id='n371' class='stm run hide_run'>371</p>
+<p id='n372' class='pln'>372</p>
+<p id='n373' class='pln'>373</p>
+<p id='n374' class='stm run hide_run'>374</p>
+<p id='n375' class='stm run hide_run'>375</p>
+<p id='n376' class='stm run hide_run'>376</p>
+<p id='n377' class='stm run hide_run'>377</p>
+<p id='n378' class='stm run hide_run'>378</p>
+<p id='n379' class='pln'>379</p>
+<p id='n380' class='pln'>380</p>
+<p id='n381' class='pln'>381</p>
+<p id='n382' class='stm run hide_run'>382</p>
+<p id='n383' class='stm run hide_run'>383</p>
+<p id='n384' class='stm run hide_run'>384</p>
+<p id='n385' class='stm run hide_run'>385</p>
+<p id='n386' class='stm run hide_run'>386</p>
+<p id='n387' class='pln'>387</p>
+<p id='n388' class='pln'>388</p>
+<p id='n389' class='stm run hide_run'>389</p>
+<p id='n390' class='stm run hide_run'>390</p>
+<p id='n391' class='pln'>391</p>
+<p id='n392' class='pln'>392</p>
+<p id='n393' class='stm run hide_run'>393</p>
+<p id='n394' class='pln'>394</p>
+<p id='n395' class='pln'>395</p>
+<p id='n396' class='stm run hide_run'>396</p>
+<p id='n397' class='stm par run hide_run'>397</p>
+<p id='n398' class='stm mis'>398</p>
+<p id='n399' class='pln'>399</p>
+<p id='n400' class='stm par run hide_run'>400</p>
+<p id='n401' class='stm mis'>401</p>
+<p id='n402' class='pln'>402</p>
+<p id='n403' class='stm par run hide_run'>403</p>
+<p id='n404' class='stm run hide_run'>404</p>
+<p id='n405' class='stm run hide_run'>405</p>
+<p id='n406' class='stm run hide_run'>406</p>
+<p id='n407' class='stm par run hide_run'>407</p>
+<p id='n408' class='stm mis'>408</p>
+<p id='n409' class='pln'>409</p>
+<p id='n410' class='pln'>410</p>
+<p id='n411' class='pln'>411</p>
+<p id='n412' class='stm par run hide_run'>412</p>
+<p id='n413' class='stm run hide_run'>413</p>
+<p id='n414' class='stm run hide_run'>414</p>
+<p id='n415' class='pln'>415</p>
+<p id='n416' class='stm run hide_run'>416</p>
+<p id='n417' class='pln'>417</p>
+<p id='n418' class='pln'>418</p>
+<p id='n419' class='pln'>419</p>
+<p id='n420' class='stm run hide_run'>420</p>
+<p id='n421' class='stm run hide_run'>421</p>
+<p id='n422' class='stm par run hide_run'>422</p>
+<p id='n423' class='stm mis'>423</p>
+<p id='n424' class='pln'>424</p>
+<p id='n425' class='stm par run hide_run'>425</p>
+<p id='n426' class='stm mis'>426</p>
+<p id='n427' class='pln'>427</p>
+<p id='n428' class='stm run hide_run'>428</p>
+<p id='n429' class='stm run hide_run'>429</p>
+<p id='n430' class='stm run hide_run'>430</p>
+<p id='n431' class='pln'>431</p>
+<p id='n432' class='stm par run hide_run'>432</p>
+<p id='n433' class='pln'>433</p>
+<p id='n434' class='stm mis'>434</p>
+<p id='n435' class='pln'>435</p>
+<p id='n436' class='pln'>436</p>
+<p id='n437' class='pln'>437</p>
+<p id='n438' class='pln'>438</p>
+<p id='n439' class='stm run hide_run'>439</p>
+<p id='n440' class='stm par run hide_run'>440</p>
+<p id='n441' class='stm run hide_run'>441</p>
+<p id='n442' class='stm run hide_run'>442</p>
+<p id='n443' class='stm run hide_run'>443</p>
+<p id='n444' class='stm run hide_run'>444</p>
+<p id='n445' class='stm run hide_run'>445</p>
+<p id='n446' class='stm run hide_run'>446</p>
+<p id='n447' class='pln'>447</p>
+<p id='n448' class='stm run hide_run'>448</p>
+<p id='n449' class='pln'>449</p>
+<p id='n450' class='pln'>450</p>
+<p id='n451' class='stm run hide_run'>451</p>
+<p id='n452' class='stm par run hide_run'>452</p>
+<p id='n453' class='stm mis'>453</p>
+<p id='n454' class='stm mis'>454</p>
+<p id='n455' class='stm mis'>455</p>
+<p id='n456' class='stm mis'>456</p>
+<p id='n457' class='pln'>457</p>
+<p id='n458' class='pln'>458</p>
+<p id='n459' class='stm mis'>459</p>
+<p id='n460' class='pln'>460</p>
+<p id='n461' class='pln'>461</p>
+<p id='n462' class='stm mis'>462</p>
+<p id='n463' class='stm mis'>463</p>
+<p id='n464' class='pln'>464</p>
+<p id='n465' class='pln'>465</p>
+<p id='n466' class='pln'>466</p>
+<p id='n467' class='stm par run hide_run'>467</p>
+<p id='n468' class='stm mis'>468</p>
+<p id='n469' class='pln'>469</p>
+<p id='n470' class='stm par run hide_run'>470</p>
+<p id='n471' class='stm run hide_run'>471</p>
+<p id='n472' class='stm run hide_run'>472</p>
+<p id='n473' class='pln'>473</p>
+<p id='n474' class='stm par run hide_run'>474</p>
+<p id='n475' class='stm mis'>475</p>
+<p id='n476' class='pln'>476</p>
+<p id='n477' class='stm par run hide_run'>477</p>
+<p id='n478' class='stm mis'>478</p>
+<p id='n479' class='stm par run hide_run'>479</p>
+<p id='n480' class='stm mis'>480</p>
+<p id='n481' class='pln'>481</p>
+<p id='n482' class='pln'>482</p>
+<p id='n483' class='pln'>483</p>
+<p id='n484' class='stm run hide_run'>484</p>
+<p id='n485' class='pln'>485</p>
+<p id='n486' class='stm run hide_run'>486</p>
+<p id='n487' class='pln'>487</p>
+<p id='n488' class='pln'>488</p>
+<p id='n489' class='pln'>489</p>
+<p id='n490' class='stm par run hide_run'>490</p>
+<p id='n491' class='pln'>491</p>
+<p id='n492' class='stm mis'>492</p>
+<p id='n493' class='stm mis'>493</p>
+<p id='n494' class='stm run hide_run'>494</p>
+<p id='n495' class='pln'>495</p>
+<p id='n496' class='stm run hide_run'>496</p>
+<p id='n497' class='pln'>497</p>
+<p id='n498' class='pln'>498</p>
+<p id='n499' class='pln'>499</p>
+<p id='n500' class='stm run hide_run'>500</p>
+<p id='n501' class='stm run hide_run'>501</p>
+<p id='n502' class='stm run hide_run'>502</p>
+<p id='n503' class='stm run hide_run'>503</p>
+<p id='n504' class='pln'>504</p>
+<p id='n505' class='stm run hide_run'>505</p>
+<p id='n506' class='pln'>506</p>
+<p id='n507' class='pln'>507</p>
+<p id='n508' class='stm mis'>508</p>
+<p id='n509' class='pln'>509</p>
+<p id='n510' class='stm mis'>510</p>
+<p id='n511' class='pln'>511</p>
+<p id='n512' class='stm mis'>512</p>
+<p id='n513' class='stm mis'>513</p>
+<p id='n514' class='stm mis'>514</p>
+<p id='n515' class='stm mis'>515</p>
+<p id='n516' class='pln'>516</p>
+<p id='n517' class='pln'>517</p>
+<p id='n518' class='stm mis'>518</p>
+<p id='n519' class='stm mis'>519</p>
+<p id='n520' class='stm mis'>520</p>
+<p id='n521' class='stm mis'>521</p>
+<p id='n522' class='pln'>522</p>
+<p id='n523' class='stm run hide_run'>523</p>
+<p id='n524' class='stm mis'>524</p>
+<p id='n525' class='stm mis'>525</p>
+<p id='n526' class='pln'>526</p>
+<p id='n527' class='stm run hide_run'>527</p>
+<p id='n528' class='stm mis'>528</p>
+<p id='n529' class='stm mis'>529</p>
+<p id='n530' class='stm mis'>530</p>
+<p id='n531' class='pln'>531</p>
+<p id='n532' class='stm run hide_run'>532</p>
+<p id='n533' class='stm mis'>533</p>
+<p id='n534' class='stm mis'>534</p>
+<p id='n535' class='pln'>535</p>
+<p id='n536' class='stm run hide_run'>536</p>
+<p id='n537' class='pln'>537</p>
+<p id='n538' class='pln'>538</p>
+<p id='n539' class='pln'>539</p>
+<p id='n540' class='stm mis'>540</p>
+<p id='n541' class='pln'>541</p>
+<p id='n542' class='stm mis'>542</p>
+<p id='n543' class='stm mis'>543</p>
+<p id='n544' class='pln'>544</p>
+<p id='n545' class='pln'>545</p>
+<p id='n546' class='stm mis'>546</p>
+<p id='n547' class='pln'>547</p>
+<p id='n548' class='pln'>548</p>
+<p id='n549' class='pln'>549</p>
+<p id='n550' class='stm mis'>550</p>
+<p id='n551' class='stm mis'>551</p>
+<p id='n552' class='stm mis'>552</p>
+<p id='n553' class='pln'>553</p>
+<p id='n554' class='pln'>554</p>
+<p id='n555' class='stm mis'>555</p>
+<p id='n556' class='stm mis'>556</p>
+<p id='n557' class='stm mis'>557</p>
+<p id='n558' class='pln'>558</p>
+<p id='n559' class='pln'>559</p>
+<p id='n560' class='stm mis'>560</p>
+<p id='n561' class='stm mis'>561</p>
+<p id='n562' class='pln'>562</p>
+<p id='n563' class='stm mis'>563</p>
+<p id='n564' class='stm mis'>564</p>
+<p id='n565' class='stm mis'>565</p>
+<p id='n566' class='stm mis'>566</p>
+<p id='n567' class='stm mis'>567</p>
+<p id='n568' class='stm mis'>568</p>
+<p id='n569' class='stm mis'>569</p>
+<p id='n570' class='stm mis'>570</p>
+<p id='n571' class='stm mis'>571</p>
+<p id='n572' class='pln'>572</p>
+<p id='n573' class='pln'>573</p>
+<p id='n574' class='pln'>574</p>
+<p id='n575' class='pln'>575</p>
+<p id='n576' class='pln'>576</p>
+<p id='n577' class='stm mis'>577</p>
+<p id='n578' class='stm mis'>578</p>
+<p id='n579' class='pln'>579</p>
+<p id='n580' class='stm mis'>580</p>
+<p id='n581' class='pln'>581</p>
+<p id='n582' class='stm mis'>582</p>
+<p id='n583' class='pln'>583</p>
+<p id='n584' class='stm run hide_run'>584</p>
+<p id='n585' class='pln'>585</p>
+<p id='n586' class='pln'>586</p>
+<p id='n587' class='stm mis'>587</p>
+<p id='n588' class='stm mis'>588</p>
+<p id='n589' class='stm mis'>589</p>
+<p id='n590' class='stm mis'>590</p>
+<p id='n591' class='pln'>591</p>
+<p id='n592' class='stm mis'>592</p>
+<p id='n593' class='stm mis'>593</p>
+<p id='n594' class='stm mis'>594</p>
+<p id='n595' class='pln'>595</p>
+<p id='n596' class='stm mis'>596</p>
+<p id='n597' class='stm mis'>597</p>
+<p id='n598' class='stm mis'>598</p>
+<p id='n599' class='stm mis'>599</p>
+<p id='n600' class='pln'>600</p>
+<p id='n601' class='stm run hide_run'>601</p>
+<p id='n602' class='pln'>602</p>
+<p id='n603' class='pln'>603</p>
+<p id='n604' class='stm mis'>604</p>
+<p id='n605' class='stm mis'>605</p>
+<p id='n606' class='pln'>606</p>
+<p id='n607' class='stm mis'>607</p>
+<p id='n608' class='stm mis'>608</p>
+<p id='n609' class='pln'>609</p>
+<p id='n610' class='stm mis'>610</p>
+<p id='n611' class='stm mis'>611</p>
+<p id='n612' class='stm mis'>612</p>
+<p id='n613' class='stm mis'>613</p>
+<p id='n614' class='pln'>614</p>
+<p id='n615' class='stm mis'>615</p>
+<p id='n616' class='pln'>616</p>
+<p id='n617' class='stm mis'>617</p>
+<p id='n618' class='pln'>618</p>
+<p id='n619' class='stm run hide_run'>619</p>
+<p id='n620' class='pln'>620</p>
+<p id='n621' class='pln'>621</p>
+<p id='n622' class='pln'>622</p>
+<p id='n623' class='pln'>623</p>
+<p id='n624' class='stm mis'>624</p>
+<p id='n625' class='pln'>625</p>
+<p id='n626' class='pln'>626</p>
+<p id='n627' class='stm mis'>627</p>
+<p id='n628' class='stm mis'>628</p>
+<p id='n629' class='stm mis'>629</p>
+<p id='n630' class='pln'>630</p>
+<p id='n631' class='stm mis'>631</p>
+<p id='n632' class='stm mis'>632</p>
+<p id='n633' class='pln'>633</p>
+<p id='n634' class='stm mis'>634</p>
+<p id='n635' class='stm mis'>635</p>
+<p id='n636' class='stm mis'>636</p>
+<p id='n637' class='pln'>637</p>
+<p id='n638' class='stm mis'>638</p>
+<p id='n639' class='stm mis'>639</p>
+<p id='n640' class='stm mis'>640</p>
+<p id='n641' class='pln'>641</p>
+<p id='n642' class='stm mis'>642</p>
+<p id='n643' class='pln'>643</p>
+<p id='n644' class='stm run hide_run'>644</p>
+<p id='n645' class='pln'>645</p>
+<p id='n646' class='pln'>646</p>
+<p id='n647' class='pln'>647</p>
+<p id='n648' class='stm mis'>648</p>
+<p id='n649' class='stm mis'>649</p>
+<p id='n650' class='stm mis'>650</p>
+<p id='n651' class='stm mis'>651</p>
+<p id='n652' class='stm mis'>652</p>
+<p id='n653' class='stm mis'>653</p>
+<p id='n654' class='stm mis'>654</p>
+<p id='n655' class='stm mis'>655</p>
+<p id='n656' class='stm mis'>656</p>
+<p id='n657' class='stm mis'>657</p>
+<p id='n658' class='stm mis'>658</p>
+<p id='n659' class='stm mis'>659</p>
+<p id='n660' class='stm mis'>660</p>
+<p id='n661' class='stm mis'>661</p>
+<p id='n662' class='stm mis'>662</p>
+<p id='n663' class='stm mis'>663</p>
+<p id='n664' class='pln'>664</p>
+<p id='n665' class='pln'>665</p>
+<p id='n666' class='pln'>666</p>
+<p id='n667' class='pln'>667</p>
+<p id='n668' class='pln'>668</p>
+<p id='n669' class='pln'>669</p>
+<p id='n670' class='pln'>670</p>
+<p id='n671' class='pln'>671</p>
+<p id='n672' class='pln'>672</p>
+<p id='n673' class='pln'>673</p>
+<p id='n674' class='pln'>674</p>
+<p id='n675' class='pln'>675</p>
+<p id='n676' class='pln'>676</p>
+<p id='n677' class='pln'>677</p>
+<p id='n678' class='pln'>678</p>
+<p id='n679' class='pln'>679</p>
+<p id='n680' class='pln'>680</p>
+<p id='n681' class='pln'>681</p>
+<p id='n682' class='pln'>682</p>
+<p id='n683' class='pln'>683</p>
+<p id='n684' class='pln'>684</p>
+<p id='n685' class='pln'>685</p>
+<p id='n686' class='pln'>686</p>
+<p id='n687' class='pln'>687</p>
+<p id='n688' class='pln'>688</p>
+<p id='n689' class='pln'>689</p>
+<p id='n690' class='pln'>690</p>
+<p id='n691' class='pln'>691</p>
+<p id='n692' class='pln'>692</p>
+<p id='n693' class='pln'>693</p>
+<p id='n694' class='pln'>694</p>
+<p id='n695' class='pln'>695</p>
+<p id='n696' class='pln'>696</p>
+<p id='n697' class='pln'>697</p>
+<p id='n698' class='pln'>698</p>
+<p id='n699' class='pln'>699</p>
+<p id='n700' class='pln'>700</p>
+<p id='n701' class='pln'>701</p>
+<p id='n702' class='pln'>702</p>
+<p id='n703' class='pln'>703</p>
+<p id='n704' class='pln'>704</p>
+<p id='n705' class='pln'>705</p>
+<p id='n706' class='pln'>706</p>
+<p id='n707' class='pln'>707</p>
+<p id='n708' class='pln'>708</p>
+<p id='n709' class='pln'>709</p>
+
+ </td>
+ <td class='text' valign='top'>
+<p id='t1' class='pln'><span class='str'>""" Cog code generation tool.</span><span class='strut'> </span></p>
+<p id='t2' class='pln'><span class='str'> http://nedbatchelder.com/code/cog</span><span class='strut'> </span></p>
+<p id='t3' class='pln'><span class='str'> </span><span class='strut'> </span></p>
+<p id='t4' class='pln'><span class='str'> Copyright 2004-2009, Ned Batchelder.</span><span class='strut'> </span></p>
+<p id='t5' class='pln'><span class='str'>"""</span><span class='strut'> </span></p>
+<p id='t6' class='pln'><span class='strut'> </span></p>
+<p id='t7' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>copy</span><span class='op'>,</span> <span class='nam'>getopt</span><span class='op'>,</span> <span class='nam'>imp</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>,</span> <span class='nam'>re</span><span class='op'>,</span> <span class='nam'>shlex</span><span class='op'>,</span> <span class='nam'>string</span><span class='op'>,</span> <span class='nam'>sys</span><span class='op'>,</span> <span class='nam'>traceback</span><span class='strut'> </span></p>
+<p id='t8' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>cStringIO</span> <span class='key'>import</span> <span class='nam'>StringIO</span><span class='strut'> </span></p>
+<p id='t9' class='pln'><span class='strut'> </span></p>
+<p id='t10' class='pln'><span class='com'># The recommended way to compute md5's changed in Python 2.5</span><span class='strut'> </span></p>
+<p id='t11' class='stm run hide_run'><span class='key'>try</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t12' class='stm run hide_run'> <span class='key'>import</span> <span class='nam'>hashlib</span><span class='strut'> </span></p>
+<p id='t13' class='stm run hide_run'> <span class='nam'>hash_factory</span> <span class='op'>=</span> <span class='nam'>hashlib</span><span class='op'>.</span><span class='nam'>md5</span><span class='strut'> </span></p>
+<p id='t14' class='stm mis'><span class='key'>except</span> <span class='nam'>ImportError</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t15' class='stm mis'> <span class='key'>import</span> <span class='nam'>md5</span><span class='strut'> </span></p>
+<p id='t16' class='stm mis'> <span class='nam'>hash_factory</span> <span class='op'>=</span> <span class='nam'>md5</span><span class='op'>.</span><span class='nam'>new</span><span class='strut'> </span></p>
+<p id='t17' class='pln'><span class='strut'> </span></p>
+<p id='t18' class='stm run hide_run'><span class='nam'>__all__</span> <span class='op'>=</span> <span class='op'>[</span><span class='str'>'Cog'</span><span class='op'>,</span> <span class='str'>'CogUsageError'</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t19' class='pln'><span class='strut'> </span></p>
+<p id='t20' class='stm run hide_run'><span class='nam'>__version__</span> <span class='op'>=</span> <span class='str'>'2.2'</span> <span class='com'># History at the end of the file.</span><span class='strut'> </span></p>
+<p id='t21' class='pln'><span class='strut'> </span></p>
+<p id='t22' class='stm run hide_run'><span class='nam'>usage</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t23' class='pln'><span class='str'>cog - generate code with inlined Python code.</span><span class='strut'> </span></p>
+<p id='t24' class='pln'><span class='strut'> </span></p>
+<p id='t25' class='pln'><span class='str'>cog [OPTIONS] [INFILE | @FILELIST] ...</span><span class='strut'> </span></p>
+<p id='t26' class='pln'><span class='strut'> </span></p>
+<p id='t27' class='pln'><span class='str'>INFILE is the name of an input file.</span><span class='strut'> </span></p>
+<p id='t28' class='pln'><span class='str'>FILELIST is the name of a text file containing file names or</span><span class='strut'> </span></p>
+<p id='t29' class='pln'><span class='str'> other @FILELISTs.</span><span class='strut'> </span></p>
+<p id='t30' class='pln'><span class='strut'> </span></p>
+<p id='t31' class='pln'><span class='str'>OPTIONS:</span><span class='strut'> </span></p>
+<p id='t32' class='pln'><span class='str'> -c Checksum the output to protect it against accidental change.</span><span class='strut'> </span></p>
+<p id='t33' class='pln'><span class='str'> -d Delete the generator code from the output file.</span><span class='strut'> </span></p>
+<p id='t34' class='pln'><span class='str'> -D name=val Define a global string available to your generator code.</span><span class='strut'> </span></p>
+<p id='t35' class='pln'><span class='str'> -e Warn if a file has no cog code in it.</span><span class='strut'> </span></p>
+<p id='t36' class='pln'><span class='str'> -I PATH Add PATH to the list of directories for data files and modules.</span><span class='strut'> </span></p>
+<p id='t37' class='pln'><span class='str'> -o OUTNAME Write the output to OUTNAME.</span><span class='strut'> </span></p>
+<p id='t38' class='pln'><span class='str'> -r Replace the input file with the output.</span><span class='strut'> </span></p>
+<p id='t39' class='pln'><span class='str'> -s STRING Suffix all generated output lines with STRING.</span><span class='strut'> </span></p>
+<p id='t40' class='pln'><span class='str'> -U Write the output with Unix newlines (only LF line-endings).</span><span class='strut'> </span></p>
+<p id='t41' class='pln'><span class='str'> -w CMD Use CMD if the output file needs to be made writable.</span><span class='strut'> </span></p>
+<p id='t42' class='pln'><span class='str'> A %s in the CMD will be filled with the filename.</span><span class='strut'> </span></p>
+<p id='t43' class='pln'><span class='str'> -x Excise all the generated output without running the generators.</span><span class='strut'> </span></p>
+<p id='t44' class='pln'><span class='str'> -z The [[[end]]] marker can be omitted, and is assumed at eof.</span><span class='strut'> </span></p>
+<p id='t45' class='pln'><span class='str'> -v Print the version of cog and exit.</span><span class='strut'> </span></p>
+<p id='t46' class='pln'><span class='str'> -h Print this help.</span><span class='strut'> </span></p>
+<p id='t47' class='pln'><span class='str'>"""</span><span class='strut'> </span></p>
+<p id='t48' class='pln'><span class='strut'> </span></p>
+<p id='t49' class='pln'><span class='com'># Other package modules</span><span class='strut'> </span></p>
+<p id='t50' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>whiteutils</span> <span class='key'>import</span> <span class='op'>*</span><span class='strut'> </span></p>
+<p id='t51' class='pln'><span class='strut'> </span></p>
+<p id='t52' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='nam'>Exception</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t53' class='pln'> <span class='str'>""" Any exception raised by Cog.</span><span class='strut'> </span></p>
+<p id='t54' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t55' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>,</span> <span class='nam'>file</span><span class='op'>=</span><span class='str'>''</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='num'>0</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t56' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>59</span> <span class='key'>if</span> <span class='nam'>file</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t57' class='stm run hide_run'> <span class='nam'>Exception</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>"%s(%d): %s"</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>file</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t58' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t59' class='stm mis'> <span class='nam'>Exception</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t60' class='pln'><span class='strut'> </span></p>
+<p id='t61' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>CogUsageError</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t62' class='pln'> <span class='str'>""" An error in usage of command-line arguments in cog.</span><span class='strut'> </span></p>
+<p id='t63' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t64' class='exc'> <span class='key'>pass</span> <span class='com'>#pragma: no cover</span><span class='strut'> </span></p>
+<p id='t65' class='pln'><span class='strut'> </span></p>
+<p id='t66' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>CogInternalError</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t67' class='pln'> <span class='str'>""" An error in the coding of Cog. Should never happen.</span><span class='strut'> </span></p>
+<p id='t68' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t69' class='exc'> <span class='key'>pass</span> <span class='com'>#pragma: no cover</span><span class='strut'> </span></p>
+<p id='t70' class='pln'><span class='strut'> </span></p>
+<p id='t71' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>CogGeneratedError</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t72' class='pln'> <span class='str'>""" An error raised by a user's cog generator.</span><span class='strut'> </span></p>
+<p id='t73' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t74' class='exc'> <span class='key'>pass</span> <span class='com'>#pragma: no cover</span><span class='strut'> </span></p>
+<p id='t75' class='pln'><span class='strut'> </span></p>
+<p id='t76' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>Redirectable</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t77' class='pln'> <span class='str'>""" An object with its own stdout and stderr files.</span><span class='strut'> </span></p>
+<p id='t78' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t79' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t80' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span> <span class='op'>=</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>stdout</span><span class='strut'> </span></p>
+<p id='t81' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>stderr</span> <span class='op'>=</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>stderr</span><span class='strut'> </span></p>
+<p id='t82' class='pln'><span class='strut'> </span></p>
+<p id='t83' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>setOutput</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>stdout</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>stderr</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t84' class='pln'> <span class='str'>""" Assign new files for standard out and/or standard error.</span><span class='strut'> </span></p>
+<p id='t85' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t86' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>88</span> <span class='key'>if</span> <span class='nam'>stdout</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t87' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span> <span class='op'>=</span> <span class='nam'>stdout</span><span class='strut'> </span></p>
+<p id='t88' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>89</span> <span class='key'>if</span> <span class='nam'>stderr</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t89' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>stderr</span> <span class='op'>=</span> <span class='nam'>stderr</span><span class='strut'> </span></p>
+<p id='t90' class='pln'><span class='strut'> </span></p>
+<p id='t91' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>CogGenerator</span><span class='op'>(</span><span class='nam'>Redirectable</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t92' class='pln'> <span class='str'>""" A generator pulled from a source file.</span><span class='strut'> </span></p>
+<p id='t93' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t94' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t95' class='stm run hide_run'> <span class='nam'>Redirectable</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t96' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>markers</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t97' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t98' class='pln'><span class='strut'> </span></p>
+<p id='t99' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>parseMarker</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t100' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>markers</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t101' class='pln'><span class='strut'> </span></p>
+<p id='t102' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>parseLine</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t103' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>.</span><span class='nam'>strip</span><span class='op'>(</span><span class='str'>'\n'</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t104' class='pln'><span class='strut'> </span></p>
+<p id='t105' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>getCode</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t106' class='pln'> <span class='str'>""" Extract the executable Python code from the generator.</span><span class='strut'> </span></p>
+<p id='t107' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t108' class='pln'> <span class='com'># If the markers and lines all have the same prefix</span><span class='strut'> </span></p>
+<p id='t109' class='pln'> <span class='com'># (end-of-line comment chars, for example),</span><span class='strut'> </span></p>
+<p id='t110' class='pln'> <span class='com'># then remove it from all the lines.</span><span class='strut'> </span></p>
+<p id='t111' class='stm run hide_run'> <span class='nam'>prefIn</span> <span class='op'>=</span> <span class='nam'>commonPrefix</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>markers</span> <span class='op'>+</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t112' class='stm run hide_run'> <span class='key'>if</span> <span class='nam'>prefIn</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t113' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>markers</span> <span class='op'>=</span> <span class='op'>[</span> <span class='nam'>l</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='nam'>prefIn</span><span class='op'>,</span> <span class='str'>''</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span> <span class='key'>for</span> <span class='nam'>l</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>markers</span> <span class='op'>]</span><span class='strut'> </span></p>
+<p id='t114' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines</span> <span class='op'>=</span> <span class='op'>[</span> <span class='nam'>l</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='nam'>prefIn</span><span class='op'>,</span> <span class='str'>''</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span> <span class='key'>for</span> <span class='nam'>l</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines</span> <span class='op'>]</span><span class='strut'> </span></p>
+<p id='t115' class='pln'><span class='strut'> </span></p>
+<p id='t116' class='stm run hide_run'> <span class='key'>return</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines</span><span class='op'>,</span> <span class='str'>''</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t117' class='pln'><span class='strut'> </span></p>
+<p id='t118' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>evaluate</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>cog</span><span class='op'>,</span> <span class='nam'>globals</span><span class='op'>,</span> <span class='nam'>fname</span><span class='op'>=</span><span class='str'>'cog generator'</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t119' class='pln'> <span class='com'># figure out the right whitespace prefix for the output</span><span class='strut'> </span></p>
+<p id='t120' class='stm run hide_run'> <span class='nam'>prefOut</span> <span class='op'>=</span> <span class='nam'>whitePrefix</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>markers</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t121' class='pln'><span class='strut'> </span></p>
+<p id='t122' class='stm run hide_run'> <span class='nam'>intext</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>getCode</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t123' class='stm run hide_run'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>intext</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t124' class='stm run hide_run'> <span class='key'>return</span> <span class='str'>''</span><span class='strut'> </span></p>
+<p id='t125' class='pln'><span class='strut'> </span></p>
+<p id='t126' class='pln'> <span class='com'># In Python 2.2, the last line has to end in a newline.</span><span class='strut'> </span></p>
+<p id='t127' class='stm run hide_run'> <span class='nam'>intext</span> <span class='op'>=</span> <span class='str'>"import cog\n"</span> <span class='op'>+</span> <span class='nam'>intext</span> <span class='op'>+</span> <span class='str'>"\n"</span><span class='strut'> </span></p>
+<p id='t128' class='stm run hide_run'> <span class='nam'>code</span> <span class='op'>=</span> <span class='nam'>compile</span><span class='op'>(</span><span class='nam'>intext</span><span class='op'>,</span> <span class='nam'>str</span><span class='op'>(</span><span class='nam'>fname</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'exec'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t129' class='pln'><span class='strut'> </span></p>
+<p id='t130' class='pln'> <span class='com'># Make sure the "cog" module has our state.</span><span class='strut'> </span></p>
+<p id='t131' class='stm run hide_run'> <span class='nam'>cog</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>msg</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>msg</span><span class='strut'> </span></p>
+<p id='t132' class='stm run hide_run'> <span class='nam'>cog</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>out</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>out</span><span class='strut'> </span></p>
+<p id='t133' class='stm run hide_run'> <span class='nam'>cog</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>outl</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>outl</span><span class='strut'> </span></p>
+<p id='t134' class='stm run hide_run'> <span class='nam'>cog</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>error</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>error</span><span class='strut'> </span></p>
+<p id='t135' class='pln'><span class='strut'> </span></p>
+<p id='t136' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>outstring</span> <span class='op'>=</span> <span class='str'>''</span><span class='strut'> </span></p>
+<p id='t137' class='stm run hide_run'> <span class='nam'>eval</span><span class='op'>(</span><span class='nam'>code</span><span class='op'>,</span> <span class='nam'>globals</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t138' class='pln'><span class='strut'> </span></p>
+<p id='t139' class='pln'> <span class='com'># We need to make sure that the last line in the output</span><span class='strut'> </span></p>
+<p id='t140' class='pln'> <span class='com'># ends with a newline, or it will be joined to the</span><span class='strut'> </span></p>
+<p id='t141' class='pln'> <span class='com'># end-output line, ruining cog's idempotency.</span><span class='strut'> </span></p>
+<p id='t142' class='stm run hide_run'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>outstring</span> <span class='key'>and</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>outstring</span><span class='op'>[</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span> <span class='op'>!=</span> <span class='str'>'\n'</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t143' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>outstring</span> <span class='op'>+=</span> <span class='str'>'\n'</span><span class='strut'> </span></p>
+<p id='t144' class='pln'><span class='strut'> </span></p>
+<p id='t145' class='stm run hide_run'> <span class='key'>return</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>outstring</span><span class='op'>,</span> <span class='nam'>prefOut</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t146' class='pln'><span class='strut'> </span></p>
+<p id='t147' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>msg</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>s</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t148' class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span><span class='op'>,</span> <span class='str'>"Message: "</span><span class='op'>+</span><span class='nam'>s</span><span class='strut'> </span></p>
+<p id='t149' class='pln'><span class='strut'> </span></p>
+<p id='t150' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>out</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>sOut</span><span class='op'>=</span><span class='str'>''</span><span class='op'>,</span> <span class='nam'>dedent</span><span class='op'>=</span><span class='nam'>False</span><span class='op'>,</span> <span class='nam'>trimblanklines</span><span class='op'>=</span><span class='nam'>False</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t151' class='pln'> <span class='str'>""" The cog.out function.</span><span class='strut'> </span></p>
+<p id='t152' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t153' class='stm run hide_run'> <span class='key'>if</span> <span class='nam'>trimblanklines</span> <span class='key'>and</span> <span class='op'>(</span><span class='str'>'\n'</span> <span class='key'>in</span> <span class='nam'>sOut</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t154' class='stm run hide_run'> <span class='nam'>lines</span> <span class='op'>=</span> <span class='nam'>sOut</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>'\n'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t155' class='stm run hide_run'> <span class='key'>if</span> <span class='nam'>lines</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>strip</span><span class='op'>(</span><span class='op'>)</span> <span class='op'>==</span> <span class='str'>''</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t156' class='stm run hide_run'> <span class='key'>del</span> <span class='nam'>lines</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t157' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>159</span> <span class='key'>if</span> <span class='nam'>lines</span> <span class='key'>and</span> <span class='nam'>lines</span><span class='op'>[</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>strip</span><span class='op'>(</span><span class='op'>)</span> <span class='op'>==</span> <span class='str'>''</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t158' class='stm run hide_run'> <span class='key'>del</span> <span class='nam'>lines</span><span class='op'>[</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t159' class='stm run hide_run'> <span class='nam'>sOut</span> <span class='op'>=</span> <span class='str'>'\n'</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>lines</span><span class='op'>)</span><span class='op'>+</span><span class='str'>'\n'</span><span class='strut'> </span></p>
+<p id='t160' class='stm run hide_run'> <span class='key'>if</span> <span class='nam'>dedent</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t161' class='stm run hide_run'> <span class='nam'>sOut</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>sOut</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t162' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>outstring</span> <span class='op'>+=</span> <span class='nam'>sOut</span><span class='strut'> </span></p>
+<p id='t163' class='pln'><span class='strut'> </span></p>
+<p id='t164' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>outl</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>sOut</span><span class='op'>=</span><span class='str'>''</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kw</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t165' class='pln'> <span class='str'>""" The cog.outl function.</span><span class='strut'> </span></p>
+<p id='t166' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t167' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>out</span><span class='op'>(</span><span class='nam'>sOut</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kw</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t168' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>out</span><span class='op'>(</span><span class='str'>'\n'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t169' class='pln'><span class='strut'> </span></p>
+<p id='t170' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>error</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>=</span><span class='str'>'Error raised by cog generator.'</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t171' class='pln'> <span class='str'>""" The cog.error function.</span><span class='strut'> </span></p>
+<p id='t172' class='pln'><span class='str'> Instead of raising standard python errors, cog generators can use</span><span class='strut'> </span></p>
+<p id='t173' class='pln'><span class='str'> this function. It will display the error without a scary Python</span><span class='strut'> </span></p>
+<p id='t174' class='pln'><span class='str'> traceback.</span><span class='strut'> </span></p>
+<p id='t175' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t176' class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogGeneratedError</span><span class='op'>(</span><span class='nam'>msg</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t177' class='pln'><span class='strut'> </span></p>
+<p id='t178' class='pln'><span class='strut'> </span></p>
+<p id='t179' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>NumberedFileReader</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t180' class='pln'> <span class='str'>""" A decorator for files that counts the readline()'s called.</span><span class='strut'> </span></p>
+<p id='t181' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t182' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>f</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t183' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>f</span> <span class='op'>=</span> <span class='nam'>f</span><span class='strut'> </span></p>
+<p id='t184' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>n</span> <span class='op'>=</span> <span class='num'>0</span><span class='strut'> </span></p>
+<p id='t185' class='pln'><span class='strut'> </span></p>
+<p id='t186' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>readline</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t187' class='stm run hide_run'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>f</span><span class='op'>.</span><span class='nam'>readline</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t188' class='stm run hide_run'> <span class='key'>if</span> <span class='nam'>l</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t189' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>n</span> <span class='op'>+=</span> <span class='num'>1</span><span class='strut'> </span></p>
+<p id='t190' class='stm run hide_run'> <span class='key'>return</span> <span class='nam'>l</span><span class='strut'> </span></p>
+<p id='t191' class='pln'><span class='strut'> </span></p>
+<p id='t192' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>linenumber</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t193' class='stm run hide_run'> <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>n</span><span class='strut'> </span></p>
+<p id='t194' class='pln'><span class='strut'> </span></p>
+<p id='t195' class='pln'><span class='strut'> </span></p>
+<p id='t196' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>CogOptions</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t197' class='pln'> <span class='str'>""" Options for a run of cog.</span><span class='strut'> </span></p>
+<p id='t198' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t199' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t200' class='pln'> <span class='com'># Defaults for argument values.</span><span class='strut'> </span></p>
+<p id='t201' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>args</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t202' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>includePath</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t203' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>defines</span> <span class='op'>=</span> <span class='op'>{</span><span class='op'>}</span><span class='strut'> </span></p>
+<p id='t204' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bShowVersion</span> <span class='op'>=</span> <span class='nam'>False</span><span class='strut'> </span></p>
+<p id='t205' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sMakeWritableCmd</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'> </span></p>
+<p id='t206' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bReplace</span> <span class='op'>=</span> <span class='nam'>False</span><span class='strut'> </span></p>
+<p id='t207' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bNoGenerate</span> <span class='op'>=</span> <span class='nam'>False</span><span class='strut'> </span></p>
+<p id='t208' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sOutputName</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'> </span></p>
+<p id='t209' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bWarnEmpty</span> <span class='op'>=</span> <span class='nam'>False</span><span class='strut'> </span></p>
+<p id='t210' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bHashOutput</span> <span class='op'>=</span> <span class='nam'>False</span><span class='strut'> </span></p>
+<p id='t211' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bDeleteCode</span> <span class='op'>=</span> <span class='nam'>False</span><span class='strut'> </span></p>
+<p id='t212' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bEofCanBeEnd</span> <span class='op'>=</span> <span class='nam'>False</span><span class='strut'> </span></p>
+<p id='t213' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sSuffix</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'> </span></p>
+<p id='t214' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bNewlines</span> <span class='op'>=</span> <span class='nam'>False</span><span class='strut'> </span></p>
+<p id='t215' class='pln'><span class='strut'> </span></p>
+<p id='t216' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>__cmp__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>other</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t217' class='pln'> <span class='str'>""" Comparison operator for tests to use.</span><span class='strut'> </span></p>
+<p id='t218' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t219' class='stm mis'> <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>__dict__</span><span class='op'>.</span><span class='nam'>__cmp__</span><span class='op'>(</span><span class='nam'>other</span><span class='op'>.</span><span class='nam'>__dict__</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t220' class='pln'><span class='strut'> </span></p>
+<p id='t221' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>clone</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t222' class='pln'> <span class='str'>""" Make a clone of these options, for further refinement.</span><span class='strut'> </span></p>
+<p id='t223' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t224' class='stm mis'> <span class='key'>return</span> <span class='nam'>copy</span><span class='op'>.</span><span class='nam'>deepcopy</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t225' class='pln'><span class='strut'> </span></p>
+<p id='t226' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>addToIncludePath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>dirs</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t227' class='pln'> <span class='str'>""" Add directories to the include path.</span><span class='strut'> </span></p>
+<p id='t228' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t229' class='stm mis'> <span class='nam'>dirs</span> <span class='op'>=</span> <span class='nam'>dirs</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>pathsep</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t230' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>includePath</span><span class='op'>.</span><span class='nam'>extend</span><span class='op'>(</span><span class='nam'>dirs</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t231' class='pln'><span class='strut'> </span></p>
+<p id='t232' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>parseArgs</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>argv</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t233' class='pln'> <span class='com'># Parse the command line arguments.</span><span class='strut'> </span></p>
+<p id='t234' class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t235' class='stm mis'> <span class='nam'>opts</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>args</span> <span class='op'>=</span> <span class='nam'>getopt</span><span class='op'>.</span><span class='nam'>getopt</span><span class='op'>(</span><span class='nam'>argv</span><span class='op'>,</span> <span class='str'>'cdD:eI:o:rs:Uvw:xz'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t236' class='stm mis'> <span class='key'>except</span> <span class='nam'>getopt</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t237' class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogUsageError</span><span class='op'>(</span><span class='nam'>msg</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t238' class='pln'><span class='strut'> </span></p>
+<p id='t239' class='pln'> <span class='com'># Handle the command line arguments.</span><span class='strut'> </span></p>
+<p id='t240' class='stm mis'> <span class='key'>for</span> <span class='nam'>o</span><span class='op'>,</span> <span class='nam'>a</span> <span class='key'>in</span> <span class='nam'>opts</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t241' class='stm mis'> <span class='key'>if</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-c'</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t242' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bHashOutput</span> <span class='op'>=</span> <span class='nam'>True</span><span class='strut'> </span></p>
+<p id='t243' class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-d'</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t244' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bDeleteCode</span> <span class='op'>=</span> <span class='nam'>True</span><span class='strut'> </span></p>
+<p id='t245' class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-D'</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t246' class='stm mis'> <span class='key'>if</span> <span class='nam'>a</span><span class='op'>.</span><span class='nam'>count</span><span class='op'>(</span><span class='str'>'='</span><span class='op'>)</span> <span class='op'><</span> <span class='num'>1</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t247' class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogUsageError</span><span class='op'>(</span><span class='str'>"-D takes a name=value argument"</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t248' class='stm mis'> <span class='nam'>name</span><span class='op'>,</span> <span class='nam'>value</span> <span class='op'>=</span> <span class='nam'>a</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>'='</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t249' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>defines</span><span class='op'>[</span><span class='nam'>name</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>value</span><span class='strut'> </span></p>
+<p id='t250' class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-e'</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t251' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bWarnEmpty</span> <span class='op'>=</span> <span class='nam'>True</span><span class='strut'> </span></p>
+<p id='t252' class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-I'</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t253' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>addToIncludePath</span><span class='op'>(</span><span class='nam'>a</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t254' class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-o'</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t255' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sOutputName</span> <span class='op'>=</span> <span class='nam'>a</span><span class='strut'> </span></p>
+<p id='t256' class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-r'</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t257' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bReplace</span> <span class='op'>=</span> <span class='nam'>True</span><span class='strut'> </span></p>
+<p id='t258' class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-s'</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t259' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sSuffix</span> <span class='op'>=</span> <span class='nam'>a</span><span class='strut'> </span></p>
+<p id='t260' class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-U'</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t261' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bNewlines</span> <span class='op'>=</span> <span class='nam'>True</span><span class='strut'> </span></p>
+<p id='t262' class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-v'</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t263' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bShowVersion</span> <span class='op'>=</span> <span class='nam'>True</span><span class='strut'> </span></p>
+<p id='t264' class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-w'</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t265' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sMakeWritableCmd</span> <span class='op'>=</span> <span class='nam'>a</span><span class='strut'> </span></p>
+<p id='t266' class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-x'</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t267' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bNoGenerate</span> <span class='op'>=</span> <span class='nam'>True</span><span class='strut'> </span></p>
+<p id='t268' class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-z'</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t269' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bEofCanBeEnd</span> <span class='op'>=</span> <span class='nam'>True</span><span class='strut'> </span></p>
+<p id='t270' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t271' class='pln'> <span class='com'># Since getopt.getopt is given a list of possible flags,</span><span class='strut'> </span></p>
+<p id='t272' class='pln'> <span class='com'># this is an internal error.</span><span class='strut'> </span></p>
+<p id='t273' class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogInternalError</span><span class='op'>(</span><span class='str'>"Don't understand argument %s"</span> <span class='op'>%</span> <span class='nam'>o</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t274' class='pln'><span class='strut'> </span></p>
+<p id='t275' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>validate</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t276' class='pln'> <span class='str'>""" Does nothing if everything is OK, raises CogError's if it's not.</span><span class='strut'> </span></p>
+<p id='t277' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t278' class='stm mis'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bReplace</span> <span class='key'>and</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bDeleteCode</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t279' class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogUsageError</span><span class='op'>(</span><span class='str'>"Can't use -d with -r (or you would delete all your source!)"</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t280' class='pln'><span class='strut'> </span></p>
+<p id='t281' class='stm mis'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bReplace</span> <span class='key'>and</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sOutputName</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t282' class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogUsageError</span><span class='op'>(</span><span class='str'>"Can't use -o with -r (they are opposites)"</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t283' class='pln'><span class='strut'> </span></p>
+<p id='t284' class='pln'><span class='strut'> </span></p>
+<p id='t285' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>Cog</span><span class='op'>(</span><span class='nam'>Redirectable</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t286' class='pln'> <span class='str'>""" The Cog engine.</span><span class='strut'> </span></p>
+<p id='t287' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t288' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t289' class='stm run hide_run'> <span class='nam'>Redirectable</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t290' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sBeginSpec</span> <span class='op'>=</span> <span class='str'>'[[[cog'</span><span class='strut'> </span></p>
+<p id='t291' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndSpec</span> <span class='op'>=</span> <span class='str'>']]]'</span><span class='strut'> </span></p>
+<p id='t292' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndOutput</span> <span class='op'>=</span> <span class='str'>'[[[end]]]'</span><span class='strut'> </span></p>
+<p id='t293' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>reEndOutput</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>compile</span><span class='op'>(</span><span class='str'>r'\[\[\[end]]](?P<hashsect> *\(checksum: (?P<hash>[a-f0-9]+)\))'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t294' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndFormat</span> <span class='op'>=</span> <span class='str'>'[[[end]]] (checksum: %s)'</span><span class='strut'> </span></p>
+<p id='t295' class='pln'><span class='strut'> </span></p>
+<p id='t296' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span> <span class='op'>=</span> <span class='nam'>CogOptions</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t297' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sOutputMode</span> <span class='op'>=</span> <span class='str'>'w'</span><span class='strut'> </span></p>
+<p id='t298' class='pln'><span class='strut'> </span></p>
+<p id='t299' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>installCogModule</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t300' class='pln'><span class='strut'> </span></p>
+<p id='t301' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>showWarning</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t302' class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span><span class='op'>,</span> <span class='str'>"Warning:"</span><span class='op'>,</span> <span class='nam'>msg</span><span class='strut'> </span></p>
+<p id='t303' class='pln'><span class='strut'> </span></p>
+<p id='t304' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>isBeginSpecLine</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>s</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t305' class='stm run hide_run'> <span class='key'>return</span> <span class='nam'>string</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='nam'>s</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sBeginSpec</span><span class='op'>)</span> <span class='op'>>=</span> <span class='num'>0</span><span class='strut'> </span></p>
+<p id='t306' class='pln'><span class='strut'> </span></p>
+<p id='t307' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>isEndSpecLine</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>s</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t308' class='stm run hide_run'> <span class='key'>return</span> <span class='nam'>string</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='nam'>s</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndSpec</span><span class='op'>)</span> <span class='op'>>=</span> <span class='num'>0</span> <span class='key'>and</span> <span class='xx'>\</span><span class='strut'> </span></p>
+<p id='t309' class='pln'> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isEndOutputLine</span><span class='op'>(</span><span class='nam'>s</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t310' class='pln'><span class='strut'> </span></p>
+<p id='t311' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>isEndOutputLine</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>s</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t312' class='stm run hide_run'> <span class='key'>return</span> <span class='nam'>string</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='nam'>s</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndOutput</span><span class='op'>)</span> <span class='op'>>=</span> <span class='num'>0</span><span class='strut'> </span></p>
+<p id='t313' class='pln'><span class='strut'> </span></p>
+<p id='t314' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>installCogModule</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t315' class='pln'> <span class='str'>""" Magic mumbo-jumbo so that imported Python modules</span><span class='strut'> </span></p>
+<p id='t316' class='pln'><span class='str'> can say "import cog" and get our state.</span><span class='strut'> </span></p>
+<p id='t317' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t318' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cogmodule</span> <span class='op'>=</span> <span class='nam'>imp</span><span class='op'>.</span><span class='nam'>new_module</span><span class='op'>(</span><span class='str'>'cog'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t319' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>path</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t320' class='stm run hide_run'> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>modules</span><span class='op'>[</span><span class='str'>'cog'</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='strut'> </span></p>
+<p id='t321' class='pln'><span class='strut'> </span></p>
+<p id='t322' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>processFile</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>fIn</span><span class='op'>,</span> <span class='nam'>fOut</span><span class='op'>,</span> <span class='nam'>fname</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>globals</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t323' class='pln'> <span class='str'>""" Process an input file object to an output file object.</span><span class='strut'> </span></p>
+<p id='t324' class='pln'><span class='str'> fIn and fOut can be file objects, or file names.</span><span class='strut'> </span></p>
+<p id='t325' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t326' class='pln'><span class='strut'> </span></p>
+<p id='t327' class='stm run hide_run'> <span class='nam'>sFileIn</span> <span class='op'>=</span> <span class='nam'>fname</span> <span class='key'>or</span> <span class='str'>''</span><span class='strut'> </span></p>
+<p id='t328' class='stm run hide_run'> <span class='nam'>sFileOut</span> <span class='op'>=</span> <span class='nam'>fname</span> <span class='key'>or</span> <span class='str'>''</span><span class='strut'> </span></p>
+<p id='t329' class='stm run hide_run'> <span class='nam'>fInToClose</span> <span class='op'>=</span> <span class='nam'>fOutToClose</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'> </span></p>
+<p id='t330' class='pln'> <span class='com'># Convert filenames to files.</span><span class='strut'> </span></p>
+<p id='t331' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>333</span> <span class='key'>if</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>fIn</span><span class='op'>,</span> <span class='nam'>basestring</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t332' class='pln'> <span class='com'># Open the input file.</span><span class='strut'> </span></p>
+<p id='t333' class='stm mis'> <span class='nam'>sFileIn</span> <span class='op'>=</span> <span class='nam'>fIn</span><span class='strut'> </span></p>
+<p id='t334' class='stm mis'> <span class='nam'>fIn</span> <span class='op'>=</span> <span class='nam'>fInToClose</span> <span class='op'>=</span> <span class='nam'>open</span><span class='op'>(</span><span class='nam'>fIn</span><span class='op'>,</span> <span class='str'>'r'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t335' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>337</span> <span class='key'>if</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>fOut</span><span class='op'>,</span> <span class='nam'>basestring</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t336' class='pln'> <span class='com'># Open the output file.</span><span class='strut'> </span></p>
+<p id='t337' class='stm mis'> <span class='nam'>sFileOut</span> <span class='op'>=</span> <span class='nam'>fOut</span><span class='strut'> </span></p>
+<p id='t338' class='stm mis'> <span class='nam'>fOut</span> <span class='op'>=</span> <span class='nam'>fOutToClose</span> <span class='op'>=</span> <span class='nam'>open</span><span class='op'>(</span><span class='nam'>fOut</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sOutputMode</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t339' class='pln'><span class='strut'> </span></p>
+<p id='t340' class='stm run hide_run'> <span class='key'>try</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t341' class='stm run hide_run'> <span class='nam'>fIn</span> <span class='op'>=</span> <span class='nam'>NumberedFileReader</span><span class='op'>(</span><span class='nam'>fIn</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t342' class='pln'><span class='strut'> </span></p>
+<p id='t343' class='stm run hide_run'> <span class='nam'>bSawCog</span> <span class='op'>=</span> <span class='nam'>False</span><span class='strut'> </span></p>
+<p id='t344' class='pln'><span class='strut'> </span></p>
+<p id='t345' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>inFile</span> <span class='op'>=</span> <span class='nam'>sFileIn</span><span class='strut'> </span></p>
+<p id='t346' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>outFile</span> <span class='op'>=</span> <span class='nam'>sFileOut</span><span class='strut'> </span></p>
+<p id='t347' class='pln'><span class='strut'> </span></p>
+<p id='t348' class='pln'> <span class='com'># The globals dict we'll use for this file.</span><span class='strut'> </span></p>
+<p id='t349' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>353</span> <span class='key'>if</span> <span class='nam'>globals</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t350' class='stm run hide_run'> <span class='nam'>globals</span> <span class='op'>=</span> <span class='op'>{</span><span class='op'>}</span><span class='strut'> </span></p>
+<p id='t351' class='pln'><span class='strut'> </span></p>
+<p id='t352' class='pln'> <span class='com'># If there are any global defines, put them in the globals.</span><span class='strut'> </span></p>
+<p id='t353' class='stm run hide_run'> <span class='nam'>globals</span><span class='op'>.</span><span class='nam'>update</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>defines</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t354' class='pln'><span class='strut'> </span></p>
+<p id='t355' class='pln'> <span class='com'># loop over generator chunks</span><span class='strut'> </span></p>
+<p id='t356' class='stm run hide_run'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>readline</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t357' class='stm run hide_run'> <span class='key'>while</span> <span class='nam'>l</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t358' class='pln'> <span class='com'># Find the next spec begin</span><span class='strut'> </span></p>
+<p id='t359' class='stm run hide_run'> <span class='key'>while</span> <span class='nam'>l</span> <span class='key'>and</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBeginSpecLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t360' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>361</span> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isEndSpecLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t361' class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Unexpected '%s'"</span> <span class='op'>%</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndSpec</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t362' class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>linenumber</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t363' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>364</span> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isEndOutputLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t364' class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Unexpected '%s'"</span> <span class='op'>%</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndOutput</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t365' class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>linenumber</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t366' class='stm run hide_run'> <span class='nam'>fOut</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t367' class='stm run hide_run'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>readline</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t368' class='stm run hide_run'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>l</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t369' class='stm run hide_run'> <span class='key'>break</span><span class='strut'> </span></p>
+<p id='t370' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>374</span> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bDeleteCode</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t371' class='stm run hide_run'> <span class='nam'>fOut</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t372' class='pln'><span class='strut'> </span></p>
+<p id='t373' class='pln'> <span class='com'># l is the begin spec</span><span class='strut'> </span></p>
+<p id='t374' class='stm run hide_run'> <span class='nam'>gen</span> <span class='op'>=</span> <span class='nam'>CogGenerator</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t375' class='stm run hide_run'> <span class='nam'>gen</span><span class='op'>.</span><span class='nam'>setOutput</span><span class='op'>(</span><span class='nam'>stdout</span><span class='op'>=</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t376' class='stm run hide_run'> <span class='nam'>gen</span><span class='op'>.</span><span class='nam'>parseMarker</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t377' class='stm run hide_run'> <span class='nam'>firstLineNum</span> <span class='op'>=</span> <span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>linenumber</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t378' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>firstLineNum</span> <span class='op'>=</span> <span class='nam'>firstLineNum</span><span class='strut'> </span></p>
+<p id='t379' class='pln'><span class='strut'> </span></p>
+<p id='t380' class='pln'> <span class='com'># If the spec begin is also a spec end, then process the single</span><span class='strut'> </span></p>
+<p id='t381' class='pln'> <span class='com'># line of code inside.</span><span class='strut'> </span></p>
+<p id='t382' class='stm run hide_run'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isEndSpecLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t383' class='stm run hide_run'> <span class='nam'>beg</span> <span class='op'>=</span> <span class='nam'>string</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sBeginSpec</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t384' class='stm run hide_run'> <span class='nam'>end</span> <span class='op'>=</span> <span class='nam'>string</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndSpec</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t385' class='stm run hide_run'> <span class='key'>if</span> <span class='nam'>beg</span> <span class='op'>></span> <span class='nam'>end</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t386' class='stm run hide_run'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Cog code markers inverted"</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t387' class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>firstLineNum</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t388' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t389' class='stm run hide_run'> <span class='nam'>sCode</span> <span class='op'>=</span> <span class='nam'>l</span><span class='op'>[</span><span class='nam'>beg</span><span class='op'>+</span><span class='nam'>len</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>sBeginSpec</span><span class='op'>)</span><span class='op'>:</span><span class='nam'>end</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>strip</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t390' class='stm run hide_run'> <span class='nam'>gen</span><span class='op'>.</span><span class='nam'>parseLine</span><span class='op'>(</span><span class='nam'>sCode</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t391' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t392' class='pln'> <span class='com'># Deal with an ordinary code block.</span><span class='strut'> </span></p>
+<p id='t393' class='stm run hide_run'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>readline</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t394' class='pln'><span class='strut'> </span></p>
+<p id='t395' class='pln'> <span class='com'># Get all the lines in the spec</span><span class='strut'> </span></p>
+<p id='t396' class='stm run hide_run'> <span class='key'>while</span> <span class='nam'>l</span> <span class='key'>and</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isEndSpecLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t397' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>398</span> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBeginSpecLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t398' class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Unexpected '%s'"</span> <span class='op'>%</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sBeginSpec</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t399' class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>linenumber</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t400' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>401</span> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isEndOutputLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t401' class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Unexpected '%s'"</span> <span class='op'>%</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndOutput</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t402' class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>linenumber</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t403' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>405</span> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bDeleteCode</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t404' class='stm run hide_run'> <span class='nam'>fOut</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t405' class='stm run hide_run'> <span class='nam'>gen</span><span class='op'>.</span><span class='nam'>parseLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t406' class='stm run hide_run'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>readline</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t407' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>408</span> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>l</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t408' class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='strut'> </span></p>
+<p id='t409' class='pln'> <span class='str'>"Cog block begun but never ended."</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t410' class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>firstLineNum</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t411' class='pln'><span class='strut'> </span></p>
+<p id='t412' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>414</span> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bDeleteCode</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t413' class='stm run hide_run'> <span class='nam'>fOut</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t414' class='stm run hide_run'> <span class='nam'>gen</span><span class='op'>.</span><span class='nam'>parseMarker</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t415' class='pln'><span class='strut'> </span></p>
+<p id='t416' class='stm run hide_run'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>readline</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t417' class='pln'><span class='strut'> </span></p>
+<p id='t418' class='pln'> <span class='com'># Eat all the lines in the output section. While reading past</span><span class='strut'> </span></p>
+<p id='t419' class='pln'> <span class='com'># them, compute the md5 hash of the old output.</span><span class='strut'> </span></p>
+<p id='t420' class='stm run hide_run'> <span class='nam'>hasher</span> <span class='op'>=</span> <span class='nam'>hash_factory</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t421' class='stm run hide_run'> <span class='key'>while</span> <span class='nam'>l</span> <span class='key'>and</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isEndOutputLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t422' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>423</span> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBeginSpecLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t423' class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Unexpected '%s'"</span> <span class='op'>%</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sBeginSpec</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t424' class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>linenumber</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t425' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>426</span> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isEndSpecLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t426' class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Unexpected '%s'"</span> <span class='op'>%</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndSpec</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t427' class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>linenumber</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t428' class='stm run hide_run'> <span class='nam'>hasher</span><span class='op'>.</span><span class='nam'>update</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t429' class='stm run hide_run'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>readline</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t430' class='stm run hide_run'> <span class='nam'>curHash</span> <span class='op'>=</span> <span class='nam'>hasher</span><span class='op'>.</span><span class='nam'>hexdigest</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t431' class='pln'><span class='strut'> </span></p>
+<p id='t432' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>434</span> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>l</span> <span class='key'>and</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bEofCanBeEnd</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t433' class='pln'> <span class='com'># We reached end of file before we found the end output line.</span><span class='strut'> </span></p>
+<p id='t434' class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Missing '%s' before end of file."</span> <span class='op'>%</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndOutput</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t435' class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>linenumber</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t436' class='pln'><span class='strut'> </span></p>
+<p id='t437' class='pln'> <span class='com'># Write the output of the spec to be the new output if we're </span><span class='strut'> </span></p>
+<p id='t438' class='pln'> <span class='com'># supposed to generate code.</span><span class='strut'> </span></p>
+<p id='t439' class='stm run hide_run'> <span class='nam'>hasher</span> <span class='op'>=</span> <span class='nam'>hash_factory</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t440' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>446</span> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bNoGenerate</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t441' class='stm run hide_run'> <span class='nam'>sFile</span> <span class='op'>=</span> <span class='str'>"%s+%d"</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>firstLineNum</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t442' class='stm run hide_run'> <span class='nam'>sGen</span> <span class='op'>=</span> <span class='nam'>gen</span><span class='op'>.</span><span class='nam'>evaluate</span><span class='op'>(</span><span class='nam'>cog</span><span class='op'>=</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>globals</span><span class='op'>=</span><span class='nam'>globals</span><span class='op'>,</span> <span class='nam'>fname</span><span class='op'>=</span><span class='nam'>sFile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t443' class='stm run hide_run'> <span class='nam'>sGen</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>suffixLines</span><span class='op'>(</span><span class='nam'>sGen</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t444' class='stm run hide_run'> <span class='nam'>hasher</span><span class='op'>.</span><span class='nam'>update</span><span class='op'>(</span><span class='nam'>sGen</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t445' class='stm run hide_run'> <span class='nam'>fOut</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>sGen</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t446' class='stm run hide_run'> <span class='nam'>newHash</span> <span class='op'>=</span> <span class='nam'>hasher</span><span class='op'>.</span><span class='nam'>hexdigest</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t447' class='pln'><span class='strut'> </span></p>
+<p id='t448' class='stm run hide_run'> <span class='nam'>bSawCog</span> <span class='op'>=</span> <span class='nam'>True</span><span class='strut'> </span></p>
+<p id='t449' class='pln'><span class='strut'> </span></p>
+<p id='t450' class='pln'> <span class='com'># Write the ending output line</span><span class='strut'> </span></p>
+<p id='t451' class='stm run hide_run'> <span class='nam'>hashMatch</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>reEndOutput</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t452' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>453</span> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bHashOutput</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t453' class='stm mis'> <span class='key'>if</span> <span class='nam'>hashMatch</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t454' class='stm mis'> <span class='nam'>oldHash</span> <span class='op'>=</span> <span class='nam'>hashMatch</span><span class='op'>.</span><span class='nam'>groupdict</span><span class='op'>(</span><span class='op'>)</span><span class='op'>[</span><span class='str'>'hash'</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t455' class='stm mis'> <span class='key'>if</span> <span class='nam'>oldHash</span> <span class='op'>!=</span> <span class='nam'>curHash</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t456' class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Output has been edited! Delete old checksum to unprotect."</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t457' class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>linenumber</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t458' class='pln'> <span class='com'># Create a new end line with the correct hash.</span><span class='strut'> </span></p>
+<p id='t459' class='stm mis'> <span class='nam'>endpieces</span> <span class='op'>=</span> <span class='nam'>l</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='nam'>hashMatch</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>0</span><span class='op'>)</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t460' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t461' class='pln'> <span class='com'># There was no old hash, but we want a new hash.</span><span class='strut'> </span></p>
+<p id='t462' class='stm mis'> <span class='nam'>endpieces</span> <span class='op'>=</span> <span class='nam'>l</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndOutput</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t463' class='stm mis'> <span class='nam'>l</span> <span class='op'>=</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndFormat</span> <span class='op'>%</span> <span class='nam'>newHash</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>endpieces</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t464' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t465' class='pln'> <span class='com'># We don't want hashes output, so if there was one, get rid of</span><span class='strut'> </span></p>
+<p id='t466' class='pln'> <span class='com'># it.</span><span class='strut'> </span></p>
+<p id='t467' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>468</span> <span class='key'>if</span> <span class='nam'>hashMatch</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t468' class='stm mis'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>l</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='nam'>hashMatch</span><span class='op'>.</span><span class='nam'>groupdict</span><span class='op'>(</span><span class='op'>)</span><span class='op'>[</span><span class='str'>'hashsect'</span><span class='op'>]</span><span class='op'>,</span> <span class='str'>''</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t469' class='pln'><span class='strut'> </span></p>
+<p id='t470' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>472</span> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bDeleteCode</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t471' class='stm run hide_run'> <span class='nam'>fOut</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t472' class='stm run hide_run'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>readline</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t473' class='pln'><span class='strut'> </span></p>
+<p id='t474' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>475</span> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>bSawCog</span> <span class='key'>and</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bWarnEmpty</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t475' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>showWarning</span><span class='op'>(</span><span class='str'>"no cog code found in %s"</span> <span class='op'>%</span> <span class='nam'>sFileIn</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t476' class='pln'> <span class='key'>finally</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t477' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>478</span> <span class='key'>if</span> <span class='nam'>fInToClose</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t478' class='stm mis'> <span class='nam'>fInToClose</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t479' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>480</span> <span class='key'>if</span> <span class='nam'>fOutToClose</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t480' class='stm mis'> <span class='nam'>fOutToClose</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t481' class='pln'><span class='strut'> </span></p>
+<p id='t482' class='pln'><span class='strut'> </span></p>
+<p id='t483' class='pln'> <span class='com'># A regex for non-empty lines, used by suffixLines.</span><span class='strut'> </span></p>
+<p id='t484' class='stm run hide_run'> <span class='nam'>reNonEmptyLines</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>compile</span><span class='op'>(</span><span class='str'>"^\s*\S+.*$"</span><span class='op'>,</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>MULTILINE</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t485' class='pln'><span class='strut'> </span></p>
+<p id='t486' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>suffixLines</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>text</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t487' class='pln'> <span class='str'>""" Add suffixes to the lines in text, if our options desire it.</span><span class='strut'> </span></p>
+<p id='t488' class='pln'><span class='str'> text is many lines, as a single string.</span><span class='strut'> </span></p>
+<p id='t489' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t490' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>492</span> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>sSuffix</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t491' class='pln'> <span class='com'># Find all non-blank lines, and add the suffix to the end.</span><span class='strut'> </span></p>
+<p id='t492' class='stm mis'> <span class='nam'>repl</span> <span class='op'>=</span> <span class='str'>r"\g<0>"</span> <span class='op'>+</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>sSuffix</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='str'>'\\'</span><span class='op'>,</span> <span class='str'>'\\\\'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t493' class='stm mis'> <span class='nam'>text</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>reNonEmptyLines</span><span class='op'>.</span><span class='nam'>sub</span><span class='op'>(</span><span class='nam'>repl</span><span class='op'>,</span> <span class='nam'>text</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t494' class='stm run hide_run'> <span class='key'>return</span> <span class='nam'>text</span><span class='strut'> </span></p>
+<p id='t495' class='pln'><span class='strut'> </span></p>
+<p id='t496' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>processString</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>sInput</span><span class='op'>,</span> <span class='nam'>fname</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t497' class='pln'> <span class='str'>""" Process sInput as the text to cog.</span><span class='strut'> </span></p>
+<p id='t498' class='pln'><span class='str'> Return the cogged output as a string.</span><span class='strut'> </span></p>
+<p id='t499' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t500' class='stm run hide_run'> <span class='nam'>fOld</span> <span class='op'>=</span> <span class='nam'>StringIO</span><span class='op'>(</span><span class='nam'>sInput</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t501' class='stm run hide_run'> <span class='nam'>fNew</span> <span class='op'>=</span> <span class='nam'>StringIO</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t502' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>processFile</span><span class='op'>(</span><span class='nam'>fOld</span><span class='op'>,</span> <span class='nam'>fNew</span><span class='op'>,</span> <span class='nam'>fname</span><span class='op'>=</span><span class='nam'>fname</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t503' class='stm run hide_run'> <span class='key'>return</span> <span class='nam'>fNew</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t504' class='pln'><span class='strut'> </span></p>
+<p id='t505' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>replaceFile</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>sOldPath</span><span class='op'>,</span> <span class='nam'>sNewText</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t506' class='pln'> <span class='str'>""" Replace file sOldPath with the contents sNewText</span><span class='strut'> </span></p>
+<p id='t507' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t508' class='stm mis'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>access</span><span class='op'>(</span><span class='nam'>sOldPath</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>W_OK</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t509' class='pln'> <span class='com'># Need to ensure we can write.</span><span class='strut'> </span></p>
+<p id='t510' class='stm mis'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>sMakeWritableCmd</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t511' class='pln'> <span class='com'># Use an external command to make the file writable.</span><span class='strut'> </span></p>
+<p id='t512' class='stm mis'> <span class='nam'>cmd</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>sMakeWritableCmd</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='str'>'%s'</span><span class='op'>,</span> <span class='nam'>sOldPath</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t513' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>popen</span><span class='op'>(</span><span class='nam'>cmd</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t514' class='stm mis'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>access</span><span class='op'>(</span><span class='nam'>sOldPath</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>W_OK</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t515' class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Couldn't make %s writable"</span> <span class='op'>%</span> <span class='nam'>sOldPath</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t516' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t517' class='pln'> <span class='com'># Can't write!</span><span class='strut'> </span></p>
+<p id='t518' class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Can't overwrite %s"</span> <span class='op'>%</span> <span class='nam'>sOldPath</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t519' class='stm mis'> <span class='nam'>f</span> <span class='op'>=</span> <span class='nam'>open</span><span class='op'>(</span><span class='nam'>sOldPath</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sOutputMode</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t520' class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>sNewText</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t521' class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t522' class='pln'><span class='strut'> </span></p>
+<p id='t523' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>saveIncludePath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t524' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>savedInclude</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>includePath</span><span class='op'>[</span><span class='op'>:</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t525' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>savedSysPath</span> <span class='op'>=</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>[</span><span class='op'>:</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t526' class='pln'><span class='strut'> </span></p>
+<p id='t527' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>restoreIncludePath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t528' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>includePath</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>savedInclude</span><span class='strut'> </span></p>
+<p id='t529' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>path</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>includePath</span><span class='strut'> </span></p>
+<p id='t530' class='stm mis'> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>path</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>savedSysPath</span><span class='strut'> </span></p>
+<p id='t531' class='pln'><span class='strut'> </span></p>
+<p id='t532' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>addToIncludePath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>includePath</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t533' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>extend</span><span class='op'>(</span><span class='nam'>includePath</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t534' class='stm mis'> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>extend</span><span class='op'>(</span><span class='nam'>includePath</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t535' class='pln'><span class='strut'> </span></p>
+<p id='t536' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>processOneFile</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>sFile</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t537' class='pln'> <span class='str'>""" Process one filename through cog.</span><span class='strut'> </span></p>
+<p id='t538' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t539' class='pln'><span class='strut'> </span></p>
+<p id='t540' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>saveIncludePath</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t541' class='pln'><span class='strut'> </span></p>
+<p id='t542' class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t543' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>addToIncludePath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>includePath</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t544' class='pln'> <span class='com'># Since we know where the input file came from,</span><span class='strut'> </span></p>
+<p id='t545' class='pln'> <span class='com'># push its directory onto the include path.</span><span class='strut'> </span></p>
+<p id='t546' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>addToIncludePath</span><span class='op'>(</span><span class='op'>[</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>dirname</span><span class='op'>(</span><span class='nam'>sFile</span><span class='op'>)</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t547' class='pln'><span class='strut'> </span></p>
+<p id='t548' class='pln'> <span class='com'># Set the file output mode based on whether we want \n or native</span><span class='strut'> </span></p>
+<p id='t549' class='pln'> <span class='com'># line endings.</span><span class='strut'> </span></p>
+<p id='t550' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sOutputMode</span> <span class='op'>=</span> <span class='str'>'w'</span><span class='strut'> </span></p>
+<p id='t551' class='stm mis'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bNewlines</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t552' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sOutputMode</span> <span class='op'>=</span> <span class='str'>'wb'</span><span class='strut'> </span></p>
+<p id='t553' class='pln'><span class='strut'> </span></p>
+<p id='t554' class='pln'> <span class='com'># How we process the file depends on where the output is going.</span><span class='strut'> </span></p>
+<p id='t555' class='stm mis'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>sOutputName</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t556' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>processFile</span><span class='op'>(</span><span class='nam'>sFile</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>sOutputName</span><span class='op'>,</span> <span class='nam'>sFile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t557' class='stm mis'> <span class='key'>elif</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bReplace</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t558' class='pln'> <span class='com'># We want to replace the cog file with the output,</span><span class='strut'> </span></p>
+<p id='t559' class='pln'> <span class='com'># but only if they differ.</span><span class='strut'> </span></p>
+<p id='t560' class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span><span class='op'>,</span> <span class='str'>"Cogging %s"</span> <span class='op'>%</span> <span class='nam'>sFile</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t561' class='stm mis'> <span class='nam'>bNeedNewline</span> <span class='op'>=</span> <span class='nam'>True</span><span class='strut'> </span></p>
+<p id='t562' class='pln'><span class='strut'> </span></p>
+<p id='t563' class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t564' class='stm mis'> <span class='nam'>fOldFile</span> <span class='op'>=</span> <span class='nam'>open</span><span class='op'>(</span><span class='nam'>sFile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t565' class='stm mis'> <span class='nam'>sOldText</span> <span class='op'>=</span> <span class='nam'>fOldFile</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t566' class='stm mis'> <span class='nam'>fOldFile</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t567' class='stm mis'> <span class='nam'>sNewText</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>sOldText</span><span class='op'>,</span> <span class='nam'>fname</span><span class='op'>=</span><span class='nam'>sFile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t568' class='stm mis'> <span class='key'>if</span> <span class='nam'>sOldText</span> <span class='op'>!=</span> <span class='nam'>sNewText</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t569' class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span><span class='op'>,</span> <span class='str'>" (changed)"</span><span class='strut'> </span></p>
+<p id='t570' class='stm mis'> <span class='nam'>bNeedNewline</span> <span class='op'>=</span> <span class='nam'>False</span><span class='strut'> </span></p>
+<p id='t571' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>replaceFile</span><span class='op'>(</span><span class='nam'>sFile</span><span class='op'>,</span> <span class='nam'>sNewText</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t572' class='pln'> <span class='key'>finally</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t573' class='pln'> <span class='com'># The try-finally block is so we can print a partial line</span><span class='strut'> </span></p>
+<p id='t574' class='pln'> <span class='com'># with the name of the file, and print (changed) on the</span><span class='strut'> </span></p>
+<p id='t575' class='pln'> <span class='com'># same line, but also make sure to break the line before</span><span class='strut'> </span></p>
+<p id='t576' class='pln'> <span class='com'># any traceback.</span><span class='strut'> </span></p>
+<p id='t577' class='stm mis'> <span class='key'>if</span> <span class='nam'>bNeedNewline</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t578' class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span><span class='strut'> </span></p>
+<p id='t579' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t580' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>processFile</span><span class='op'>(</span><span class='nam'>sFile</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span><span class='op'>,</span> <span class='nam'>sFile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t581' class='pln'> <span class='key'>finally</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t582' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>restoreIncludePath</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t583' class='pln'><span class='strut'> </span></p>
+<p id='t584' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>processFileList</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>sFileList</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t585' class='pln'> <span class='str'>""" Process the files in a file list.</span><span class='strut'> </span></p>
+<p id='t586' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t587' class='stm mis'> <span class='nam'>flist</span> <span class='op'>=</span> <span class='nam'>open</span><span class='op'>(</span><span class='nam'>sFileList</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t588' class='stm mis'> <span class='nam'>lines</span> <span class='op'>=</span> <span class='nam'>flist</span><span class='op'>.</span><span class='nam'>readlines</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t589' class='stm mis'> <span class='nam'>flist</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t590' class='stm mis'> <span class='key'>for</span> <span class='nam'>l</span> <span class='key'>in</span> <span class='nam'>lines</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t591' class='pln'> <span class='com'># Use shlex to parse the line like a shell.</span><span class='strut'> </span></p>
+<p id='t592' class='stm mis'> <span class='nam'>lex</span> <span class='op'>=</span> <span class='nam'>shlex</span><span class='op'>.</span><span class='nam'>shlex</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>,</span> <span class='nam'>posix</span><span class='op'>=</span><span class='nam'>True</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t593' class='stm mis'> <span class='nam'>lex</span><span class='op'>.</span><span class='nam'>whitespace_split</span> <span class='op'>=</span> <span class='nam'>True</span><span class='strut'> </span></p>
+<p id='t594' class='stm mis'> <span class='nam'>lex</span><span class='op'>.</span><span class='nam'>commenters</span> <span class='op'>=</span> <span class='str'>'#'</span><span class='strut'> </span></p>
+<p id='t595' class='pln'> <span class='com'># No escapes, so that backslash can be part of the path</span><span class='strut'> </span></p>
+<p id='t596' class='stm mis'> <span class='nam'>lex</span><span class='op'>.</span><span class='nam'>escape</span> <span class='op'>=</span> <span class='str'>''</span><span class='strut'> </span></p>
+<p id='t597' class='stm mis'> <span class='nam'>args</span> <span class='op'>=</span> <span class='nam'>list</span><span class='op'>(</span><span class='nam'>lex</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t598' class='stm mis'> <span class='key'>if</span> <span class='nam'>args</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t599' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>processArguments</span><span class='op'>(</span><span class='nam'>args</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t600' class='pln'><span class='strut'> </span></p>
+<p id='t601' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>processArguments</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>args</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t602' class='pln'> <span class='str'>""" Process one command-line.</span><span class='strut'> </span></p>
+<p id='t603' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t604' class='stm mis'> <span class='nam'>saved_options</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='strut'> </span></p>
+<p id='t605' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>clone</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t606' class='pln'><span class='strut'> </span></p>
+<p id='t607' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>parseArgs</span><span class='op'>(</span><span class='nam'>args</span><span class='op'>[</span><span class='num'>1</span><span class='op'>:</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t608' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>validate</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t609' class='pln'><span class='strut'> </span></p>
+<p id='t610' class='stm mis'> <span class='key'>if</span> <span class='nam'>args</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span> <span class='op'>==</span> <span class='str'>'@'</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t611' class='stm mis'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>sOutputName</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t612' class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogUsageError</span><span class='op'>(</span><span class='str'>"Can't use -o with @file"</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t613' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>processFileList</span><span class='op'>(</span><span class='nam'>args</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>[</span><span class='num'>1</span><span class='op'>:</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t614' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t615' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>processOneFile</span><span class='op'>(</span><span class='nam'>args</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t616' class='pln'><span class='strut'> </span></p>
+<p id='t617' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span> <span class='op'>=</span> <span class='nam'>saved_options</span><span class='strut'> </span></p>
+<p id='t618' class='pln'><span class='strut'> </span></p>
+<p id='t619' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>callableMain</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>argv</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t620' class='pln'> <span class='str'>""" All of command-line cog, but in a callable form.</span><span class='strut'> </span></p>
+<p id='t621' class='pln'><span class='str'> This is used by main.</span><span class='strut'> </span></p>
+<p id='t622' class='pln'><span class='str'> argv is the equivalent of sys.argv.</span><span class='strut'> </span></p>
+<p id='t623' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t624' class='stm mis'> <span class='nam'>argv0</span> <span class='op'>=</span> <span class='nam'>argv</span><span class='op'>.</span><span class='nam'>pop</span><span class='op'>(</span><span class='num'>0</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t625' class='pln'><span class='strut'> </span></p>
+<p id='t626' class='pln'> <span class='com'># Provide help if asked for anywhere in the command line.</span><span class='strut'> </span></p>
+<p id='t627' class='stm mis'> <span class='key'>if</span> <span class='str'>'-?'</span> <span class='key'>in</span> <span class='nam'>argv</span> <span class='key'>or</span> <span class='str'>'-h'</span> <span class='key'>in</span> <span class='nam'>argv</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t628' class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stderr</span><span class='op'>,</span> <span class='nam'>usage</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t629' class='stm mis'> <span class='key'>return</span><span class='strut'> </span></p>
+<p id='t630' class='pln'><span class='strut'> </span></p>
+<p id='t631' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>parseArgs</span><span class='op'>(</span><span class='nam'>argv</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t632' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>validate</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t633' class='pln'><span class='strut'> </span></p>
+<p id='t634' class='stm mis'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bShowVersion</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t635' class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span><span class='op'>,</span> <span class='str'>"Cog version %s"</span> <span class='op'>%</span> <span class='nam'>__version__</span><span class='strut'> </span></p>
+<p id='t636' class='stm mis'> <span class='key'>return</span><span class='strut'> </span></p>
+<p id='t637' class='pln'><span class='strut'> </span></p>
+<p id='t638' class='stm mis'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>args</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t639' class='stm mis'> <span class='key'>for</span> <span class='nam'>a</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>args</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t640' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>processArguments</span><span class='op'>(</span><span class='op'>[</span><span class='nam'>a</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t641' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t642' class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogUsageError</span><span class='op'>(</span><span class='str'>"No files to process"</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t643' class='pln'><span class='strut'> </span></p>
+<p id='t644' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>main</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>argv</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t645' class='pln'> <span class='str'>""" Handle the command-line execution for cog.</span><span class='strut'> </span></p>
+<p id='t646' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t647' class='pln'><span class='strut'> </span></p>
+<p id='t648' class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t649' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='nam'>argv</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t650' class='stm mis'> <span class='key'>return</span> <span class='num'>0</span><span class='strut'> </span></p>
+<p id='t651' class='stm mis'> <span class='key'>except</span> <span class='nam'>CogUsageError</span><span class='op'>,</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t652' class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stderr</span><span class='op'>,</span> <span class='nam'>err</span><span class='strut'> </span></p>
+<p id='t653' class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stderr</span><span class='op'>,</span> <span class='str'>"(for help use -?)"</span><span class='strut'> </span></p>
+<p id='t654' class='stm mis'> <span class='key'>return</span> <span class='num'>2</span><span class='strut'> </span></p>
+<p id='t655' class='stm mis'> <span class='key'>except</span> <span class='nam'>CogGeneratedError</span><span class='op'>,</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t656' class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stderr</span><span class='op'>,</span> <span class='str'>"Error: %s"</span> <span class='op'>%</span> <span class='nam'>err</span><span class='strut'> </span></p>
+<p id='t657' class='stm mis'> <span class='key'>return</span> <span class='num'>3</span><span class='strut'> </span></p>
+<p id='t658' class='stm mis'> <span class='key'>except</span> <span class='nam'>CogError</span><span class='op'>,</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t659' class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stderr</span><span class='op'>,</span> <span class='nam'>err</span><span class='strut'> </span></p>
+<p id='t660' class='stm mis'> <span class='key'>return</span> <span class='num'>1</span><span class='strut'> </span></p>
+<p id='t661' class='stm mis'> <span class='key'>except</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t662' class='stm mis'> <span class='nam'>traceback</span><span class='op'>.</span><span class='nam'>print_exc</span><span class='op'>(</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>stderr</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t663' class='stm mis'> <span class='key'>return</span> <span class='num'>1</span><span class='strut'> </span></p>
+<p id='t664' class='pln'><span class='strut'> </span></p>
+<p id='t665' class='pln'><span class='com'># History:</span><span class='strut'> </span></p>
+<p id='t666' class='pln'><span class='com'># 20040210: First public version.</span><span class='strut'> </span></p>
+<p id='t667' class='pln'><span class='com'># 20040220: Text preceding the start and end marker are removed from Python lines.</span><span class='strut'> </span></p>
+<p id='t668' class='pln'><span class='com'># -v option on the command line shows the version.</span><span class='strut'> </span></p>
+<p id='t669' class='pln'><span class='com'># 20040311: Make sure the last line of output is properly ended with a newline.</span><span class='strut'> </span></p>
+<p id='t670' class='pln'><span class='com'># 20040605: Fixed some blank line handling in cog.</span><span class='strut'> </span></p>
+<p id='t671' class='pln'><span class='com'># Fixed problems with assigning to xml elements in handyxml.</span><span class='strut'> </span></p>
+<p id='t672' class='pln'><span class='com'># 20040621: Changed all line-ends to LF from CRLF.</span><span class='strut'> </span></p>
+<p id='t673' class='pln'><span class='com'># 20041002: Refactor some option handling to simplify unittesting the options.</span><span class='strut'> </span></p>
+<p id='t674' class='pln'><span class='com'># 20041118: cog.out and cog.outl have optional string arguments.</span><span class='strut'> </span></p>
+<p id='t675' class='pln'><span class='com'># 20041119: File names weren't being properly passed around for warnings, etc.</span><span class='strut'> </span></p>
+<p id='t676' class='pln'><span class='com'># 20041122: Added cog.firstLineNum: a property with the line number of the [[[cog line.</span><span class='strut'> </span></p>
+<p id='t677' class='pln'><span class='com'># Added cog.inFile and cog.outFile: the names of the input and output file.</span><span class='strut'> </span></p>
+<p id='t678' class='pln'><span class='com'># 20041218: Single-line cog generators, with start marker and end marker on</span><span class='strut'> </span></p>
+<p id='t679' class='pln'><span class='com'># the same line.</span><span class='strut'> </span></p>
+<p id='t680' class='pln'><span class='com'># 20041230: Keep a single globals dict for all the code fragments in a single</span><span class='strut'> </span></p>
+<p id='t681' class='pln'><span class='com'># file so they can share state.</span><span class='strut'> </span></p>
+<p id='t682' class='pln'><span class='com'># 20050206: Added the -x switch to remove all generated output.</span><span class='strut'> </span></p>
+<p id='t683' class='pln'><span class='com'># 20050218: Now code can be on the marker lines as well.</span><span class='strut'> </span></p>
+<p id='t684' class='pln'><span class='com'># 20050219: Added -c switch to checksum the output so that edits can be</span><span class='strut'> </span></p>
+<p id='t685' class='pln'><span class='com'># detected before they are obliterated.</span><span class='strut'> </span></p>
+<p id='t686' class='pln'><span class='com'># 20050521: Added cog.error, contributed by Alexander Belchenko.</span><span class='strut'> </span></p>
+<p id='t687' class='pln'><span class='com'># 20050720: Added code deletion and settable globals contributed by Blake Winton.</span><span class='strut'> </span></p>
+<p id='t688' class='pln'><span class='com'># 20050724: Many tweaks to improve code coverage.</span><span class='strut'> </span></p>
+<p id='t689' class='pln'><span class='com'># 20050726: Error messages are now printed with no traceback.</span><span class='strut'> </span></p>
+<p id='t690' class='pln'><span class='com'># Code can no longer appear on the marker lines,</span><span class='strut'> </span></p>
+<p id='t691' class='pln'><span class='com'># except for single-line style.</span><span class='strut'> </span></p>
+<p id='t692' class='pln'><span class='com'># -z allows omission of the [[[end]]] marker, and it will be assumed</span><span class='strut'> </span></p>
+<p id='t693' class='pln'><span class='com'># at the end of the file.</span><span class='strut'> </span></p>
+<p id='t694' class='pln'><span class='com'># 20050729: Refactor option parsing into a separate class, in preparation for</span><span class='strut'> </span></p>
+<p id='t695' class='pln'><span class='com'># future features.</span><span class='strut'> </span></p>
+<p id='t696' class='pln'><span class='com'># 20050805: The cogmodule.path wasn't being properly maintained.</span><span class='strut'> </span></p>
+<p id='t697' class='pln'><span class='com'># 20050808: Added the -D option to define a global value.</span><span class='strut'> </span></p>
+<p id='t698' class='pln'><span class='com'># 20050810: The %s in the -w command is dealt with more robustly.</span><span class='strut'> </span></p>
+<p id='t699' class='pln'><span class='com'># Added the -s option to suffix output lines with a marker.</span><span class='strut'> </span></p>
+<p id='t700' class='pln'><span class='com'># 20050817: Now @files can have arguments on each line to change the cog's</span><span class='strut'> </span></p>
+<p id='t701' class='pln'><span class='com'># behavior for that line.</span><span class='strut'> </span></p>
+<p id='t702' class='pln'><span class='com'># 20051006: Version 2.0</span><span class='strut'> </span></p>
+<p id='t703' class='pln'><span class='com'># 20080521: -U options lets you create Unix newlines on Windows. Thanks,</span><span class='strut'> </span></p>
+<p id='t704' class='pln'><span class='com'># Alexander Belchenko.</span><span class='strut'> </span></p>
+<p id='t705' class='pln'><span class='com'># 20080522: It's now ok to have -d with output to stdout, and now we validate</span><span class='strut'> </span></p>
+<p id='t706' class='pln'><span class='com'># the args after each line of an @file.</span><span class='strut'> </span></p>
+<p id='t707' class='pln'><span class='com'># 20090520: Use hashlib where it's available, to avoid a warning.</span><span class='strut'> </span></p>
+<p id='t708' class='pln'><span class='com'># Use the builtin compile() instead of compiler, for Jython.</span><span class='strut'> </span></p>
+<p id='t709' class='pln'><span class='com'># Explicitly close files we opened, Jython likes this.</span><span class='strut'> </span></p>
+
+ </td>
+ </tr>
+ </table>
</div>
</body>
diff --git a/doc/sample_html/cogapp_makefiles.html b/doc/sample_html/cogapp_makefiles.html index 4d50521a..77260de2 100644 --- a/doc/sample_html/cogapp_makefiles.html +++ b/doc/sample_html/cogapp_makefiles.html @@ -1,177 +1,170 @@ -<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
-<title>Coverage for cogapp\makefiles</title>
-<link rel='stylesheet' href='style.css' type='text/css'>
-<script src='jquery-1.3.2.min.js'></script>
-<script>
-function toggle_lines(btn, cls) {
- var btn = $(btn);
- if (btn.hasClass("hide")) {
- $("#source ."+cls).removeClass("hide");
- btn.removeClass("hide");
- }
- else {
- $("#source ."+cls).addClass("hide");
- btn.addClass("hide");
- }
-}
-</script>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+ <title>Coverage for cogapp\makefiles: 13%</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
</head>
<body>
+
<div id='header'>
<div class='content'>
<h1>Coverage for <b>cogapp\makefiles</b> :
- <span class='pc_cov'>21%</span>
+ <span class='pc_cov'>13%</span>
</h1>
<h2 class='stats'>
29 statements
- <span class='run hide' onclick='toggle_lines(this, "run")'>6 run</span>
+ <span class='run hide_run' onclick='toggle_lines(this, "run")'>6 run</span>
<span class='exc' onclick='toggle_lines(this, "exc")'>3 excluded</span>
<span class='mis' onclick='toggle_lines(this, "mis")'>23 missing</span>
+
+ <span class='par run hide_run' onclick='toggle_lines(this, "par")'>0 partial</span>
+
</h2>
</div>
</div>
<div id='source'>
-<table cellspacing='0' cellpadding='0'>
-<tr>
-<td class='linenos' valign='top'>
-<p class='pln'>1</p>
-<p class='pln'>2</p>
-<p class='pln'>3</p>
-<p class='pln'>4</p>
-<p class='pln'>5</p>
-<p class='pln'>6</p>
-<p class='stm run hide'>7</p>
-<p class='stm run hide'>8</p>
-<p class='pln'>9</p>
-<p class='stm run hide'>10</p>
-<p class='stm run hide'>11</p>
-<p class='pln'>12</p>
-<p class='stm run hide'>13</p>
-<p class='pln'>14</p>
-<p class='pln'>15</p>
-<p class='stm mis'>16</p>
-<p class='stm mis'>17</p>
-<p class='stm mis'>18</p>
-<p class='stm mis'>19</p>
-<p class='stm mis'>20</p>
-<p class='stm mis'>21</p>
-<p class='stm mis'>22</p>
-<p class='stm mis'>23</p>
-<p class='stm mis'>24</p>
-<p class='stm mis'>25</p>
-<p class='stm mis'>26</p>
-<p class='stm mis'>27</p>
-<p class='pln'>28</p>
-<p class='stm mis'>29</p>
-<p class='stm mis'>30</p>
-<p class='stm mis'>31</p>
-<p class='pln'>32</p>
-<p class='stm run hide'>33</p>
-<p class='pln'>34</p>
-<p class='pln'>35</p>
-<p class='pln'>36</p>
-<p class='stm mis'>37</p>
-<p class='stm mis'>38</p>
-<p class='stm mis'>39</p>
-<p class='stm mis'>40</p>
-<p class='stm mis'>41</p>
-<p class='pln'>42</p>
-<p class='stm mis'>43</p>
-<p class='stm mis'>44</p>
-<p class='stm mis'>45</p>
-<p class='pln'>46</p>
-<p class='exc'>47</p>
-<p class='pln'>48</p>
-<p class='exc'>49</p>
-<p class='pln'>50</p>
-<p class='pln'>51</p>
-<p class='pln'>52</p>
-<p class='pln'>53</p>
-<p class='pln'>54</p>
-<p class='pln'>55</p>
-<p class='pln'>56</p>
-<p class='pln'>57</p>
-<p class='pln'>58</p>
-<p class='pln'>59</p>
-<p class='pln'>60</p>
-<p class='pln'>61</p>
-<p class='pln'>62</p>
-<p class='pln'>63</p>
-<p class='exc'>64</p>
-
-</td>
-<td class='text' valign='top'>
-<p class='pln'><span class='str'>""" Dictionary-to-filetree functions, to create test files for testing.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> http://nedbatchelder.com/code/cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> </span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Copyright 2004-2009, Ned Batchelder.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'>"""</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>import</span> <span class='nam'>path</span> <span class='com'># Non-standard, from http://www.jorendorff.com/articles/python/path</span><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>from</span> <span class='nam'>whiteutils</span> <span class='key'>import</span> <span class='nam'>reindentBlock</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='nam'>__version__</span> <span class='op'>=</span> <span class='str'>'1.0.20040126'</span><span class="strut"> </span></p>
-<p class='stm run hide'><span class='nam'>__all__</span> <span class='op'>=</span> <span class='op'>[</span><span class='str'>'makeFiles'</span><span class='op'>,</span> <span class='str'>'removeFiles'</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>def</span> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>,</span> <span class='nam'>basedir</span><span class='op'>=</span><span class='str'>'.'</span><span class='op'>,</span> <span class='nam'>raw</span><span class='op'>=</span><span class='nam'>False</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Create files from the dictionary d, in the directory named by dirpath.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>dirpath</span> <span class='op'>=</span> <span class='nam'>path</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>(</span><span class='nam'>basedir</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>for</span> <span class='nam'>name</span><span class='op'>,</span> <span class='nam'>contents</span> <span class='key'>in</span> <span class='nam'>d</span><span class='op'>.</span><span class='nam'>items</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>child</span> <span class='op'>=</span> <span class='nam'>dirpath</span> <span class='op'>/</span> <span class='nam'>name</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>contents</span><span class='op'>,</span> <span class='nam'>basestring</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>mode</span> <span class='op'>=</span> <span class='str'>'w'</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>raw</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>mode</span> <span class='op'>=</span> <span class='str'>'wb'</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>f</span> <span class='op'>=</span> <span class='nam'>open</span><span class='op'>(</span><span class='nam'>child</span><span class='op'>,</span> <span class='nam'>mode</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>raw</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>contents</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>contents</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>contents</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>exists</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>mkdir</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>contents</span><span class='op'>,</span> <span class='nam'>child</span><span class='op'>,</span> <span class='nam'>raw</span><span class='op'>=</span><span class='nam'>raw</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>def</span> <span class='nam'>removeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>,</span> <span class='nam'>basedir</span><span class='op'>=</span><span class='str'>'.'</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Remove the files created by makeFiles.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Directories are removed if they are empty.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>dirpath</span> <span class='op'>=</span> <span class='nam'>path</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>(</span><span class='nam'>basedir</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>for</span> <span class='nam'>name</span><span class='op'>,</span> <span class='nam'>contents</span> <span class='key'>in</span> <span class='nam'>d</span><span class='op'>.</span><span class='nam'>items</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>child</span> <span class='op'>=</span> <span class='nam'>dirpath</span> <span class='op'>/</span> <span class='nam'>name</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>contents</span><span class='op'>,</span> <span class='nam'>basestring</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>remove</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>removeFiles</span><span class='op'>(</span><span class='nam'>contents</span><span class='op'>,</span> <span class='nam'>child</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>files</span><span class='op'>(</span><span class='op'>)</span> <span class='key'>and</span> <span class='key'>not</span> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>dirs</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>rmdir</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='exc'><span class='key'>if</span> <span class='nam'>__name__</span> <span class='op'>==</span> <span class='str'>'__main__'</span><span class='op'>:</span> <span class='com'>#pragma: no cover</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Try it a little.</span><span class="strut"> </span></p>
-<p class='exc'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'test_makefiles'</span><span class='op'>:</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'hey.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This is hey.txt.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> It's very simple.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'subdir'</span><span class='op'>:</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'fooey'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> # Fooey</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Kablooey</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Ew.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='exc'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-
-</td>
-</tr>
-</table>
+ <table cellspacing='0' cellpadding='0'>
+ <tr>
+ <td class='linenos' valign='top'>
+<p id='n1' class='pln'>1</p>
+<p id='n2' class='pln'>2</p>
+<p id='n3' class='pln'>3</p>
+<p id='n4' class='pln'>4</p>
+<p id='n5' class='pln'>5</p>
+<p id='n6' class='pln'>6</p>
+<p id='n7' class='stm run hide_run'>7</p>
+<p id='n8' class='stm run hide_run'>8</p>
+<p id='n9' class='pln'>9</p>
+<p id='n10' class='stm run hide_run'>10</p>
+<p id='n11' class='stm run hide_run'>11</p>
+<p id='n12' class='pln'>12</p>
+<p id='n13' class='stm run hide_run'>13</p>
+<p id='n14' class='pln'>14</p>
+<p id='n15' class='pln'>15</p>
+<p id='n16' class='stm mis'>16</p>
+<p id='n17' class='stm mis'>17</p>
+<p id='n18' class='stm mis'>18</p>
+<p id='n19' class='stm mis'>19</p>
+<p id='n20' class='stm mis'>20</p>
+<p id='n21' class='stm mis'>21</p>
+<p id='n22' class='stm mis'>22</p>
+<p id='n23' class='stm mis'>23</p>
+<p id='n24' class='stm mis'>24</p>
+<p id='n25' class='stm mis'>25</p>
+<p id='n26' class='stm mis'>26</p>
+<p id='n27' class='stm mis'>27</p>
+<p id='n28' class='pln'>28</p>
+<p id='n29' class='stm mis'>29</p>
+<p id='n30' class='stm mis'>30</p>
+<p id='n31' class='stm mis'>31</p>
+<p id='n32' class='pln'>32</p>
+<p id='n33' class='stm run hide_run'>33</p>
+<p id='n34' class='pln'>34</p>
+<p id='n35' class='pln'>35</p>
+<p id='n36' class='pln'>36</p>
+<p id='n37' class='stm mis'>37</p>
+<p id='n38' class='stm mis'>38</p>
+<p id='n39' class='stm mis'>39</p>
+<p id='n40' class='stm mis'>40</p>
+<p id='n41' class='stm mis'>41</p>
+<p id='n42' class='pln'>42</p>
+<p id='n43' class='stm mis'>43</p>
+<p id='n44' class='stm mis'>44</p>
+<p id='n45' class='stm mis'>45</p>
+<p id='n46' class='pln'>46</p>
+<p id='n47' class='exc'>47</p>
+<p id='n48' class='pln'>48</p>
+<p id='n49' class='exc'>49</p>
+<p id='n50' class='pln'>50</p>
+<p id='n51' class='pln'>51</p>
+<p id='n52' class='pln'>52</p>
+<p id='n53' class='pln'>53</p>
+<p id='n54' class='pln'>54</p>
+<p id='n55' class='pln'>55</p>
+<p id='n56' class='pln'>56</p>
+<p id='n57' class='pln'>57</p>
+<p id='n58' class='pln'>58</p>
+<p id='n59' class='pln'>59</p>
+<p id='n60' class='pln'>60</p>
+<p id='n61' class='pln'>61</p>
+<p id='n62' class='pln'>62</p>
+<p id='n63' class='pln'>63</p>
+<p id='n64' class='exc'>64</p>
+
+ </td>
+ <td class='text' valign='top'>
+<p id='t1' class='pln'><span class='str'>""" Dictionary-to-filetree functions, to create test files for testing.</span><span class='strut'> </span></p>
+<p id='t2' class='pln'><span class='str'> http://nedbatchelder.com/code/cog</span><span class='strut'> </span></p>
+<p id='t3' class='pln'><span class='str'> </span><span class='strut'> </span></p>
+<p id='t4' class='pln'><span class='str'> Copyright 2004-2009, Ned Batchelder.</span><span class='strut'> </span></p>
+<p id='t5' class='pln'><span class='str'>"""</span><span class='strut'> </span></p>
+<p id='t6' class='pln'><span class='strut'> </span></p>
+<p id='t7' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>path</span> <span class='com'># Non-standard, from http://www.jorendorff.com/articles/python/path</span><span class='strut'> </span></p>
+<p id='t8' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>whiteutils</span> <span class='key'>import</span> <span class='nam'>reindentBlock</span><span class='strut'> </span></p>
+<p id='t9' class='pln'><span class='strut'> </span></p>
+<p id='t10' class='stm run hide_run'><span class='nam'>__version__</span> <span class='op'>=</span> <span class='str'>'1.0.20040126'</span><span class='strut'> </span></p>
+<p id='t11' class='stm run hide_run'><span class='nam'>__all__</span> <span class='op'>=</span> <span class='op'>[</span><span class='str'>'makeFiles'</span><span class='op'>,</span> <span class='str'>'removeFiles'</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t12' class='pln'><span class='strut'> </span></p>
+<p id='t13' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>,</span> <span class='nam'>basedir</span><span class='op'>=</span><span class='str'>'.'</span><span class='op'>,</span> <span class='nam'>raw</span><span class='op'>=</span><span class='nam'>False</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t14' class='pln'> <span class='str'>""" Create files from the dictionary d, in the directory named by dirpath.</span><span class='strut'> </span></p>
+<p id='t15' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t16' class='stm mis'> <span class='nam'>dirpath</span> <span class='op'>=</span> <span class='nam'>path</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>(</span><span class='nam'>basedir</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t17' class='stm mis'> <span class='key'>for</span> <span class='nam'>name</span><span class='op'>,</span> <span class='nam'>contents</span> <span class='key'>in</span> <span class='nam'>d</span><span class='op'>.</span><span class='nam'>items</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t18' class='stm mis'> <span class='nam'>child</span> <span class='op'>=</span> <span class='nam'>dirpath</span> <span class='op'>/</span> <span class='nam'>name</span><span class='strut'> </span></p>
+<p id='t19' class='stm mis'> <span class='key'>if</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>contents</span><span class='op'>,</span> <span class='nam'>basestring</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t20' class='stm mis'> <span class='nam'>mode</span> <span class='op'>=</span> <span class='str'>'w'</span><span class='strut'> </span></p>
+<p id='t21' class='stm mis'> <span class='key'>if</span> <span class='nam'>raw</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t22' class='stm mis'> <span class='nam'>mode</span> <span class='op'>=</span> <span class='str'>'wb'</span><span class='strut'> </span></p>
+<p id='t23' class='stm mis'> <span class='nam'>f</span> <span class='op'>=</span> <span class='nam'>open</span><span class='op'>(</span><span class='nam'>child</span><span class='op'>,</span> <span class='nam'>mode</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t24' class='stm mis'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>raw</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t25' class='stm mis'> <span class='nam'>contents</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>contents</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t26' class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>contents</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t27' class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t28' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t29' class='stm mis'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>exists</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t30' class='stm mis'> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>mkdir</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t31' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>contents</span><span class='op'>,</span> <span class='nam'>child</span><span class='op'>,</span> <span class='nam'>raw</span><span class='op'>=</span><span class='nam'>raw</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t32' class='pln'><span class='strut'> </span></p>
+<p id='t33' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>removeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>,</span> <span class='nam'>basedir</span><span class='op'>=</span><span class='str'>'.'</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t34' class='pln'> <span class='str'>""" Remove the files created by makeFiles.</span><span class='strut'> </span></p>
+<p id='t35' class='pln'><span class='str'> Directories are removed if they are empty.</span><span class='strut'> </span></p>
+<p id='t36' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t37' class='stm mis'> <span class='nam'>dirpath</span> <span class='op'>=</span> <span class='nam'>path</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>(</span><span class='nam'>basedir</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t38' class='stm mis'> <span class='key'>for</span> <span class='nam'>name</span><span class='op'>,</span> <span class='nam'>contents</span> <span class='key'>in</span> <span class='nam'>d</span><span class='op'>.</span><span class='nam'>items</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t39' class='stm mis'> <span class='nam'>child</span> <span class='op'>=</span> <span class='nam'>dirpath</span> <span class='op'>/</span> <span class='nam'>name</span><span class='strut'> </span></p>
+<p id='t40' class='stm mis'> <span class='key'>if</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>contents</span><span class='op'>,</span> <span class='nam'>basestring</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t41' class='stm mis'> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>remove</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t42' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t43' class='stm mis'> <span class='nam'>removeFiles</span><span class='op'>(</span><span class='nam'>contents</span><span class='op'>,</span> <span class='nam'>child</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t44' class='stm mis'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>files</span><span class='op'>(</span><span class='op'>)</span> <span class='key'>and</span> <span class='key'>not</span> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>dirs</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t45' class='stm mis'> <span class='nam'>child</span><span class='op'>.</span><span class='nam'>rmdir</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t46' class='pln'><span class='strut'> </span></p>
+<p id='t47' class='exc'><span class='key'>if</span> <span class='nam'>__name__</span> <span class='op'>==</span> <span class='str'>'__main__'</span><span class='op'>:</span> <span class='com'>#pragma: no cover</span><span class='strut'> </span></p>
+<p id='t48' class='pln'> <span class='com'># Try it a little.</span><span class='strut'> </span></p>
+<p id='t49' class='exc'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t50' class='pln'> <span class='str'>'test_makefiles'</span><span class='op'>:</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t51' class='pln'> <span class='str'>'hey.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t52' class='pln'><span class='str'> This is hey.txt.</span><span class='strut'> </span></p>
+<p id='t53' class='pln'><span class='str'> It's very simple.</span><span class='strut'> </span></p>
+<p id='t54' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t55' class='pln'> <span class='str'>'subdir'</span><span class='op'>:</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t56' class='pln'> <span class='str'>'fooey'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t57' class='pln'><span class='str'> # Fooey</span><span class='strut'> </span></p>
+<p id='t58' class='pln'><span class='str'> Kablooey</span><span class='strut'> </span></p>
+<p id='t59' class='pln'><span class='str'> Ew.</span><span class='strut'> </span></p>
+<p id='t60' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t61' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t62' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t63' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t64' class='exc'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+
+ </td>
+ </tr>
+ </table>
</div>
</body>
diff --git a/doc/sample_html/cogapp_test_cogapp.html b/doc/sample_html/cogapp_test_cogapp.html index 23355aea..024e94ca 100644 --- a/doc/sample_html/cogapp_test_cogapp.html +++ b/doc/sample_html/cogapp_test_cogapp.html @@ -1,24 +1,14 @@ -<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
-<title>Coverage for cogapp\test_cogapp</title>
-<link rel='stylesheet' href='style.css' type='text/css'>
-<script src='jquery-1.3.2.min.js'></script>
-<script>
-function toggle_lines(btn, cls) {
- var btn = $(btn);
- if (btn.hasClass("hide")) {
- $("#source ."+cls).removeClass("hide");
- btn.removeClass("hide");
- }
- else {
- $("#source ."+cls).addClass("hide");
- btn.addClass("hide");
- }
-}
-</script>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+ <title>Coverage for cogapp\test_cogapp: 33%</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
</head>
<body>
+
<div id='header'>
<div class='content'>
<h1>Coverage for <b>cogapp\test_cogapp</b> :
@@ -26,3944 +16,3947 @@ function toggle_lines(btn, cls) { </h1>
<h2 class='stats'>
587 statements
- <span class='run hide' onclick='toggle_lines(this, "run")'>195 run</span>
+ <span class='run hide_run' onclick='toggle_lines(this, "run")'>195 run</span>
<span class='exc' onclick='toggle_lines(this, "exc")'>17 excluded</span>
<span class='mis' onclick='toggle_lines(this, "mis")'>392 missing</span>
+
+ <span class='par run hide_run' onclick='toggle_lines(this, "par")'>0 partial</span>
+
</h2>
</div>
</div>
<div id='source'>
-<table cellspacing='0' cellpadding='0'>
-<tr>
-<td class='linenos' valign='top'>
-<p class='pln'>1</p>
-<p class='pln'>2</p>
-<p class='pln'>3</p>
-<p class='pln'>4</p>
-<p class='pln'>5</p>
-<p class='pln'>6</p>
-<p class='stm run hide'>7</p>
-<p class='stm run hide'>8</p>
-<p class='stm run hide'>9</p>
-<p class='stm run hide'>10</p>
-<p class='stm run hide'>11</p>
-<p class='stm run hide'>12</p>
-<p class='stm run hide'>13</p>
-<p class='stm run hide'>14</p>
-<p class='pln'>15</p>
-<p class='stm run hide'>16</p>
-<p class='pln'>17</p>
-<p class='pln'>18</p>
-<p class='stm run hide'>19</p>
-<p class='pln'>20</p>
-<p class='pln'>21</p>
-<p class='pln'>22</p>
-<p class='stm run hide'>23</p>
-<p class='stm run hide'>24</p>
-<p class='stm run hide'>25</p>
-<p class='stm run hide'>26</p>
-<p class='stm run hide'>27</p>
-<p class='pln'>28</p>
-<p class='exc'>29</p>
-<p class='stm run hide'>30</p>
-<p class='pln'>31</p>
-<p class='stm run hide'>32</p>
-<p class='exc'>33</p>
-<p class='pln'>34</p>
-<p class='exc'>35</p>
-<p class='exc'>36</p>
-<p class='exc'>37</p>
-<p class='exc'>38</p>
-<p class='exc'>39</p>
-<p class='exc'>40</p>
-<p class='exc'>41</p>
-<p class='pln'>42</p>
-<p class='stm run hide'>43</p>
-<p class='pln'>44</p>
-<p class='pln'>45</p>
-<p class='pln'>46</p>
-<p class='stm run hide'>47</p>
-<p class='stm run hide'>48</p>
-<p class='pln'>49</p>
-<p class='pln'>50</p>
-<p class='pln'>51</p>
-<p class='pln'>52</p>
-<p class='pln'>53</p>
-<p class='pln'>54</p>
-<p class='pln'>55</p>
-<p class='stm run hide'>56</p>
-<p class='stm run hide'>57</p>
-<p class='pln'>58</p>
-<p class='stm run hide'>59</p>
-<p class='stm run hide'>60</p>
-<p class='pln'>61</p>
-<p class='pln'>62</p>
-<p class='pln'>63</p>
-<p class='pln'>64</p>
-<p class='pln'>65</p>
-<p class='pln'>66</p>
-<p class='pln'>67</p>
-<p class='pln'>68</p>
-<p class='pln'>69</p>
-<p class='pln'>70</p>
-<p class='pln'>71</p>
-<p class='stm run hide'>72</p>
-<p class='pln'>73</p>
-<p class='pln'>74</p>
-<p class='pln'>75</p>
-<p class='pln'>76</p>
-<p class='pln'>77</p>
-<p class='pln'>78</p>
-<p class='pln'>79</p>
-<p class='pln'>80</p>
-<p class='pln'>81</p>
-<p class='pln'>82</p>
-<p class='pln'>83</p>
-<p class='pln'>84</p>
-<p class='pln'>85</p>
-<p class='stm run hide'>86</p>
-<p class='pln'>87</p>
-<p class='stm run hide'>88</p>
-<p class='pln'>89</p>
-<p class='pln'>90</p>
-<p class='stm run hide'>91</p>
-<p class='pln'>92</p>
-<p class='pln'>93</p>
-<p class='pln'>94</p>
-<p class='pln'>95</p>
-<p class='pln'>96</p>
-<p class='pln'>97</p>
-<p class='pln'>98</p>
-<p class='stm run hide'>99</p>
-<p class='stm run hide'>100</p>
-<p class='pln'>101</p>
-<p class='stm run hide'>102</p>
-<p class='pln'>103</p>
-<p class='stm run hide'>104</p>
-<p class='pln'>105</p>
-<p class='pln'>106</p>
-<p class='pln'>107</p>
-<p class='pln'>108</p>
-<p class='pln'>109</p>
-<p class='pln'>110</p>
-<p class='pln'>111</p>
-<p class='pln'>112</p>
-<p class='pln'>113</p>
-<p class='pln'>114</p>
-<p class='pln'>115</p>
-<p class='pln'>116</p>
-<p class='pln'>117</p>
-<p class='pln'>118</p>
-<p class='pln'>119</p>
-<p class='pln'>120</p>
-<p class='pln'>121</p>
-<p class='pln'>122</p>
-<p class='stm run hide'>123</p>
-<p class='stm run hide'>124</p>
-<p class='pln'>125</p>
-<p class='stm run hide'>126</p>
-<p class='stm run hide'>127</p>
-<p class='pln'>128</p>
-<p class='pln'>129</p>
-<p class='pln'>130</p>
-<p class='pln'>131</p>
-<p class='pln'>132</p>
-<p class='pln'>133</p>
-<p class='pln'>134</p>
-<p class='pln'>135</p>
-<p class='pln'>136</p>
-<p class='pln'>137</p>
-<p class='pln'>138</p>
-<p class='pln'>139</p>
-<p class='pln'>140</p>
-<p class='stm run hide'>141</p>
-<p class='stm run hide'>142</p>
-<p class='pln'>143</p>
-<p class='stm run hide'>144</p>
-<p class='stm run hide'>145</p>
-<p class='pln'>146</p>
-<p class='pln'>147</p>
-<p class='pln'>148</p>
-<p class='pln'>149</p>
-<p class='pln'>150</p>
-<p class='pln'>151</p>
-<p class='pln'>152</p>
-<p class='pln'>153</p>
-<p class='pln'>154</p>
-<p class='pln'>155</p>
-<p class='pln'>156</p>
-<p class='pln'>157</p>
-<p class='pln'>158</p>
-<p class='pln'>159</p>
-<p class='stm run hide'>160</p>
-<p class='stm run hide'>161</p>
-<p class='pln'>162</p>
-<p class='stm run hide'>163</p>
-<p class='pln'>164</p>
-<p class='pln'>165</p>
-<p class='stm run hide'>166</p>
-<p class='pln'>167</p>
-<p class='pln'>168</p>
-<p class='pln'>169</p>
-<p class='pln'>170</p>
-<p class='pln'>171</p>
-<p class='pln'>172</p>
-<p class='pln'>173</p>
-<p class='pln'>174</p>
-<p class='pln'>175</p>
-<p class='pln'>176</p>
-<p class='pln'>177</p>
-<p class='stm run hide'>178</p>
-<p class='stm run hide'>179</p>
-<p class='pln'>180</p>
-<p class='stm run hide'>181</p>
-<p class='stm run hide'>182</p>
-<p class='pln'>183</p>
-<p class='pln'>184</p>
-<p class='pln'>185</p>
-<p class='pln'>186</p>
-<p class='pln'>187</p>
-<p class='pln'>188</p>
-<p class='pln'>189</p>
-<p class='pln'>190</p>
-<p class='pln'>191</p>
-<p class='pln'>192</p>
-<p class='pln'>193</p>
-<p class='pln'>194</p>
-<p class='pln'>195</p>
-<p class='stm run hide'>196</p>
-<p class='stm run hide'>197</p>
-<p class='pln'>198</p>
-<p class='stm run hide'>199</p>
-<p class='stm run hide'>200</p>
-<p class='pln'>201</p>
-<p class='pln'>202</p>
-<p class='pln'>203</p>
-<p class='pln'>204</p>
-<p class='pln'>205</p>
-<p class='pln'>206</p>
-<p class='pln'>207</p>
-<p class='pln'>208</p>
-<p class='pln'>209</p>
-<p class='pln'>210</p>
-<p class='pln'>211</p>
-<p class='stm run hide'>212</p>
-<p class='stm run hide'>213</p>
-<p class='pln'>214</p>
-<p class='stm run hide'>215</p>
-<p class='stm run hide'>216</p>
-<p class='pln'>217</p>
-<p class='pln'>218</p>
-<p class='pln'>219</p>
-<p class='pln'>220</p>
-<p class='pln'>221</p>
-<p class='pln'>222</p>
-<p class='pln'>223</p>
-<p class='pln'>224</p>
-<p class='pln'>225</p>
-<p class='pln'>226</p>
-<p class='pln'>227</p>
-<p class='pln'>228</p>
-<p class='stm run hide'>229</p>
-<p class='stm run hide'>230</p>
-<p class='pln'>231</p>
-<p class='stm run hide'>232</p>
-<p class='stm run hide'>233</p>
-<p class='pln'>234</p>
-<p class='pln'>235</p>
-<p class='pln'>236</p>
-<p class='pln'>237</p>
-<p class='pln'>238</p>
-<p class='pln'>239</p>
-<p class='pln'>240</p>
-<p class='pln'>241</p>
-<p class='pln'>242</p>
-<p class='pln'>243</p>
-<p class='pln'>244</p>
-<p class='pln'>245</p>
-<p class='pln'>246</p>
-<p class='stm run hide'>247</p>
-<p class='stm run hide'>248</p>
-<p class='pln'>249</p>
-<p class='stm run hide'>250</p>
-<p class='pln'>251</p>
-<p class='pln'>252</p>
-<p class='stm run hide'>253</p>
-<p class='pln'>254</p>
-<p class='pln'>255</p>
-<p class='pln'>256</p>
-<p class='pln'>257</p>
-<p class='pln'>258</p>
-<p class='pln'>259</p>
-<p class='pln'>260</p>
-<p class='pln'>261</p>
-<p class='pln'>262</p>
-<p class='pln'>263</p>
-<p class='pln'>264</p>
-<p class='stm run hide'>265</p>
-<p class='stm run hide'>266</p>
-<p class='pln'>267</p>
-<p class='stm run hide'>268</p>
-<p class='pln'>269</p>
-<p class='stm run hide'>270</p>
-<p class='pln'>271</p>
-<p class='pln'>272</p>
-<p class='pln'>273</p>
-<p class='pln'>274</p>
-<p class='pln'>275</p>
-<p class='pln'>276</p>
-<p class='pln'>277</p>
-<p class='pln'>278</p>
-<p class='stm run hide'>279</p>
-<p class='stm run hide'>280</p>
-<p class='pln'>281</p>
-<p class='stm run hide'>282</p>
-<p class='pln'>283</p>
-<p class='pln'>284</p>
-<p class='pln'>285</p>
-<p class='stm run hide'>286</p>
-<p class='pln'>287</p>
-<p class='pln'>288</p>
-<p class='pln'>289</p>
-<p class='pln'>290</p>
-<p class='pln'>291</p>
-<p class='pln'>292</p>
-<p class='pln'>293</p>
-<p class='pln'>294</p>
-<p class='pln'>295</p>
-<p class='pln'>296</p>
-<p class='pln'>297</p>
-<p class='pln'>298</p>
-<p class='stm run hide'>299</p>
-<p class='stm run hide'>300</p>
-<p class='pln'>301</p>
-<p class='stm run hide'>302</p>
-<p class='pln'>303</p>
-<p class='pln'>304</p>
-<p class='pln'>305</p>
-<p class='stm run hide'>306</p>
-<p class='pln'>307</p>
-<p class='pln'>308</p>
-<p class='pln'>309</p>
-<p class='pln'>310</p>
-<p class='pln'>311</p>
-<p class='pln'>312</p>
-<p class='pln'>313</p>
-<p class='pln'>314</p>
-<p class='pln'>315</p>
-<p class='pln'>316</p>
-<p class='pln'>317</p>
-<p class='pln'>318</p>
-<p class='pln'>319</p>
-<p class='pln'>320</p>
-<p class='pln'>321</p>
-<p class='pln'>322</p>
-<p class='pln'>323</p>
-<p class='stm run hide'>324</p>
-<p class='stm run hide'>325</p>
-<p class='pln'>326</p>
-<p class='stm run hide'>327</p>
-<p class='stm run hide'>328</p>
-<p class='pln'>329</p>
-<p class='pln'>330</p>
-<p class='pln'>331</p>
-<p class='pln'>332</p>
-<p class='pln'>333</p>
-<p class='pln'>334</p>
-<p class='pln'>335</p>
-<p class='pln'>336</p>
-<p class='pln'>337</p>
-<p class='pln'>338</p>
-<p class='pln'>339</p>
-<p class='pln'>340</p>
-<p class='pln'>341</p>
-<p class='pln'>342</p>
-<p class='stm run hide'>343</p>
-<p class='stm run hide'>344</p>
-<p class='pln'>345</p>
-<p class='stm run hide'>346</p>
-<p class='stm run hide'>347</p>
-<p class='pln'>348</p>
-<p class='pln'>349</p>
-<p class='pln'>350</p>
-<p class='pln'>351</p>
-<p class='pln'>352</p>
-<p class='pln'>353</p>
-<p class='pln'>354</p>
-<p class='stm run hide'>355</p>
-<p class='pln'>356</p>
-<p class='pln'>357</p>
-<p class='pln'>358</p>
-<p class='pln'>359</p>
-<p class='pln'>360</p>
-<p class='pln'>361</p>
-<p class='pln'>362</p>
-<p class='stm run hide'>363</p>
-<p class='stm run hide'>364</p>
-<p class='pln'>365</p>
-<p class='stm run hide'>366</p>
-<p class='stm run hide'>367</p>
-<p class='pln'>368</p>
-<p class='pln'>369</p>
-<p class='pln'>370</p>
-<p class='pln'>371</p>
-<p class='pln'>372</p>
-<p class='pln'>373</p>
-<p class='stm run hide'>374</p>
-<p class='pln'>375</p>
-<p class='pln'>376</p>
-<p class='pln'>377</p>
-<p class='pln'>378</p>
-<p class='stm run hide'>379</p>
-<p class='stm run hide'>380</p>
-<p class='pln'>381</p>
-<p class='pln'>382</p>
-<p class='pln'>383</p>
-<p class='pln'>384</p>
-<p class='pln'>385</p>
-<p class='pln'>386</p>
-<p class='pln'>387</p>
-<p class='pln'>388</p>
-<p class='pln'>389</p>
-<p class='stm run hide'>390</p>
-<p class='pln'>391</p>
-<p class='pln'>392</p>
-<p class='pln'>393</p>
-<p class='pln'>394</p>
-<p class='pln'>395</p>
-<p class='pln'>396</p>
-<p class='pln'>397</p>
-<p class='pln'>398</p>
-<p class='pln'>399</p>
-<p class='pln'>400</p>
-<p class='stm run hide'>401</p>
-<p class='stm run hide'>402</p>
-<p class='pln'>403</p>
-<p class='stm run hide'>404</p>
-<p class='pln'>405</p>
-<p class='pln'>406</p>
-<p class='pln'>407</p>
-<p class='stm run hide'>408</p>
-<p class='stm mis'>409</p>
-<p class='stm mis'>410</p>
-<p class='stm mis'>411</p>
-<p class='stm mis'>412</p>
-<p class='stm mis'>413</p>
-<p class='stm mis'>414</p>
-<p class='stm mis'>415</p>
-<p class='pln'>416</p>
-<p class='stm run hide'>417</p>
-<p class='stm mis'>418</p>
-<p class='stm mis'>419</p>
-<p class='stm mis'>420</p>
-<p class='stm mis'>421</p>
-<p class='stm mis'>422</p>
-<p class='stm mis'>423</p>
-<p class='stm mis'>424</p>
-<p class='stm mis'>425</p>
-<p class='stm mis'>426</p>
-<p class='pln'>427</p>
-<p class='stm run hide'>428</p>
-<p class='pln'>429</p>
-<p class='stm mis'>430</p>
-<p class='stm mis'>431</p>
-<p class='stm mis'>432</p>
-<p class='stm mis'>433</p>
-<p class='stm mis'>434</p>
-<p class='pln'>435</p>
-<p class='stm run hide'>436</p>
-<p class='pln'>437</p>
-<p class='pln'>438</p>
-<p class='pln'>439</p>
-<p class='pln'>440</p>
-<p class='stm run hide'>441</p>
-<p class='stm mis'>442</p>
-<p class='stm mis'>443</p>
-<p class='pln'>444</p>
-<p class='pln'>445</p>
-<p class='pln'>446</p>
-<p class='stm run hide'>447</p>
-<p class='stm mis'>448</p>
-<p class='pln'>449</p>
-<p class='pln'>450</p>
-<p class='pln'>451</p>
-<p class='pln'>452</p>
-<p class='stm mis'>453</p>
-<p class='pln'>454</p>
-<p class='stm run hide'>455</p>
-<p class='stm mis'>456</p>
-<p class='pln'>457</p>
-<p class='pln'>458</p>
-<p class='pln'>459</p>
-<p class='pln'>460</p>
-<p class='pln'>461</p>
-<p class='stm mis'>462</p>
-<p class='pln'>463</p>
-<p class='stm mis'>464</p>
-<p class='pln'>465</p>
-<p class='pln'>466</p>
-<p class='pln'>467</p>
-<p class='pln'>468</p>
-<p class='pln'>469</p>
-<p class='pln'>470</p>
-<p class='pln'>471</p>
-<p class='pln'>472</p>
-<p class='stm mis'>473</p>
-<p class='pln'>474</p>
-<p class='stm run hide'>475</p>
-<p class='stm mis'>476</p>
-<p class='pln'>477</p>
-<p class='pln'>478</p>
-<p class='stm mis'>479</p>
-<p class='pln'>480</p>
-<p class='stm mis'>481</p>
-<p class='pln'>482</p>
-<p class='pln'>483</p>
-<p class='pln'>484</p>
-<p class='pln'>485</p>
-<p class='pln'>486</p>
-<p class='pln'>487</p>
-<p class='stm mis'>488</p>
-<p class='pln'>489</p>
-<p class='stm run hide'>490</p>
-<p class='stm mis'>491</p>
-<p class='pln'>492</p>
-<p class='pln'>493</p>
-<p class='stm mis'>494</p>
-<p class='pln'>495</p>
-<p class='stm mis'>496</p>
-<p class='pln'>497</p>
-<p class='pln'>498</p>
-<p class='pln'>499</p>
-<p class='pln'>500</p>
-<p class='pln'>501</p>
-<p class='pln'>502</p>
-<p class='stm mis'>503</p>
-<p class='pln'>504</p>
-<p class='stm run hide'>505</p>
-<p class='stm mis'>506</p>
-<p class='pln'>507</p>
-<p class='pln'>508</p>
-<p class='pln'>509</p>
-<p class='pln'>510</p>
-<p class='stm mis'>511</p>
-<p class='pln'>512</p>
-<p class='stm mis'>513</p>
-<p class='pln'>514</p>
-<p class='pln'>515</p>
-<p class='pln'>516</p>
-<p class='pln'>517</p>
-<p class='pln'>518</p>
-<p class='pln'>519</p>
-<p class='pln'>520</p>
-<p class='pln'>521</p>
-<p class='stm mis'>522</p>
-<p class='pln'>523</p>
-<p class='stm run hide'>524</p>
-<p class='stm mis'>525</p>
-<p class='pln'>526</p>
-<p class='pln'>527</p>
-<p class='pln'>528</p>
-<p class='pln'>529</p>
-<p class='pln'>530</p>
-<p class='pln'>531</p>
-<p class='stm mis'>532</p>
-<p class='pln'>533</p>
-<p class='stm mis'>534</p>
-<p class='pln'>535</p>
-<p class='pln'>536</p>
-<p class='pln'>537</p>
-<p class='pln'>538</p>
-<p class='pln'>539</p>
-<p class='pln'>540</p>
-<p class='pln'>541</p>
-<p class='pln'>542</p>
-<p class='pln'>543</p>
-<p class='pln'>544</p>
-<p class='stm mis'>545</p>
-<p class='pln'>546</p>
-<p class='stm run hide'>547</p>
-<p class='stm mis'>548</p>
-<p class='pln'>549</p>
-<p class='pln'>550</p>
-<p class='pln'>551</p>
-<p class='pln'>552</p>
-<p class='pln'>553</p>
-<p class='pln'>554</p>
-<p class='stm mis'>555</p>
-<p class='pln'>556</p>
-<p class='stm mis'>557</p>
-<p class='pln'>558</p>
-<p class='pln'>559</p>
-<p class='pln'>560</p>
-<p class='pln'>561</p>
-<p class='pln'>562</p>
-<p class='pln'>563</p>
-<p class='pln'>564</p>
-<p class='pln'>565</p>
-<p class='pln'>566</p>
-<p class='pln'>567</p>
-<p class='stm mis'>568</p>
-<p class='pln'>569</p>
-<p class='stm run hide'>570</p>
-<p class='pln'>571</p>
-<p class='pln'>572</p>
-<p class='pln'>573</p>
-<p class='stm run hide'>574</p>
-<p class='stm mis'>575</p>
-<p class='pln'>576</p>
-<p class='pln'>577</p>
-<p class='pln'>578</p>
-<p class='pln'>579</p>
-<p class='stm mis'>580</p>
-<p class='stm mis'>581</p>
-<p class='pln'>582</p>
-<p class='pln'>583</p>
-<p class='pln'>584</p>
-<p class='stm run hide'>585</p>
-<p class='stm mis'>586</p>
-<p class='pln'>587</p>
-<p class='pln'>588</p>
-<p class='pln'>589</p>
-<p class='pln'>590</p>
-<p class='stm mis'>591</p>
-<p class='stm mis'>592</p>
-<p class='pln'>593</p>
-<p class='pln'>594</p>
-<p class='pln'>595</p>
-<p class='stm run hide'>596</p>
-<p class='stm mis'>597</p>
-<p class='pln'>598</p>
-<p class='pln'>599</p>
-<p class='pln'>600</p>
-<p class='pln'>601</p>
-<p class='pln'>602</p>
-<p class='pln'>603</p>
-<p class='pln'>604</p>
-<p class='pln'>605</p>
-<p class='pln'>606</p>
-<p class='pln'>607</p>
-<p class='pln'>608</p>
-<p class='pln'>609</p>
-<p class='pln'>610</p>
-<p class='stm mis'>611</p>
-<p class='stm mis'>612</p>
-<p class='pln'>613</p>
-<p class='stm run hide'>614</p>
-<p class='pln'>615</p>
-<p class='pln'>616</p>
-<p class='pln'>617</p>
-<p class='pln'>618</p>
-<p class='stm run hide'>619</p>
-<p class='pln'>620</p>
-<p class='pln'>621</p>
-<p class='pln'>622</p>
-<p class='stm mis'>623</p>
-<p class='stm mis'>624</p>
-<p class='stm mis'>625</p>
-<p class='pln'>626</p>
-<p class='stm run hide'>627</p>
-<p class='stm mis'>628</p>
-<p class='stm mis'>629</p>
-<p class='stm mis'>630</p>
-<p class='pln'>631</p>
-<p class='stm run hide'>632</p>
-<p class='stm mis'>633</p>
-<p class='stm mis'>634</p>
-<p class='stm mis'>635</p>
-<p class='stm mis'>636</p>
-<p class='stm mis'>637</p>
-<p class='pln'>638</p>
-<p class='stm run hide'>639</p>
-<p class='pln'>640</p>
-<p class='stm mis'>641</p>
-<p class='stm mis'>642</p>
-<p class='stm mis'>643</p>
-<p class='stm mis'>644</p>
-<p class='stm mis'>645</p>
-<p class='pln'>646</p>
-<p class='stm run hide'>647</p>
-<p class='pln'>648</p>
-<p class='stm mis'>649</p>
-<p class='stm mis'>650</p>
-<p class='stm mis'>651</p>
-<p class='stm mis'>652</p>
-<p class='stm mis'>653</p>
-<p class='pln'>654</p>
-<p class='stm run hide'>655</p>
-<p class='pln'>656</p>
-<p class='stm mis'>657</p>
-<p class='stm mis'>658</p>
-<p class='stm mis'>659</p>
-<p class='stm mis'>660</p>
-<p class='stm mis'>661</p>
-<p class='pln'>662</p>
-<p class='stm run hide'>663</p>
-<p class='pln'>664</p>
-<p class='stm mis'>665</p>
-<p class='stm mis'>666</p>
-<p class='stm mis'>667</p>
-<p class='stm mis'>668</p>
-<p class='stm mis'>669</p>
-<p class='pln'>670</p>
-<p class='stm run hide'>671</p>
-<p class='pln'>672</p>
-<p class='pln'>673</p>
-<p class='stm mis'>674</p>
-<p class='stm mis'>675</p>
-<p class='stm mis'>676</p>
-<p class='stm mis'>677</p>
-<p class='stm mis'>678</p>
-<p class='stm mis'>679</p>
-<p class='pln'>680</p>
-<p class='stm run hide'>681</p>
-<p class='pln'>682</p>
-<p class='stm run hide'>683</p>
-<p class='pln'>684</p>
-<p class='pln'>685</p>
-<p class='pln'>686</p>
-<p class='stm mis'>687</p>
-<p class='stm mis'>688</p>
-<p class='stm mis'>689</p>
-<p class='pln'>690</p>
-<p class='stm run hide'>691</p>
-<p class='pln'>692</p>
-<p class='stm mis'>693</p>
-<p class='stm mis'>694</p>
-<p class='stm mis'>695</p>
-<p class='stm mis'>696</p>
-<p class='stm mis'>697</p>
-<p class='pln'>698</p>
-<p class='stm run hide'>699</p>
-<p class='stm mis'>700</p>
-<p class='pln'>701</p>
-<p class='stm mis'>702</p>
-<p class='pln'>703</p>
-<p class='stm run hide'>704</p>
-<p class='stm mis'>705</p>
-<p class='pln'>706</p>
-<p class='stm run hide'>707</p>
-<p class='stm mis'>708</p>
-<p class='stm mis'>709</p>
-<p class='stm mis'>710</p>
-<p class='stm mis'>711</p>
-<p class='pln'>712</p>
-<p class='stm mis'>713</p>
-<p class='stm mis'>714</p>
-<p class='pln'>715</p>
-<p class='pln'>716</p>
-<p class='stm run hide'>717</p>
-<p class='pln'>718</p>
-<p class='stm run hide'>719</p>
-<p class='pln'>720</p>
-<p class='stm mis'>721</p>
-<p class='stm mis'>722</p>
-<p class='stm mis'>723</p>
-<p class='stm mis'>724</p>
-<p class='stm mis'>725</p>
-<p class='pln'>726</p>
-<p class='stm run hide'>727</p>
-<p class='stm mis'>728</p>
-<p class='pln'>729</p>
-<p class='pln'>730</p>
-<p class='pln'>731</p>
-<p class='pln'>732</p>
-<p class='pln'>733</p>
-<p class='stm mis'>734</p>
-<p class='stm mis'>735</p>
-<p class='pln'>736</p>
-<p class='stm run hide'>737</p>
-<p class='stm mis'>738</p>
-<p class='stm mis'>739</p>
-<p class='stm mis'>740</p>
-<p class='pln'>741</p>
-<p class='stm run hide'>742</p>
-<p class='stm mis'>743</p>
-<p class='stm mis'>744</p>
-<p class='stm mis'>745</p>
-<p class='stm mis'>746</p>
-<p class='pln'>747</p>
-<p class='stm run hide'>748</p>
-<p class='pln'>749</p>
-<p class='stm mis'>750</p>
-<p class='stm mis'>751</p>
-<p class='stm mis'>752</p>
-<p class='stm mis'>753</p>
-<p class='pln'>754</p>
-<p class='stm run hide'>755</p>
-<p class='stm mis'>756</p>
-<p class='pln'>757</p>
-<p class='pln'>758</p>
-<p class='pln'>759</p>
-<p class='pln'>760</p>
-<p class='pln'>761</p>
-<p class='stm mis'>762</p>
-<p class='stm mis'>763</p>
-<p class='pln'>764</p>
-<p class='stm run hide'>765</p>
-<p class='stm mis'>766</p>
-<p class='pln'>767</p>
-<p class='pln'>768</p>
-<p class='pln'>769</p>
-<p class='pln'>770</p>
-<p class='pln'>771</p>
-<p class='pln'>772</p>
-<p class='pln'>773</p>
-<p class='pln'>774</p>
-<p class='pln'>775</p>
-<p class='pln'>776</p>
-<p class='pln'>777</p>
-<p class='pln'>778</p>
-<p class='pln'>779</p>
-<p class='pln'>780</p>
-<p class='pln'>781</p>
-<p class='pln'>782</p>
-<p class='pln'>783</p>
-<p class='pln'>784</p>
-<p class='pln'>785</p>
-<p class='pln'>786</p>
-<p class='pln'>787</p>
-<p class='pln'>788</p>
-<p class='stm mis'>789</p>
-<p class='stm mis'>790</p>
-<p class='pln'>791</p>
-<p class='pln'>792</p>
-<p class='stm mis'>793</p>
-<p class='stm mis'>794</p>
-<p class='stm mis'>795</p>
-<p class='pln'>796</p>
-<p class='stm run hide'>797</p>
-<p class='stm mis'>798</p>
-<p class='stm mis'>799</p>
-<p class='pln'>800</p>
-<p class='pln'>801</p>
-<p class='stm run hide'>802</p>
-<p class='pln'>803</p>
-<p class='stm run hide'>804</p>
-<p class='stm mis'>805</p>
-<p class='pln'>806</p>
-<p class='pln'>807</p>
-<p class='pln'>808</p>
-<p class='pln'>809</p>
-<p class='pln'>810</p>
-<p class='pln'>811</p>
-<p class='pln'>812</p>
-<p class='pln'>813</p>
-<p class='pln'>814</p>
-<p class='pln'>815</p>
-<p class='pln'>816</p>
-<p class='pln'>817</p>
-<p class='pln'>818</p>
-<p class='pln'>819</p>
-<p class='pln'>820</p>
-<p class='pln'>821</p>
-<p class='pln'>822</p>
-<p class='pln'>823</p>
-<p class='pln'>824</p>
-<p class='pln'>825</p>
-<p class='pln'>826</p>
-<p class='pln'>827</p>
-<p class='pln'>828</p>
-<p class='pln'>829</p>
-<p class='stm mis'>830</p>
-<p class='stm mis'>831</p>
-<p class='stm mis'>832</p>
-<p class='stm mis'>833</p>
-<p class='stm mis'>834</p>
-<p class='pln'>835</p>
-<p class='stm run hide'>836</p>
-<p class='pln'>837</p>
-<p class='stm mis'>838</p>
-<p class='pln'>839</p>
-<p class='pln'>840</p>
-<p class='pln'>841</p>
-<p class='pln'>842</p>
-<p class='pln'>843</p>
-<p class='pln'>844</p>
-<p class='pln'>845</p>
-<p class='pln'>846</p>
-<p class='pln'>847</p>
-<p class='pln'>848</p>
-<p class='pln'>849</p>
-<p class='pln'>850</p>
-<p class='pln'>851</p>
-<p class='pln'>852</p>
-<p class='pln'>853</p>
-<p class='pln'>854</p>
-<p class='pln'>855</p>
-<p class='pln'>856</p>
-<p class='pln'>857</p>
-<p class='pln'>858</p>
-<p class='pln'>859</p>
-<p class='pln'>860</p>
-<p class='pln'>861</p>
-<p class='pln'>862</p>
-<p class='stm mis'>863</p>
-<p class='stm mis'>864</p>
-<p class='stm mis'>865</p>
-<p class='pln'>866</p>
-<p class='stm run hide'>867</p>
-<p class='stm mis'>868</p>
-<p class='pln'>869</p>
-<p class='pln'>870</p>
-<p class='pln'>871</p>
-<p class='pln'>872</p>
-<p class='pln'>873</p>
-<p class='pln'>874</p>
-<p class='pln'>875</p>
-<p class='pln'>876</p>
-<p class='pln'>877</p>
-<p class='pln'>878</p>
-<p class='pln'>879</p>
-<p class='pln'>880</p>
-<p class='pln'>881</p>
-<p class='pln'>882</p>
-<p class='pln'>883</p>
-<p class='pln'>884</p>
-<p class='pln'>885</p>
-<p class='pln'>886</p>
-<p class='pln'>887</p>
-<p class='pln'>888</p>
-<p class='pln'>889</p>
-<p class='pln'>890</p>
-<p class='pln'>891</p>
-<p class='pln'>892</p>
-<p class='pln'>893</p>
-<p class='pln'>894</p>
-<p class='pln'>895</p>
-<p class='pln'>896</p>
-<p class='pln'>897</p>
-<p class='pln'>898</p>
-<p class='pln'>899</p>
-<p class='pln'>900</p>
-<p class='pln'>901</p>
-<p class='pln'>902</p>
-<p class='pln'>903</p>
-<p class='pln'>904</p>
-<p class='pln'>905</p>
-<p class='pln'>906</p>
-<p class='stm mis'>907</p>
-<p class='stm mis'>908</p>
-<p class='stm mis'>909</p>
-<p class='stm mis'>910</p>
-<p class='stm mis'>911</p>
-<p class='stm mis'>912</p>
-<p class='pln'>913</p>
-<p class='stm run hide'>914</p>
-<p class='stm mis'>915</p>
-<p class='pln'>916</p>
-<p class='pln'>917</p>
-<p class='pln'>918</p>
-<p class='pln'>919</p>
-<p class='pln'>920</p>
-<p class='pln'>921</p>
-<p class='pln'>922</p>
-<p class='pln'>923</p>
-<p class='pln'>924</p>
-<p class='pln'>925</p>
-<p class='pln'>926</p>
-<p class='pln'>927</p>
-<p class='pln'>928</p>
-<p class='pln'>929</p>
-<p class='pln'>930</p>
-<p class='pln'>931</p>
-<p class='pln'>932</p>
-<p class='pln'>933</p>
-<p class='pln'>934</p>
-<p class='pln'>935</p>
-<p class='pln'>936</p>
-<p class='pln'>937</p>
-<p class='pln'>938</p>
-<p class='pln'>939</p>
-<p class='pln'>940</p>
-<p class='pln'>941</p>
-<p class='pln'>942</p>
-<p class='pln'>943</p>
-<p class='pln'>944</p>
-<p class='pln'>945</p>
-<p class='pln'>946</p>
-<p class='pln'>947</p>
-<p class='pln'>948</p>
-<p class='pln'>949</p>
-<p class='pln'>950</p>
-<p class='pln'>951</p>
-<p class='pln'>952</p>
-<p class='pln'>953</p>
-<p class='pln'>954</p>
-<p class='pln'>955</p>
-<p class='pln'>956</p>
-<p class='pln'>957</p>
-<p class='stm mis'>958</p>
-<p class='stm mis'>959</p>
-<p class='stm mis'>960</p>
-<p class='stm mis'>961</p>
-<p class='stm mis'>962</p>
-<p class='stm mis'>963</p>
-<p class='pln'>964</p>
-<p class='stm run hide'>965</p>
-<p class='stm mis'>966</p>
-<p class='pln'>967</p>
-<p class='pln'>968</p>
-<p class='pln'>969</p>
-<p class='pln'>970</p>
-<p class='pln'>971</p>
-<p class='pln'>972</p>
-<p class='pln'>973</p>
-<p class='pln'>974</p>
-<p class='pln'>975</p>
-<p class='pln'>976</p>
-<p class='pln'>977</p>
-<p class='pln'>978</p>
-<p class='pln'>979</p>
-<p class='pln'>980</p>
-<p class='pln'>981</p>
-<p class='pln'>982</p>
-<p class='pln'>983</p>
-<p class='pln'>984</p>
-<p class='pln'>985</p>
-<p class='pln'>986</p>
-<p class='pln'>987</p>
-<p class='pln'>988</p>
-<p class='pln'>989</p>
-<p class='pln'>990</p>
-<p class='pln'>991</p>
-<p class='pln'>992</p>
-<p class='pln'>993</p>
-<p class='pln'>994</p>
-<p class='pln'>995</p>
-<p class='pln'>996</p>
-<p class='pln'>997</p>
-<p class='pln'>998</p>
-<p class='pln'>999</p>
-<p class='pln'>1000</p>
-<p class='pln'>1001</p>
-<p class='stm mis'>1002</p>
-<p class='stm mis'>1003</p>
-<p class='stm mis'>1004</p>
-<p class='stm mis'>1005</p>
-<p class='pln'>1006</p>
-<p class='stm run hide'>1007</p>
-<p class='stm mis'>1008</p>
-<p class='pln'>1009</p>
-<p class='pln'>1010</p>
-<p class='pln'>1011</p>
-<p class='pln'>1012</p>
-<p class='pln'>1013</p>
-<p class='pln'>1014</p>
-<p class='pln'>1015</p>
-<p class='pln'>1016</p>
-<p class='pln'>1017</p>
-<p class='pln'>1018</p>
-<p class='pln'>1019</p>
-<p class='pln'>1020</p>
-<p class='pln'>1021</p>
-<p class='pln'>1022</p>
-<p class='pln'>1023</p>
-<p class='stm mis'>1024</p>
-<p class='stm mis'>1025</p>
-<p class='pln'>1026</p>
-<p class='stm run hide'>1027</p>
-<p class='stm mis'>1028</p>
-<p class='pln'>1029</p>
-<p class='pln'>1030</p>
-<p class='pln'>1031</p>
-<p class='pln'>1032</p>
-<p class='pln'>1033</p>
-<p class='pln'>1034</p>
-<p class='pln'>1035</p>
-<p class='pln'>1036</p>
-<p class='pln'>1037</p>
-<p class='pln'>1038</p>
-<p class='pln'>1039</p>
-<p class='pln'>1040</p>
-<p class='pln'>1041</p>
-<p class='pln'>1042</p>
-<p class='pln'>1043</p>
-<p class='pln'>1044</p>
-<p class='pln'>1045</p>
-<p class='pln'>1046</p>
-<p class='pln'>1047</p>
-<p class='pln'>1048</p>
-<p class='pln'>1049</p>
-<p class='pln'>1050</p>
-<p class='pln'>1051</p>
-<p class='pln'>1052</p>
-<p class='pln'>1053</p>
-<p class='pln'>1054</p>
-<p class='pln'>1055</p>
-<p class='pln'>1056</p>
-<p class='pln'>1057</p>
-<p class='pln'>1058</p>
-<p class='pln'>1059</p>
-<p class='pln'>1060</p>
-<p class='pln'>1061</p>
-<p class='pln'>1062</p>
-<p class='pln'>1063</p>
-<p class='pln'>1064</p>
-<p class='pln'>1065</p>
-<p class='stm mis'>1066</p>
-<p class='stm mis'>1067</p>
-<p class='stm mis'>1068</p>
-<p class='stm mis'>1069</p>
-<p class='stm mis'>1070</p>
-<p class='pln'>1071</p>
-<p class='pln'>1072</p>
-<p class='stm run hide'>1073</p>
-<p class='pln'>1074</p>
-<p class='pln'>1075</p>
-<p class='stm run hide'>1076</p>
-<p class='pln'>1077</p>
-<p class='pln'>1078</p>
-<p class='pln'>1079</p>
-<p class='pln'>1080</p>
-<p class='pln'>1081</p>
-<p class='pln'>1082</p>
-<p class='pln'>1083</p>
-<p class='pln'>1084</p>
-<p class='stm run hide'>1085</p>
-<p class='pln'>1086</p>
-<p class='pln'>1087</p>
-<p class='pln'>1088</p>
-<p class='pln'>1089</p>
-<p class='pln'>1090</p>
-<p class='pln'>1091</p>
-<p class='pln'>1092</p>
-<p class='pln'>1093</p>
-<p class='stm run hide'>1094</p>
-<p class='stm mis'>1095</p>
-<p class='stm mis'>1096</p>
-<p class='stm mis'>1097</p>
-<p class='pln'>1098</p>
-<p class='stm run hide'>1099</p>
-<p class='stm mis'>1100</p>
-<p class='stm mis'>1101</p>
-<p class='stm mis'>1102</p>
-<p class='pln'>1103</p>
-<p class='stm run hide'>1104</p>
-<p class='stm mis'>1105</p>
-<p class='stm mis'>1106</p>
-<p class='stm mis'>1107</p>
-<p class='pln'>1108</p>
-<p class='stm run hide'>1109</p>
-<p class='stm mis'>1110</p>
-<p class='stm mis'>1111</p>
-<p class='stm mis'>1112</p>
-<p class='pln'>1113</p>
-<p class='pln'>1114</p>
-<p class='stm run hide'>1115</p>
-<p class='pln'>1116</p>
-<p class='pln'>1117</p>
-<p class='pln'>1118</p>
-<p class='pln'>1119</p>
-<p class='pln'>1120</p>
-<p class='stm run hide'>1121</p>
-<p class='stm mis'>1122</p>
-<p class='stm mis'>1123</p>
-<p class='pln'>1124</p>
-<p class='stm run hide'>1125</p>
-<p class='stm mis'>1126</p>
-<p class='pln'>1127</p>
-<p class='pln'>1128</p>
-<p class='pln'>1129</p>
-<p class='pln'>1130</p>
-<p class='stm mis'>1131</p>
-<p class='stm mis'>1132</p>
-<p class='stm mis'>1133</p>
-<p class='pln'>1134</p>
-<p class='pln'>1135</p>
-<p class='stm run hide'>1136</p>
-<p class='stm run hide'>1137</p>
-<p class='pln'>1138</p>
-<p class='pln'>1139</p>
-<p class='pln'>1140</p>
-<p class='pln'>1141</p>
-<p class='pln'>1142</p>
-<p class='pln'>1143</p>
-<p class='pln'>1144</p>
-<p class='pln'>1145</p>
-<p class='pln'>1146</p>
-<p class='pln'>1147</p>
-<p class='pln'>1148</p>
-<p class='pln'>1149</p>
-<p class='pln'>1150</p>
-<p class='pln'>1151</p>
-<p class='pln'>1152</p>
-<p class='pln'>1153</p>
-<p class='pln'>1154</p>
-<p class='pln'>1155</p>
-<p class='pln'>1156</p>
-<p class='pln'>1157</p>
-<p class='pln'>1158</p>
-<p class='pln'>1159</p>
-<p class='pln'>1160</p>
-<p class='pln'>1161</p>
-<p class='pln'>1162</p>
-<p class='pln'>1163</p>
-<p class='pln'>1164</p>
-<p class='pln'>1165</p>
-<p class='pln'>1166</p>
-<p class='pln'>1167</p>
-<p class='pln'>1168</p>
-<p class='pln'>1169</p>
-<p class='pln'>1170</p>
-<p class='pln'>1171</p>
-<p class='pln'>1172</p>
-<p class='pln'>1173</p>
-<p class='pln'>1174</p>
-<p class='pln'>1175</p>
-<p class='pln'>1176</p>
-<p class='pln'>1177</p>
-<p class='pln'>1178</p>
-<p class='pln'>1179</p>
-<p class='pln'>1180</p>
-<p class='pln'>1181</p>
-<p class='pln'>1182</p>
-<p class='stm run hide'>1183</p>
-<p class='pln'>1184</p>
-<p class='stm mis'>1185</p>
-<p class='stm mis'>1186</p>
-<p class='pln'>1187</p>
-<p class='stm run hide'>1188</p>
-<p class='pln'>1189</p>
-<p class='stm mis'>1190</p>
-<p class='stm mis'>1191</p>
-<p class='stm mis'>1192</p>
-<p class='pln'>1193</p>
-<p class='stm run hide'>1194</p>
-<p class='pln'>1195</p>
-<p class='stm mis'>1196</p>
-<p class='stm mis'>1197</p>
-<p class='stm mis'>1198</p>
-<p class='pln'>1199</p>
-<p class='stm run hide'>1200</p>
-<p class='pln'>1201</p>
-<p class='stm mis'>1202</p>
-<p class='stm mis'>1203</p>
-<p class='stm mis'>1204</p>
-<p class='pln'>1205</p>
-<p class='stm run hide'>1206</p>
-<p class='pln'>1207</p>
-<p class='stm mis'>1208</p>
-<p class='stm mis'>1209</p>
-<p class='stm mis'>1210</p>
-<p class='pln'>1211</p>
-<p class='stm run hide'>1212</p>
-<p class='stm mis'>1213</p>
-<p class='pln'>1214</p>
-<p class='pln'>1215</p>
-<p class='pln'>1216</p>
-<p class='pln'>1217</p>
-<p class='pln'>1218</p>
-<p class='pln'>1219</p>
-<p class='pln'>1220</p>
-<p class='pln'>1221</p>
-<p class='pln'>1222</p>
-<p class='pln'>1223</p>
-<p class='stm mis'>1224</p>
-<p class='pln'>1225</p>
-<p class='stm mis'>1226</p>
-<p class='stm mis'>1227</p>
-<p class='stm mis'>1228</p>
-<p class='pln'>1229</p>
-<p class='stm mis'>1230</p>
-<p class='stm mis'>1231</p>
-<p class='stm mis'>1232</p>
-<p class='pln'>1233</p>
-<p class='stm mis'>1234</p>
-<p class='stm mis'>1235</p>
-<p class='stm mis'>1236</p>
-<p class='pln'>1237</p>
-<p class='stm mis'>1238</p>
-<p class='stm mis'>1239</p>
-<p class='stm mis'>1240</p>
-<p class='pln'>1241</p>
-<p class='stm mis'>1242</p>
-<p class='stm mis'>1243</p>
-<p class='stm mis'>1244</p>
-<p class='pln'>1245</p>
-<p class='stm mis'>1246</p>
-<p class='stm mis'>1247</p>
-<p class='stm mis'>1248</p>
-<p class='pln'>1249</p>
-<p class='stm mis'>1250</p>
-<p class='stm mis'>1251</p>
-<p class='stm mis'>1252</p>
-<p class='pln'>1253</p>
-<p class='stm run hide'>1254</p>
-<p class='pln'>1255</p>
-<p class='pln'>1256</p>
-<p class='stm mis'>1257</p>
-<p class='pln'>1258</p>
-<p class='pln'>1259</p>
-<p class='pln'>1260</p>
-<p class='pln'>1261</p>
-<p class='pln'>1262</p>
-<p class='pln'>1263</p>
-<p class='pln'>1264</p>
-<p class='pln'>1265</p>
-<p class='pln'>1266</p>
-<p class='pln'>1267</p>
-<p class='pln'>1268</p>
-<p class='pln'>1269</p>
-<p class='pln'>1270</p>
-<p class='pln'>1271</p>
-<p class='pln'>1272</p>
-<p class='pln'>1273</p>
-<p class='pln'>1274</p>
-<p class='pln'>1275</p>
-<p class='pln'>1276</p>
-<p class='pln'>1277</p>
-<p class='pln'>1278</p>
-<p class='pln'>1279</p>
-<p class='pln'>1280</p>
-<p class='stm mis'>1281</p>
-<p class='pln'>1282</p>
-<p class='pln'>1283</p>
-<p class='stm mis'>1284</p>
-<p class='stm mis'>1285</p>
-<p class='pln'>1286</p>
-<p class='pln'>1287</p>
-<p class='stm run hide'>1288</p>
-<p class='pln'>1289</p>
-<p class='stm run hide'>1290</p>
-<p class='pln'>1291</p>
-<p class='stm mis'>1292</p>
-<p class='pln'>1293</p>
-<p class='pln'>1294</p>
-<p class='pln'>1295</p>
-<p class='pln'>1296</p>
-<p class='pln'>1297</p>
-<p class='pln'>1298</p>
-<p class='pln'>1299</p>
-<p class='pln'>1300</p>
-<p class='pln'>1301</p>
-<p class='pln'>1302</p>
-<p class='pln'>1303</p>
-<p class='pln'>1304</p>
-<p class='pln'>1305</p>
-<p class='pln'>1306</p>
-<p class='stm mis'>1307</p>
-<p class='stm mis'>1308</p>
-<p class='stm mis'>1309</p>
-<p class='stm mis'>1310</p>
-<p class='stm mis'>1311</p>
-<p class='stm mis'>1312</p>
-<p class='stm mis'>1313</p>
-<p class='stm mis'>1314</p>
-<p class='stm mis'>1315</p>
-<p class='stm mis'>1316</p>
-<p class='stm mis'>1317</p>
-<p class='stm mis'>1318</p>
-<p class='pln'>1319</p>
-<p class='stm run hide'>1320</p>
-<p class='stm mis'>1321</p>
-<p class='pln'>1322</p>
-<p class='pln'>1323</p>
-<p class='pln'>1324</p>
-<p class='pln'>1325</p>
-<p class='pln'>1326</p>
-<p class='pln'>1327</p>
-<p class='pln'>1328</p>
-<p class='pln'>1329</p>
-<p class='pln'>1330</p>
-<p class='pln'>1331</p>
-<p class='pln'>1332</p>
-<p class='pln'>1333</p>
-<p class='pln'>1334</p>
-<p class='pln'>1335</p>
-<p class='pln'>1336</p>
-<p class='pln'>1337</p>
-<p class='pln'>1338</p>
-<p class='pln'>1339</p>
-<p class='pln'>1340</p>
-<p class='pln'>1341</p>
-<p class='pln'>1342</p>
-<p class='pln'>1343</p>
-<p class='pln'>1344</p>
-<p class='pln'>1345</p>
-<p class='pln'>1346</p>
-<p class='stm mis'>1347</p>
-<p class='stm mis'>1348</p>
-<p class='stm mis'>1349</p>
-<p class='stm mis'>1350</p>
-<p class='stm mis'>1351</p>
-<p class='stm mis'>1352</p>
-<p class='pln'>1353</p>
-<p class='stm run hide'>1354</p>
-<p class='pln'>1355</p>
-<p class='stm mis'>1356</p>
-<p class='pln'>1357</p>
-<p class='pln'>1358</p>
-<p class='pln'>1359</p>
-<p class='pln'>1360</p>
-<p class='pln'>1361</p>
-<p class='pln'>1362</p>
-<p class='pln'>1363</p>
-<p class='pln'>1364</p>
-<p class='pln'>1365</p>
-<p class='pln'>1366</p>
-<p class='pln'>1367</p>
-<p class='pln'>1368</p>
-<p class='pln'>1369</p>
-<p class='pln'>1370</p>
-<p class='pln'>1371</p>
-<p class='pln'>1372</p>
-<p class='pln'>1373</p>
-<p class='pln'>1374</p>
-<p class='pln'>1375</p>
-<p class='pln'>1376</p>
-<p class='pln'>1377</p>
-<p class='pln'>1378</p>
-<p class='pln'>1379</p>
-<p class='pln'>1380</p>
-<p class='pln'>1381</p>
-<p class='pln'>1382</p>
-<p class='pln'>1383</p>
-<p class='pln'>1384</p>
-<p class='pln'>1385</p>
-<p class='pln'>1386</p>
-<p class='pln'>1387</p>
-<p class='pln'>1388</p>
-<p class='pln'>1389</p>
-<p class='pln'>1390</p>
-<p class='pln'>1391</p>
-<p class='pln'>1392</p>
-<p class='pln'>1393</p>
-<p class='pln'>1394</p>
-<p class='pln'>1395</p>
-<p class='pln'>1396</p>
-<p class='pln'>1397</p>
-<p class='pln'>1398</p>
-<p class='pln'>1399</p>
-<p class='pln'>1400</p>
-<p class='stm mis'>1401</p>
-<p class='stm mis'>1402</p>
-<p class='stm mis'>1403</p>
-<p class='stm mis'>1404</p>
-<p class='stm mis'>1405</p>
-<p class='stm mis'>1406</p>
-<p class='pln'>1407</p>
-<p class='stm run hide'>1408</p>
-<p class='stm mis'>1409</p>
-<p class='pln'>1410</p>
-<p class='pln'>1411</p>
-<p class='pln'>1412</p>
-<p class='pln'>1413</p>
-<p class='pln'>1414</p>
-<p class='pln'>1415</p>
-<p class='pln'>1416</p>
-<p class='pln'>1417</p>
-<p class='pln'>1418</p>
-<p class='pln'>1419</p>
-<p class='pln'>1420</p>
-<p class='pln'>1421</p>
-<p class='pln'>1422</p>
-<p class='pln'>1423</p>
-<p class='pln'>1424</p>
-<p class='pln'>1425</p>
-<p class='pln'>1426</p>
-<p class='pln'>1427</p>
-<p class='pln'>1428</p>
-<p class='pln'>1429</p>
-<p class='pln'>1430</p>
-<p class='pln'>1431</p>
-<p class='pln'>1432</p>
-<p class='pln'>1433</p>
-<p class='pln'>1434</p>
-<p class='pln'>1435</p>
-<p class='pln'>1436</p>
-<p class='stm mis'>1437</p>
-<p class='pln'>1438</p>
-<p class='stm mis'>1439</p>
-<p class='stm mis'>1440</p>
-<p class='stm mis'>1441</p>
-<p class='pln'>1442</p>
-<p class='stm mis'>1443</p>
-<p class='stm mis'>1444</p>
-<p class='stm mis'>1445</p>
-<p class='pln'>1446</p>
-<p class='stm mis'>1447</p>
-<p class='stm mis'>1448</p>
-<p class='pln'>1449</p>
-<p class='stm run hide'>1450</p>
-<p class='stm mis'>1451</p>
-<p class='pln'>1452</p>
-<p class='pln'>1453</p>
-<p class='pln'>1454</p>
-<p class='pln'>1455</p>
-<p class='pln'>1456</p>
-<p class='stm mis'>1457</p>
-<p class='stm mis'>1458</p>
-<p class='stm mis'>1459</p>
-<p class='stm mis'>1460</p>
-<p class='pln'>1461</p>
-<p class='stm run hide'>1462</p>
-<p class='pln'>1463</p>
-<p class='pln'>1464</p>
-<p class='stm mis'>1465</p>
-<p class='pln'>1466</p>
-<p class='pln'>1467</p>
-<p class='pln'>1468</p>
-<p class='pln'>1469</p>
-<p class='pln'>1470</p>
-<p class='pln'>1471</p>
-<p class='pln'>1472</p>
-<p class='pln'>1473</p>
-<p class='pln'>1474</p>
-<p class='pln'>1475</p>
-<p class='pln'>1476</p>
-<p class='pln'>1477</p>
-<p class='pln'>1478</p>
-<p class='stm mis'>1479</p>
-<p class='stm mis'>1480</p>
-<p class='stm mis'>1481</p>
-<p class='stm mis'>1482</p>
-<p class='stm mis'>1483</p>
-<p class='stm mis'>1484</p>
-<p class='stm mis'>1485</p>
-<p class='pln'>1486</p>
-<p class='stm run hide'>1487</p>
-<p class='stm mis'>1488</p>
-<p class='pln'>1489</p>
-<p class='pln'>1490</p>
-<p class='pln'>1491</p>
-<p class='pln'>1492</p>
-<p class='pln'>1493</p>
-<p class='pln'>1494</p>
-<p class='pln'>1495</p>
-<p class='pln'>1496</p>
-<p class='pln'>1497</p>
-<p class='pln'>1498</p>
-<p class='pln'>1499</p>
-<p class='pln'>1500</p>
-<p class='pln'>1501</p>
-<p class='pln'>1502</p>
-<p class='pln'>1503</p>
-<p class='pln'>1504</p>
-<p class='pln'>1505</p>
-<p class='pln'>1506</p>
-<p class='stm mis'>1507</p>
-<p class='stm mis'>1508</p>
-<p class='stm mis'>1509</p>
-<p class='stm mis'>1510</p>
-<p class='stm mis'>1511</p>
-<p class='stm mis'>1512</p>
-<p class='stm mis'>1513</p>
-<p class='stm mis'>1514</p>
-<p class='stm mis'>1515</p>
-<p class='stm mis'>1516</p>
-<p class='stm mis'>1517</p>
-<p class='stm mis'>1518</p>
-<p class='stm mis'>1519</p>
-<p class='stm mis'>1520</p>
-<p class='stm mis'>1521</p>
-<p class='stm mis'>1522</p>
-<p class='stm mis'>1523</p>
-<p class='stm mis'>1524</p>
-<p class='pln'>1525</p>
-<p class='stm run hide'>1526</p>
-<p class='stm mis'>1527</p>
-<p class='pln'>1528</p>
-<p class='pln'>1529</p>
-<p class='pln'>1530</p>
-<p class='pln'>1531</p>
-<p class='pln'>1532</p>
-<p class='pln'>1533</p>
-<p class='stm mis'>1534</p>
-<p class='stm mis'>1535</p>
-<p class='stm mis'>1536</p>
-<p class='stm mis'>1537</p>
-<p class='stm mis'>1538</p>
-<p class='stm mis'>1539</p>
-<p class='stm mis'>1540</p>
-<p class='stm mis'>1541</p>
-<p class='pln'>1542</p>
-<p class='stm run hide'>1543</p>
-<p class='stm mis'>1544</p>
-<p class='pln'>1545</p>
-<p class='pln'>1546</p>
-<p class='pln'>1547</p>
-<p class='pln'>1548</p>
-<p class='pln'>1549</p>
-<p class='pln'>1550</p>
-<p class='pln'>1551</p>
-<p class='pln'>1552</p>
-<p class='pln'>1553</p>
-<p class='pln'>1554</p>
-<p class='pln'>1555</p>
-<p class='pln'>1556</p>
-<p class='pln'>1557</p>
-<p class='pln'>1558</p>
-<p class='pln'>1559</p>
-<p class='pln'>1560</p>
-<p class='pln'>1561</p>
-<p class='pln'>1562</p>
-<p class='pln'>1563</p>
-<p class='stm mis'>1564</p>
-<p class='stm mis'>1565</p>
-<p class='stm mis'>1566</p>
-<p class='pln'>1567</p>
-<p class='stm run hide'>1568</p>
-<p class='stm mis'>1569</p>
-<p class='pln'>1570</p>
-<p class='pln'>1571</p>
-<p class='pln'>1572</p>
-<p class='pln'>1573</p>
-<p class='pln'>1574</p>
-<p class='pln'>1575</p>
-<p class='pln'>1576</p>
-<p class='pln'>1577</p>
-<p class='pln'>1578</p>
-<p class='pln'>1579</p>
-<p class='pln'>1580</p>
-<p class='pln'>1581</p>
-<p class='pln'>1582</p>
-<p class='pln'>1583</p>
-<p class='stm mis'>1584</p>
-<p class='stm mis'>1585</p>
-<p class='stm mis'>1586</p>
-<p class='pln'>1587</p>
-<p class='stm run hide'>1588</p>
-<p class='stm mis'>1589</p>
-<p class='pln'>1590</p>
-<p class='pln'>1591</p>
-<p class='pln'>1592</p>
-<p class='pln'>1593</p>
-<p class='pln'>1594</p>
-<p class='pln'>1595</p>
-<p class='pln'>1596</p>
-<p class='pln'>1597</p>
-<p class='pln'>1598</p>
-<p class='pln'>1599</p>
-<p class='pln'>1600</p>
-<p class='pln'>1601</p>
-<p class='stm mis'>1602</p>
-<p class='stm mis'>1603</p>
-<p class='stm mis'>1604</p>
-<p class='pln'>1605</p>
-<p class='stm run hide'>1606</p>
-<p class='pln'>1607</p>
-<p class='stm run hide'>1608</p>
-<p class='pln'>1609</p>
-<p class='pln'>1610</p>
-<p class='pln'>1611</p>
-<p class='pln'>1612</p>
-<p class='pln'>1613</p>
-<p class='pln'>1614</p>
-<p class='pln'>1615</p>
-<p class='pln'>1616</p>
-<p class='pln'>1617</p>
-<p class='pln'>1618</p>
-<p class='pln'>1619</p>
-<p class='pln'>1620</p>
-<p class='pln'>1621</p>
-<p class='pln'>1622</p>
-<p class='pln'>1623</p>
-<p class='pln'>1624</p>
-<p class='pln'>1625</p>
-<p class='pln'>1626</p>
-<p class='pln'>1627</p>
-<p class='pln'>1628</p>
-<p class='exc'>1629</p>
-<p class='pln'>1630</p>
-<p class='exc'>1631</p>
-<p class='exc'>1632</p>
-<p class='exc'>1633</p>
-<p class='pln'>1634</p>
-<p class='exc'>1635</p>
-<p class='exc'>1636</p>
-<p class='pln'>1637</p>
-<p class='stm run hide'>1638</p>
-<p class='stm mis'>1639</p>
-<p class='stm mis'>1640</p>
-<p class='stm mis'>1641</p>
-<p class='stm mis'>1642</p>
-<p class='stm mis'>1643</p>
-<p class='pln'>1644</p>
-<p class='stm run hide'>1645</p>
-<p class='stm mis'>1646</p>
-<p class='stm mis'>1647</p>
-<p class='pln'>1648</p>
-<p class='stm run hide'>1649</p>
-<p class='stm mis'>1650</p>
-<p class='pln'>1651</p>
-<p class='pln'>1652</p>
-<p class='stm mis'>1653</p>
-<p class='pln'>1654</p>
-<p class='stm run hide'>1655</p>
-<p class='stm mis'>1656</p>
-<p class='stm mis'>1657</p>
-<p class='stm mis'>1658</p>
-<p class='pln'>1659</p>
-<p class='stm run hide'>1660</p>
-<p class='stm mis'>1661</p>
-<p class='stm mis'>1662</p>
-<p class='stm mis'>1663</p>
-<p class='pln'>1664</p>
-<p class='stm run hide'>1665</p>
-<p class='stm mis'>1666</p>
-<p class='pln'>1667</p>
-<p class='pln'>1668</p>
-<p class='stm mis'>1669</p>
-<p class='pln'>1670</p>
-<p class='stm run hide'>1671</p>
-<p class='pln'>1672</p>
-<p class='stm run hide'>1673</p>
-<p class='stm mis'>1674</p>
-<p class='pln'>1675</p>
-<p class='pln'>1676</p>
-<p class='pln'>1677</p>
-<p class='pln'>1678</p>
-<p class='pln'>1679</p>
-<p class='pln'>1680</p>
-<p class='pln'>1681</p>
-<p class='pln'>1682</p>
-<p class='pln'>1683</p>
-<p class='pln'>1684</p>
-<p class='pln'>1685</p>
-<p class='pln'>1686</p>
-<p class='pln'>1687</p>
-<p class='pln'>1688</p>
-<p class='pln'>1689</p>
-<p class='pln'>1690</p>
-<p class='pln'>1691</p>
-<p class='pln'>1692</p>
-<p class='pln'>1693</p>
-<p class='stm mis'>1694</p>
-<p class='stm mis'>1695</p>
-<p class='stm mis'>1696</p>
-<p class='pln'>1697</p>
-<p class='stm run hide'>1698</p>
-<p class='stm mis'>1699</p>
-<p class='pln'>1700</p>
-<p class='pln'>1701</p>
-<p class='pln'>1702</p>
-<p class='pln'>1703</p>
-<p class='pln'>1704</p>
-<p class='pln'>1705</p>
-<p class='pln'>1706</p>
-<p class='pln'>1707</p>
-<p class='pln'>1708</p>
-<p class='pln'>1709</p>
-<p class='pln'>1710</p>
-<p class='pln'>1711</p>
-<p class='pln'>1712</p>
-<p class='pln'>1713</p>
-<p class='pln'>1714</p>
-<p class='pln'>1715</p>
-<p class='pln'>1716</p>
-<p class='pln'>1717</p>
-<p class='pln'>1718</p>
-<p class='pln'>1719</p>
-<p class='pln'>1720</p>
-<p class='pln'>1721</p>
-<p class='pln'>1722</p>
-<p class='stm mis'>1723</p>
-<p class='stm mis'>1724</p>
-<p class='stm mis'>1725</p>
-<p class='pln'>1726</p>
-<p class='stm run hide'>1727</p>
-<p class='stm mis'>1728</p>
-<p class='pln'>1729</p>
-<p class='pln'>1730</p>
-<p class='pln'>1731</p>
-<p class='pln'>1732</p>
-<p class='pln'>1733</p>
-<p class='pln'>1734</p>
-<p class='pln'>1735</p>
-<p class='pln'>1736</p>
-<p class='pln'>1737</p>
-<p class='pln'>1738</p>
-<p class='pln'>1739</p>
-<p class='pln'>1740</p>
-<p class='pln'>1741</p>
-<p class='pln'>1742</p>
-<p class='pln'>1743</p>
-<p class='pln'>1744</p>
-<p class='pln'>1745</p>
-<p class='pln'>1746</p>
-<p class='pln'>1747</p>
-<p class='pln'>1748</p>
-<p class='pln'>1749</p>
-<p class='pln'>1750</p>
-<p class='pln'>1751</p>
-<p class='stm mis'>1752</p>
-<p class='stm mis'>1753</p>
-<p class='stm mis'>1754</p>
-<p class='pln'>1755</p>
-<p class='stm run hide'>1756</p>
-<p class='stm mis'>1757</p>
-<p class='pln'>1758</p>
-<p class='pln'>1759</p>
-<p class='pln'>1760</p>
-<p class='pln'>1761</p>
-<p class='pln'>1762</p>
-<p class='pln'>1763</p>
-<p class='pln'>1764</p>
-<p class='pln'>1765</p>
-<p class='pln'>1766</p>
-<p class='pln'>1767</p>
-<p class='pln'>1768</p>
-<p class='pln'>1769</p>
-<p class='pln'>1770</p>
-<p class='pln'>1771</p>
-<p class='pln'>1772</p>
-<p class='pln'>1773</p>
-<p class='pln'>1774</p>
-<p class='pln'>1775</p>
-<p class='pln'>1776</p>
-<p class='pln'>1777</p>
-<p class='pln'>1778</p>
-<p class='pln'>1779</p>
-<p class='pln'>1780</p>
-<p class='pln'>1781</p>
-<p class='pln'>1782</p>
-<p class='pln'>1783</p>
-<p class='pln'>1784</p>
-<p class='pln'>1785</p>
-<p class='pln'>1786</p>
-<p class='pln'>1787</p>
-<p class='pln'>1788</p>
-<p class='pln'>1789</p>
-<p class='pln'>1790</p>
-<p class='pln'>1791</p>
-<p class='pln'>1792</p>
-<p class='pln'>1793</p>
-<p class='pln'>1794</p>
-<p class='pln'>1795</p>
-<p class='pln'>1796</p>
-<p class='pln'>1797</p>
-<p class='pln'>1798</p>
-<p class='pln'>1799</p>
-<p class='pln'>1800</p>
-<p class='pln'>1801</p>
-<p class='pln'>1802</p>
-<p class='pln'>1803</p>
-<p class='pln'>1804</p>
-<p class='pln'>1805</p>
-<p class='pln'>1806</p>
-<p class='pln'>1807</p>
-<p class='pln'>1808</p>
-<p class='pln'>1809</p>
-<p class='pln'>1810</p>
-<p class='pln'>1811</p>
-<p class='pln'>1812</p>
-<p class='pln'>1813</p>
-<p class='pln'>1814</p>
-<p class='pln'>1815</p>
-<p class='pln'>1816</p>
-<p class='pln'>1817</p>
-<p class='pln'>1818</p>
-<p class='pln'>1819</p>
-<p class='pln'>1820</p>
-<p class='pln'>1821</p>
-<p class='pln'>1822</p>
-<p class='pln'>1823</p>
-<p class='pln'>1824</p>
-<p class='pln'>1825</p>
-<p class='pln'>1826</p>
-<p class='pln'>1827</p>
-<p class='pln'>1828</p>
-<p class='pln'>1829</p>
-<p class='stm mis'>1830</p>
-<p class='stm mis'>1831</p>
-<p class='pln'>1832</p>
-<p class='pln'>1833</p>
-<p class='stm mis'>1834</p>
-<p class='pln'>1835</p>
-<p class='pln'>1836</p>
-<p class='stm mis'>1837</p>
-<p class='pln'>1838</p>
-<p class='pln'>1839</p>
-<p class='stm mis'>1840</p>
-<p class='pln'>1841</p>
-<p class='pln'>1842</p>
-<p class='stm mis'>1843</p>
-<p class='pln'>1844</p>
-<p class='pln'>1845</p>
-<p class='stm mis'>1846</p>
-<p class='pln'>1847</p>
-<p class='pln'>1848</p>
-<p class='pln'>1849</p>
-<p class='stm run hide'>1850</p>
-<p class='pln'>1851</p>
-<p class='pln'>1852</p>
-<p class='stm run hide'>1853</p>
-<p class='pln'>1854</p>
-<p class='stm mis'>1855</p>
-<p class='pln'>1856</p>
-<p class='pln'>1857</p>
-<p class='pln'>1858</p>
-<p class='pln'>1859</p>
-<p class='pln'>1860</p>
-<p class='pln'>1861</p>
-<p class='pln'>1862</p>
-<p class='pln'>1863</p>
-<p class='pln'>1864</p>
-<p class='pln'>1865</p>
-<p class='pln'>1866</p>
-<p class='pln'>1867</p>
-<p class='pln'>1868</p>
-<p class='pln'>1869</p>
-<p class='pln'>1870</p>
-<p class='pln'>1871</p>
-<p class='pln'>1872</p>
-<p class='pln'>1873</p>
-<p class='pln'>1874</p>
-<p class='pln'>1875</p>
-<p class='pln'>1876</p>
-<p class='stm mis'>1877</p>
-<p class='stm mis'>1878</p>
-<p class='stm mis'>1879</p>
-<p class='pln'>1880</p>
-<p class='stm run hide'>1881</p>
-<p class='stm mis'>1882</p>
-<p class='pln'>1883</p>
-<p class='pln'>1884</p>
-<p class='pln'>1885</p>
-<p class='pln'>1886</p>
-<p class='pln'>1887</p>
-<p class='stm mis'>1888</p>
-<p class='stm mis'>1889</p>
-<p class='pln'>1890</p>
-<p class='stm run hide'>1891</p>
-<p class='pln'>1892</p>
-<p class='pln'>1893</p>
-<p class='stm mis'>1894</p>
-<p class='pln'>1895</p>
-<p class='pln'>1896</p>
-<p class='pln'>1897</p>
-<p class='pln'>1898</p>
-<p class='pln'>1899</p>
-<p class='pln'>1900</p>
-<p class='pln'>1901</p>
-<p class='pln'>1902</p>
-<p class='pln'>1903</p>
-<p class='pln'>1904</p>
-<p class='pln'>1905</p>
-<p class='pln'>1906</p>
-<p class='pln'>1907</p>
-<p class='pln'>1908</p>
-<p class='pln'>1909</p>
-<p class='pln'>1910</p>
-<p class='pln'>1911</p>
-<p class='stm mis'>1912</p>
-<p class='stm mis'>1913</p>
-<p class='stm mis'>1914</p>
-<p class='stm mis'>1915</p>
-<p class='stm mis'>1916</p>
-<p class='stm mis'>1917</p>
-<p class='pln'>1918</p>
-<p class='stm run hide'>1919</p>
-<p class='pln'>1920</p>
-<p class='stm run hide'>1921</p>
-<p class='pln'>1922</p>
-<p class='stm mis'>1923</p>
-<p class='pln'>1924</p>
-<p class='pln'>1925</p>
-<p class='pln'>1926</p>
-<p class='pln'>1927</p>
-<p class='pln'>1928</p>
-<p class='pln'>1929</p>
-<p class='pln'>1930</p>
-<p class='pln'>1931</p>
-<p class='stm mis'>1932</p>
-<p class='stm mis'>1933</p>
-<p class='stm mis'>1934</p>
-<p class='stm mis'>1935</p>
-<p class='pln'>1936</p>
-<p class='stm run hide'>1937</p>
-<p class='pln'>1938</p>
-<p class='stm mis'>1939</p>
-<p class='pln'>1940</p>
-<p class='pln'>1941</p>
-<p class='pln'>1942</p>
-<p class='pln'>1943</p>
-<p class='pln'>1944</p>
-<p class='pln'>1945</p>
-<p class='pln'>1946</p>
-<p class='pln'>1947</p>
-<p class='stm mis'>1948</p>
-<p class='stm mis'>1949</p>
-<p class='stm mis'>1950</p>
-<p class='stm mis'>1951</p>
-<p class='stm mis'>1952</p>
-<p class='stm mis'>1953</p>
-<p class='pln'>1954</p>
-<p class='pln'>1955</p>
-<p class='exc'>1956</p>
-<p class='exc'>1957</p>
-<p class='pln'>1958</p>
-<p class='pln'>1959</p>
-<p class='pln'>1960</p>
-
-</td>
-<td class='text' valign='top'>
-<p class='pln'><span class='str'>""" Test cogapp.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> http://nedbatchelder.com/code/cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> </span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Copyright 2004-2009, Ned Batchelder.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'>"""</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>import</span> <span class='nam'>unittest</span><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>import</span> <span class='nam'>os</span><span class='op'>,</span> <span class='nam'>random</span><span class='op'>,</span> <span class='nam'>re</span><span class='op'>,</span> <span class='nam'>StringIO</span><span class='op'>,</span> <span class='nam'>stat</span><span class='op'>,</span> <span class='nam'>sys</span><span class='op'>,</span> <span class='nam'>tempfile</span><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>import</span> <span class='nam'>path</span> <span class='com'># Non-standard, from http://www.jorendorff.com/articles/python/path</span><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>from</span> <span class='nam'>cogapp</span> <span class='key'>import</span> <span class='nam'>Cog</span><span class='op'>,</span> <span class='nam'>CogOptions</span><span class='op'>,</span> <span class='nam'>CogGenerator</span><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>from</span> <span class='nam'>cogapp</span> <span class='key'>import</span> <span class='nam'>CogError</span><span class='op'>,</span> <span class='nam'>CogUsageError</span><span class='op'>,</span> <span class='nam'>CogGeneratedError</span><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>from</span> <span class='nam'>cogapp</span> <span class='key'>import</span> <span class='nam'>usage</span><span class='op'>,</span> <span class='nam'>__version__</span><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>from</span> <span class='nam'>whiteutils</span> <span class='key'>import</span> <span class='nam'>reindentBlock</span><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>from</span> <span class='nam'>makefiles</span> <span class='key'>import</span> <span class='op'>*</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>class</span> <span class='nam'>TestCase</span><span class='op'>(</span><span class='nam'>unittest</span><span class='op'>.</span><span class='nam'>TestCase</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Base class for all Cog test cases. Adds utility methods I like.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>assertRaisesMsg</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>excClass</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>,</span> <span class='nam'>callableObj</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Just like unittest.TestCase.assertRaises,</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> but checks that the message is right too.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>try</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>callableObj</span><span class='op'>(</span><span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>except</span> <span class='nam'>excClass</span><span class='op'>,</span> <span class='nam'>exc</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>excMsg</span> <span class='op'>=</span> <span class='nam'>str</span><span class='op'>(</span><span class='nam'>exc</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>msg</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># No message provided: it passes.</span><span class="strut"> </span></p>
-<p class='exc'> <span class='key'>return</span> <span class='com'>#pragma: no cover</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>elif</span> <span class='nam'>excMsg</span> <span class='op'>==</span> <span class='nam'>msg</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Message provided, and we got the right message: it passes.</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>return</span><span class="strut"> </span></p>
-<p class='exc'> <span class='key'>else</span><span class='op'>:</span> <span class='com'>#pragma: no cover</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Message provided, and it didn't match: fail!</span><span class="strut"> </span></p>
-<p class='exc'> <span class='key'>raise</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>failureException</span><span class='op'>(</span><span class='str'>"Right exception, wrong message: got '%s' expected '%s'"</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>excMsg</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='exc'> <span class='key'>else</span><span class='op'>:</span> <span class='com'>#pragma: no cover</span><span class="strut"> </span></p>
-<p class='exc'> <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>excClass</span><span class='op'>,</span><span class='str'>'__name__'</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='exc'> <span class='nam'>excName</span> <span class='op'>=</span> <span class='nam'>excClass</span><span class='op'>.</span><span class='nam'>__name__</span><span class="strut"> </span></p>
-<p class='exc'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='exc'> <span class='nam'>excName</span> <span class='op'>=</span> <span class='nam'>str</span><span class='op'>(</span><span class='nam'>excClass</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='exc'> <span class='key'>raise</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>failureException</span><span class='op'>(</span><span class='str'>"Expected to raise %s, didn't get an exception at all"</span> <span class='op'>%</span> <span class='nam'>excName</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>class</span> <span class='nam'>CogTestsInMemory</span><span class='op'>(</span><span class='nam'>TestCase</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Test cases for cogapp.Cog()</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testNoCog</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>strings</span> <span class='op'>=</span> <span class='op'>[</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>''</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>' '</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>' \t \t \tx'</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'hello'</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'the cat\nin the\nhat.'</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'Horton\n\tHears A\n\t\tWho'</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>]</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>for</span> <span class='nam'>s</span> <span class='key'>in</span> <span class='nam'>strings</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>s</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>s</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testSimple</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Some text.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> import cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("This is line one\\n")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("This is line two")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> gobbledegook.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> epilogue.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>outfile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Some text.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> import cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("This is line one\\n")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("This is line two")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This is line one</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This is line two</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> epilogue.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>outfile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testEmptyCog</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># The cog clause can be totally empty. Not sure why you'd want it,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># but it works.</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> hello</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> goodbye</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testMultipleCogs</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># One file can have many cog chunks, even abutting each other.</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.out("chunk1")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> chunk1</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.out("chunk2")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> chunk2</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> between chunks</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.out("chunk3")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> chunk3</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testTrimBlankLines</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.out("This is line one\\n", trimblanklines=True)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.out('''</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This is line two</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> ''', dedent=True, trimblanklines=True)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("This is line three", trimblanklines=True)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This is line one</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This is line two</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This is line three</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testTrimEmptyBlankLines</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.out("This is line one\\n", trimblanklines=True)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.out('''</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This is line two</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> ''', dedent=True, trimblanklines=True)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.out('', dedent=True, trimblanklines=True)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("This is line three", trimblanklines=True)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This is line one</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This is line two</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This is line three</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>test22EndOfLine</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># In Python 2.2, this cog file was not parsing because the</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># last line is indented but didn't end with a newline.</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> import cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> for i in range(3):</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.out("%d\\n" % i)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> 0</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> 1</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> 2</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testIndentedCode</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> first line</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> import cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> for i in range(3):</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.out("xx%d\\n" % i)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> xx0</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> xx1</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> xx2</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> last line</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testPrefixedCode</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> --[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> --import cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> --for i in range(3):</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> -- cog.out("xx%d\\n" % i)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> --]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> xx0</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> xx1</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> xx2</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> --[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testPrefixedIndentedCode</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> prologue</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> --[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> -- import cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> -- for i in range(3):</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> -- cog.out("xy%d\\n" % i)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> --]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> xy0</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> xy1</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> xy2</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> --[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testBogusPrefixMatch</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> prologue</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> import cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> # This comment should not be clobbered by removing the pound sign.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> for i in range(3):</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.out("xy%d\\n" % i)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> xy0</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> xy1</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> xy2</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testNoFinalNewline</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># If the cog'ed output has no final newline,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># it shouldn't eat up the cog terminator.</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> prologue</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> import cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> for i in range(3):</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.out("%d" % i)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> 012</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> epilogue</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testNoOutputAtAll</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># If there is absolutely no cog output, that's ok.</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> prologue</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> i = 1</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> epilogue</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testPurelyBlankLine</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># If there is a blank line in the cog code with no whitespace</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># prefix, that should be OK.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> prologue</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> import sys</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.out("Hello")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> $</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.out("There")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> HelloThere</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> epilogue</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='str'>'$'</span><span class='op'>,</span> <span class='str'>''</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testEmptyOutl</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Alexander Belchenko suggested the string argument to outl should</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># be optional. Does it work?</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> prologue</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("x")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl()</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("y")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl(trimblanklines=True)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("z")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> x</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='str'> y</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> </span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> z</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> epilogue</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testFirstLineNum</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> fooey</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("started at line number %d" % cog.firstLineNum)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> started at line number 2</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> blah blah</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("and again at line %d" % cog.firstLineNum)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> and again at line 8</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testCompactOneLineCode</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> first line</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> hey: [[[cog cog.outl("hello %d" % (3*3*3*3)) ]]] looky!</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> get rid of this!</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> last line</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>outfile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> first line</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> hey: [[[cog cog.outl("hello %d" % (3*3*3*3)) ]]] looky!</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> hello 81</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> last line</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>outfile</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testInsideOutCompact</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> first line</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> hey?: ]]] what is this? [[[cog strange!</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> get rid of this!</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> last line</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaisesMsg</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>"infile.txt(2): Cog code markers inverted"</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>"infile.txt"</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testSharingGlobals</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> first line</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> hey: [[[cog s="hey there" ]]] looky!</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> more literal junk.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[cog cog.outl(s) ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> last line</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>outfile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> first line</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> hey: [[[cog s="hey there" ]]] looky!</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> more literal junk.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[cog cog.outl(s) ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> hey there</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> last line</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>outfile</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>class</span> <span class='nam'>CogOptionsTests</span><span class='op'>(</span><span class='nam'>TestCase</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Test the CogOptions class.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testEquality</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>o</span> <span class='op'>=</span> <span class='nam'>CogOptions</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>p</span> <span class='op'>=</span> <span class='nam'>CogOptions</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>o</span><span class='op'>,</span> <span class='nam'>p</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>o</span><span class='op'>.</span><span class='nam'>parseArgs</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'-r'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertNotEqual</span><span class='op'>(</span><span class='nam'>o</span><span class='op'>,</span> <span class='nam'>p</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>p</span><span class='op'>.</span><span class='nam'>parseArgs</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'-r'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>o</span><span class='op'>,</span> <span class='nam'>p</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testCloning</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>o</span> <span class='op'>=</span> <span class='nam'>CogOptions</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>o</span><span class='op'>.</span><span class='nam'>parseArgs</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'fooey'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'booey'</span><span class='op'>,</span> <span class='str'>'-s'</span><span class='op'>,</span> <span class='str'>' /*x*/'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>p</span> <span class='op'>=</span> <span class='nam'>o</span><span class='op'>.</span><span class='nam'>clone</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>o</span><span class='op'>,</span> <span class='nam'>p</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>p</span><span class='op'>.</span><span class='nam'>parseArgs</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'huey'</span><span class='op'>,</span> <span class='str'>'-D'</span><span class='op'>,</span> <span class='str'>'foo=quux'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertNotEqual</span><span class='op'>(</span><span class='nam'>o</span><span class='op'>,</span> <span class='nam'>p</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>q</span> <span class='op'>=</span> <span class='nam'>CogOptions</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>q</span><span class='op'>.</span><span class='nam'>parseArgs</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'fooey'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'booey'</span><span class='op'>,</span> <span class='str'>'-s'</span><span class='op'>,</span> <span class='str'>' /*x*/'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'huey'</span><span class='op'>,</span> <span class='str'>'-D'</span><span class='op'>,</span> <span class='str'>'foo=quux'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>p</span><span class='op'>,</span> <span class='nam'>q</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testCombiningFlags</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Single-character flags can be combined.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>o</span> <span class='op'>=</span> <span class='nam'>CogOptions</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>o</span><span class='op'>.</span><span class='nam'>parseArgs</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'-e'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-z'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>p</span> <span class='op'>=</span> <span class='nam'>CogOptions</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>p</span><span class='op'>.</span><span class='nam'>parseArgs</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'-erz'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>o</span><span class='op'>,</span> <span class='nam'>p</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>class</span> <span class='nam'>FileStructureTests</span><span class='op'>(</span><span class='nam'>TestCase</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Test cases to check that we're properly strict about the structure</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> of files.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>isBad</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaisesMsg</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>msg</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>,</span> <span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'infile.txt'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testBeginNoEnd</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Fooey</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl('hello')</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBad</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>,</span> <span class='str'>"infile.txt(2): Cog block begun but never ended."</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testNoEoo</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Fooey</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl('hello')</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBad</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>,</span> <span class='str'>"infile.txt(4): Missing '[[[end]]]' before end of file."</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>infile2</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Fooey</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl('hello')</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl('goodbye')</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBad</span><span class='op'>(</span><span class='nam'>infile2</span><span class='op'>,</span> <span class='str'>"infile.txt(5): Unexpected '[[[cog'"</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testStartWithEnd</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBad</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>,</span> <span class='str'>"infile.txt(1): Unexpected ']]]'"</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>infile2</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl('hello')</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[end]]] </span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBad</span><span class='op'>(</span><span class='nam'>infile2</span><span class='op'>,</span> <span class='str'>"infile.txt(5): Unexpected ']]]'"</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testStartWithEoo</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBad</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>,</span> <span class='str'>"infile.txt(1): Unexpected '[[[end]]]'"</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>infile2</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl('hello')</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBad</span><span class='op'>(</span><span class='nam'>infile2</span><span class='op'>,</span> <span class='str'>"infile.txt(5): Unexpected '[[[end]]]'"</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testNoEnd</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("hello")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBad</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>,</span> <span class='str'>"infile.txt(3): Unexpected '[[[end]]]'"</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>infile2</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl('hello')</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("hello")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBad</span><span class='op'>(</span><span class='nam'>infile2</span><span class='op'>,</span> <span class='str'>"infile.txt(7): Unexpected '[[[end]]]'"</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testTwoBegins</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("hello")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBad</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>,</span> <span class='str'>"infile.txt(2): Unexpected '[[[cog'"</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>infile2</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("hello")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("hello")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBad</span><span class='op'>(</span><span class='nam'>infile2</span><span class='op'>,</span> <span class='str'>"infile.txt(6): Unexpected '[[[cog'"</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testTwoEnds</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("hello")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBad</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>,</span> <span class='str'>"infile.txt(4): Unexpected ']]]'"</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>infile2</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("hello")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("hello")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBad</span><span class='op'>(</span><span class='nam'>infile2</span><span class='op'>,</span> <span class='str'>"infile.txt(8): Unexpected ']]]'"</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>class</span> <span class='nam'>CogErrorTests</span><span class='op'>(</span><span class='nam'>TestCase</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Test cases for cog.error().</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testErrorMsg</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[cog cog.error("This ain't right!")]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaisesMsg</span><span class='op'>(</span><span class='nam'>CogGeneratedError</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>"This ain't right!"</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>,</span> <span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testErrorNoMsg</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[cog cog.error()]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaisesMsg</span><span class='op'>(</span><span class='nam'>CogGeneratedError</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>"Error raised by cog generator."</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>,</span> <span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testNoErrorIfErrorNotCalled</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> --[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> --import cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> --for i in range(3):</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> -- if i > 10:</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> -- cog.error("Something is amiss!")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> -- cog.out("xx%d\\n" % i)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> --]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> xx0</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> xx1</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> xx2</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> --[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>class</span> <span class='nam'>CogGeneratorGetCodeTests</span><span class='op'>(</span><span class='nam'>TestCase</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Unit tests against CogGenerator to see if its getCode() method works</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> properly.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>setUp</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" All tests get a generator to use, and short same-length names for</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> the functions we're going to use.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>gen</span> <span class='op'>=</span> <span class='nam'>CogGenerator</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>gen</span><span class='op'>.</span><span class='nam'>parseMarker</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>gen</span><span class='op'>.</span><span class='nam'>parseLine</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testEmpty</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span><span class='op'>(</span><span class='str'>'// [[[cog'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span><span class='op'>(</span><span class='str'>'// ]]]'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>gen</span><span class='op'>.</span><span class='nam'>getCode</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>''</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testSimple</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span><span class='op'>(</span><span class='str'>'// [[[cog'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>l</span><span class='op'>(</span><span class='str'>' print "hello"'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>l</span><span class='op'>(</span><span class='str'>' print "bye"'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span><span class='op'>(</span><span class='str'>'// ]]]'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>gen</span><span class='op'>.</span><span class='nam'>getCode</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'print "hello"\nprint "bye"'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testCompressed1</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># For a while, I supported compressed code blocks, but no longer.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span><span class='op'>(</span><span class='str'>'// [[[cog: print """'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>l</span><span class='op'>(</span><span class='str'>'// hello'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>l</span><span class='op'>(</span><span class='str'>'// bye'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span><span class='op'>(</span><span class='str'>'// """)]]]'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>gen</span><span class='op'>.</span><span class='nam'>getCode</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'hello\nbye'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testCompressed2</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># For a while, I supported compressed code blocks, but no longer.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span><span class='op'>(</span><span class='str'>'// [[[cog: print """'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>l</span><span class='op'>(</span><span class='str'>'hello'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>l</span><span class='op'>(</span><span class='str'>'bye'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span><span class='op'>(</span><span class='str'>'// """)]]]'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>gen</span><span class='op'>.</span><span class='nam'>getCode</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'hello\nbye'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testCompressed3</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># For a while, I supported compressed code blocks, but no longer.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span><span class='op'>(</span><span class='str'>'// [[[cog'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>l</span><span class='op'>(</span><span class='str'>'print """hello'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>l</span><span class='op'>(</span><span class='str'>'bye'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span><span class='op'>(</span><span class='str'>'// """)]]]'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>gen</span><span class='op'>.</span><span class='nam'>getCode</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'print """hello\nbye'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testCompressed4</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># For a while, I supported compressed code blocks, but no longer.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span><span class='op'>(</span><span class='str'>'// [[[cog: print """'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>l</span><span class='op'>(</span><span class='str'>'hello'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>l</span><span class='op'>(</span><span class='str'>'bye""")'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span><span class='op'>(</span><span class='str'>'// ]]]'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>gen</span><span class='op'>.</span><span class='nam'>getCode</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'hello\nbye""")'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testNoCommonPrefixForMarkers</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># It's important to be able to use #if 0 to hide lines from a</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># C++ compiler.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span><span class='op'>(</span><span class='str'>'#if 0 //[[[cog'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>l</span><span class='op'>(</span><span class='str'>'\timport cog, sys'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>l</span><span class='op'>(</span><span class='str'>''</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>l</span><span class='op'>(</span><span class='str'>'\tprint sys.argv'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span><span class='op'>(</span><span class='str'>'#endif //]]]'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>gen</span><span class='op'>.</span><span class='nam'>getCode</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'import cog, sys\n\nprint sys.argv'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>class</span> <span class='nam'>TestCaseWithTempDir</span><span class='op'>(</span><span class='nam'>TestCase</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>newCog</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Initialize the cog members for another run.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Create a cog engine, and catch its output.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span> <span class='op'>=</span> <span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>StringIO</span><span class='op'>.</span><span class='nam'>StringIO</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>setOutput</span><span class='op'>(</span><span class='nam'>stdout</span><span class='op'>=</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>,</span> <span class='nam'>stderr</span><span class='op'>=</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>setUp</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Create a temporary directory.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>tempdir</span> <span class='op'>=</span> <span class='nam'>path</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>(</span><span class='nam'>tempfile</span><span class='op'>.</span><span class='nam'>gettempdir</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span> <span class='op'>/</span> <span class='op'>(</span><span class='str'>'testcog_tempdir_'</span> <span class='op'>+</span> <span class='nam'>str</span><span class='op'>(</span><span class='nam'>random</span><span class='op'>.</span><span class='nam'>random</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='op'>[</span><span class='num'>2</span><span class='op'>:</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>tempdir</span><span class='op'>.</span><span class='nam'>mkdir</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>olddir</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>getcwd</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>chdir</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>tempdir</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>tearDown</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>chdir</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>olddir</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Get rid of the temporary directory.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>tempdir</span><span class='op'>.</span><span class='nam'>rmtree</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>sFName1</span><span class='op'>,</span> <span class='nam'>sFName2</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>tempdir</span> <span class='op'>/</span> <span class='nam'>sFName1</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>text</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>tempdir</span> <span class='op'>/</span> <span class='nam'>sFName2</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>text</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>assertFileContent</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>sFName</span><span class='op'>,</span> <span class='nam'>sContent</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>sAbsName</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>tempdir</span> <span class='op'>/</span> <span class='nam'>sFName</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>f</span> <span class='op'>=</span> <span class='nam'>open</span><span class='op'>(</span><span class='nam'>sAbsName</span><span class='op'>,</span> <span class='str'>'rb'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>sFileContent</span> <span class='op'>=</span> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>finally</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>sFileContent</span><span class='op'>,</span> <span class='nam'>sContent</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>class</span> <span class='nam'>ArgumentHandlingTests</span><span class='op'>(</span><span class='nam'>TestCaseWithTempDir</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testArgumentFailure</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Return value 2 means usage problem.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>main</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-j'</span><span class='op'>]</span><span class='op'>)</span> <span class='op'>==</span> <span class='num'>2</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='str'>"option -j not recognized"</span><span class='op'>)</span> <span class='op'>>=</span> <span class='num'>0</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaises</span><span class='op'>(</span><span class='nam'>CogUsageError</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaises</span><span class='op'>(</span><span class='nam'>CogUsageError</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-j'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testNoDashOAndAtFile</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cogfiles.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> # Please run cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaises</span><span class='op'>(</span><span class='nam'>CogUsageError</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-o'</span><span class='op'>,</span> <span class='str'>'foo'</span><span class='op'>,</span> <span class='str'>'@cogfiles.txt'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testDashV</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>main</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-v'</span><span class='op'>]</span><span class='op'>)</span> <span class='op'>==</span> <span class='num'>0</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='str'>'Cog version %s\n'</span> <span class='op'>%</span> <span class='nam'>__version__</span><span class='op'>,</span> <span class='nam'>output</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>producesHelp</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>args</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>argv</span> <span class='op'>=</span> <span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>]</span> <span class='op'>+</span> <span class='nam'>args</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>main</span><span class='op'>(</span><span class='nam'>argv</span><span class='op'>)</span> <span class='op'>==</span> <span class='num'>0</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEquals</span><span class='op'>(</span><span class='nam'>usage</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testDashH</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># -h or -? anywhere on the command line should just print help.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>producesHelp</span><span class='op'>(</span><span class='str'>"-h"</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>producesHelp</span><span class='op'>(</span><span class='str'>"-?"</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>producesHelp</span><span class='op'>(</span><span class='str'>"fooey.txt -h"</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>producesHelp</span><span class='op'>(</span><span class='str'>"-o -r @fooey.txt -? @booey.txt"</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testDashOAndDashR</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cogfile.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> # Please run cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaises</span><span class='op'>(</span><span class='nam'>CogUsageError</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-o'</span><span class='op'>,</span> <span class='str'>'foo'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'cogfile.txt'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testDashZ</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> // This is my C++ file.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing']</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> for fn in fnames:</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("void %s();" % fn)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> // This is my C++ file.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing']</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> for fn in fnames:</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("void %s();" % fn)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> void DoSomething();</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> void DoAnotherThing();</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> void DoLastThing();</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaisesMsg</span><span class='op'>(</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>CogError</span><span class='op'>,</span> <span class='str'>"test.cog(6): Missing '[[[end]]]' before end of file."</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-z'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testBadDashD</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaises</span><span class='op'>(</span><span class='nam'>CogUsageError</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-Dfooey'</span><span class='op'>,</span> <span class='str'>'cog.txt'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaises</span><span class='op'>(</span><span class='nam'>CogUsageError</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-D'</span><span class='op'>,</span> <span class='str'>'fooey'</span><span class='op'>,</span> <span class='str'>'cog.txt'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>class</span> <span class='nam'>TestFileHandling</span><span class='op'>(</span><span class='nam'>TestCaseWithTempDir</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testSimple</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> // This is my C++ file.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing']</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> for fn in fnames:</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("void %s();" % fn)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> // This is my C++ file.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing']</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> for fn in fnames:</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("void %s();" % fn)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> void DoSomething();</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> void DoAnotherThing();</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> void DoLastThing();</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='str'>"(changed)"</span><span class='op'>)</span> <span class='op'>>=</span> <span class='num'>0</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testOutputFile</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># -o sets the output file.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> // This is my C++ file.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing']</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> for fn in fnames:</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("void %s();" % fn)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> // This is my C++ file.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing']</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> for fn in fnames:</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("void %s();" % fn)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> void DoSomething();</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> void DoAnotherThing();</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> void DoLastThing();</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-o'</span><span class='op'>,</span> <span class='str'>'test.cogged'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cogged'</span><span class='op'>,</span> <span class='str'>'test.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testAtFile</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'one.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("hello world")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'one.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("hello world")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> hello world</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'two.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("goodbye cruel world")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'two.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("goodbye cruel world")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> goodbye cruel world</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cogfiles.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> # Please run cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> one.cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> </span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> two.cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'@cogfiles.txt'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'one.cog'</span><span class='op'>,</span> <span class='str'>'one.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'two.cog'</span><span class='op'>,</span> <span class='str'>'two.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='str'>"(changed)"</span><span class='op'>)</span> <span class='op'>>=</span> <span class='num'>0</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testNestedAtFile</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'one.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("hello world")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'one.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("hello world")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> hello world</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'two.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("goodbye cruel world")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'two.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("goodbye cruel world")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> goodbye cruel world</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cogfiles.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> # Please run cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> one.cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> @cogfiles2.txt</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cogfiles2.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> # This one too, please.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> two.cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'@cogfiles.txt'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'one.cog'</span><span class='op'>,</span> <span class='str'>'one.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'two.cog'</span><span class='op'>,</span> <span class='str'>'two.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='str'>"(changed)"</span><span class='op'>)</span> <span class='op'>>=</span> <span class='num'>0</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testAtFileWithArgs</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'both.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("one: %s" % globals().has_key('one'))</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("two: %s" % globals().has_key('two'))</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'one.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("one: %s" % globals().has_key('one'))</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("two: %s" % globals().has_key('two'))</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> one: True // ONE</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> two: False // ONE</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'two.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("one: %s" % globals().has_key('one'))</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("two: %s" % globals().has_key('two'))</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> one: False // TWO</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> two: True // TWO</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cogfiles.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> # Please run cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> both.cog -o both.one -s ' // ONE' -D one=x</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> both.cog -o both.two -s ' // TWO' -D two=x</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'@cogfiles.txt'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'both.one'</span><span class='op'>,</span> <span class='str'>'one.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'both.two'</span><span class='op'>,</span> <span class='str'>'two.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testAtFileWithBadArgCombo</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'both.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("one: %s" % globals().has_key('one'))</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("two: %s" % globals().has_key('two'))</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cogfiles.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> # Please run cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> both.cog </span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> both.cog -d # This is bad: -r and -d</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaises</span><span class='op'>(</span><span class='nam'>CogUsageError</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'@cogfiles.txt'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testAtFileWithTrickyFilenames</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'one 1.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog cog.outl("hello world") ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'one.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog cog.outl("hello world") ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> hello world //xxx</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'subdir'</span><span class='op'>:</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'subback.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog cog.outl("down deep with backslashes") ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'subfwd.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog cog.outl("down deep with slashes") ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'subback.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog cog.outl("down deep with backslashes") ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> down deep with backslashes //yyy</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'subfwd.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog cog.outl("down deep with slashes") ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> down deep with slashes //zzz</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cogfiles.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> # Please run cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> 'one 1.cog' -s ' //xxx'</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> subdir\subback.cog -s ' //yyy'</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> subdir/subfwd.cog -s ' //zzz'</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-z'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'@cogfiles.txt'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'one 1.cog'</span><span class='op'>,</span> <span class='str'>'one.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'subdir/subback.cog'</span><span class='op'>,</span> <span class='str'>'subback.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'subdir/subfwd.cog'</span><span class='op'>,</span> <span class='str'>'subfwd.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>class</span> <span class='nam'>CogTestLineEndings</span><span class='op'>(</span><span class='nam'>TestCaseWithTempDir</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>"""Tests for -U option (force LF line-endings in output)."""</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>lines_in</span> <span class='op'>=</span> <span class='op'>[</span><span class='str'>'Some text.'</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'//[[[cog'</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cog.outl("Cog text")'</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'//]]]'</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'gobbledegook.'</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'//[[[end]]]'</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'epilogue.'</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>''</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>lines_out</span> <span class='op'>=</span> <span class='op'>[</span><span class='str'>'Some text.'</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'//[[[cog'</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cog.outl("Cog text")'</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'//]]]'</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'Cog text'</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'//[[[end]]]'</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'epilogue.'</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>''</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testOutputNativeEol</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='op'>{</span><span class='str'>'infile'</span><span class='op'>:</span> <span class='str'>'\n'</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines_in</span><span class='op'>)</span><span class='op'>}</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-o'</span><span class='op'>,</span> <span class='str'>'outfile'</span><span class='op'>,</span> <span class='str'>'infile'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFileContent</span><span class='op'>(</span><span class='str'>'outfile'</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>linesep</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines_out</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testOutputLfEol</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='op'>{</span><span class='str'>'infile'</span><span class='op'>:</span> <span class='str'>'\n'</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines_in</span><span class='op'>)</span><span class='op'>}</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-U'</span><span class='op'>,</span> <span class='str'>'-o'</span><span class='op'>,</span> <span class='str'>'outfile'</span><span class='op'>,</span> <span class='str'>'infile'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFileContent</span><span class='op'>(</span><span class='str'>'outfile'</span><span class='op'>,</span> <span class='str'>'\n'</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines_out</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testReplaceNativeEol</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='op'>{</span><span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>'\n'</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines_in</span><span class='op'>)</span><span class='op'>}</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFileContent</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>linesep</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines_out</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testReplaceLfEol</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='op'>{</span><span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>'\n'</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines_in</span><span class='op'>)</span><span class='op'>}</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-U'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFileContent</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'\n'</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines_out</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>class</span> <span class='nam'>TestCaseWithImports</span><span class='op'>(</span><span class='nam'>TestCaseWithTempDir</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" When running tests which import modules, the sys.modules list</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> leaks from one test to the next. This test case class scrubs</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> the list after each run to keep the tests isolated from each other.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>setUp</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>TestCaseWithTempDir</span><span class='op'>.</span><span class='nam'>setUp</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sysmodulekeys</span> <span class='op'>=</span> <span class='nam'>list</span><span class='op'>(</span><span class='nam'>sys</span><span class='op'>.</span><span class='nam'>modules</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>tearDown</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>modstoscrub</span> <span class='op'>=</span> <span class='op'>[</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>modname</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>for</span> <span class='nam'>modname</span> <span class='key'>in</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>modules</span><span class="strut"> </span></p>
-<p class='pln'> <span class='key'>if</span> <span class='nam'>modname</span> <span class='key'>not</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sysmodulekeys</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>]</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>for</span> <span class='nam'>modname</span> <span class='key'>in</span> <span class='nam'>modstoscrub</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>del</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>modules</span><span class='op'>[</span><span class='nam'>modname</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>TestCaseWithTempDir</span><span class='op'>.</span><span class='nam'>tearDown</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>class</span> <span class='nam'>CogIncludeTests</span><span class='op'>(</span><span class='nam'>TestCaseWithImports</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>dincludes</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> import mymodule</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> import mymodule</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Hello from mymodule</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'test2.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> import mymodule</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Hello from mymodule in inc2</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'include'</span><span class='op'>:</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'mymodule.py'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> import cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("Hello from mymodule")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'inc2'</span><span class='op'>:</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'mymodule.py'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> import cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("Hello from mymodule in inc2")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'inc3'</span><span class='op'>:</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'someothermodule.py'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> import cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("This is some other module.")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testNeedIncludePath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Try it without the -I, to see that an ImportError happens.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>dincludes</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaises</span><span class='op'>(</span><span class='nam'>ImportError</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testIncludePath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Test that -I adds include directories properly.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>dincludes</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'include'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testTwoIncludePaths</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Test that two -I's add include directories properly.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>dincludes</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'include'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'inc2'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testTwoIncludePaths2</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Test that two -I's add include directories properly.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>dincludes</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'inc2'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'include'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test2.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testUselessIncludePath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Test that the search will continue past the first directory.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>dincludes</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'inc3'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'include'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testSysPathIsUnchanged</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'bad.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog cog.error("Oh no!") ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'good.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog cog.outl("Oh yes!") ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Is it unchanged just by creating a cog engine?</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>oldsyspath</span> <span class='op'>=</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>[</span><span class='op'>:</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>oldsyspath</span><span class='op'>,</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Is it unchanged for a successful run?</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'good.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>oldsyspath</span><span class='op'>,</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Is it unchanged for a successful run with includes?</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'xyzzy'</span><span class='op'>,</span> <span class='str'>'good.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>oldsyspath</span><span class='op'>,</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Is it unchanged for a successful run with two includes?</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'xyzzy'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'quux'</span><span class='op'>,</span> <span class='str'>'good.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>oldsyspath</span><span class='op'>,</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Is it unchanged for a failed run?</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaises</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'bad.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>oldsyspath</span><span class='op'>,</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Is it unchanged for a failed run with includes?</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaises</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'xyzzy'</span><span class='op'>,</span> <span class='str'>'bad.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>oldsyspath</span><span class='op'>,</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Is it unchanged for a failed run with two includes?</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaises</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'xyzzy'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'quux'</span><span class='op'>,</span> <span class='str'>'bad.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>oldsyspath</span><span class='op'>,</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testSubDirectories</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Test that relative paths on the command line work, with includes.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'code'</span><span class='op'>:</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> import mysubmodule</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> import mysubmodule</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Hello from mysubmodule</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'mysubmodule.py'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> import cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("Hello from mysubmodule")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># We should be able to invoke cog without the -I switch, and it will</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># auto-include the current directory</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'code/test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'code/test.cog'</span><span class='op'>,</span> <span class='str'>'code/test.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>class</span> <span class='nam'>CogTestsInFiles</span><span class='op'>(</span><span class='nam'>TestCaseWithTempDir</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testWarnIfNoCogCode</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Test that the -e switch warns if there is no Cog code.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'with.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("hello world")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> hello world</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'without.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> There's no cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> code in this file.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-e'</span><span class='op'>,</span> <span class='str'>'with.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='str'>"Warning"</span><span class='op'>)</span> <span class='op'><</span> <span class='num'>0</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-e'</span><span class='op'>,</span> <span class='str'>'without.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='str'>"Warning: no cog code found in without.cog"</span><span class='op'>)</span> <span class='op'>>=</span> <span class='num'>0</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'without.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='str'>"Warning"</span><span class='op'>)</span> <span class='op'><</span> <span class='num'>0</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testFileNameProps</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cog1.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("This is %s in, %s out" % (cog.inFile, cog.outFile))</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> this is cog1.txt in, cog1.txt out</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cog1.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("This is %s in, %s out" % (cog.inFile, cog.outFile))</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This is cog1.txt in, cog1.txt out</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cog1out.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("This is %s in, %s out" % (cog.inFile, cog.outFile))</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This is cog1.txt in, cog1out.txt out</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> [[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'cog1.txt'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'cog1.txt'</span><span class='op'>,</span> <span class='str'>'cog1.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-o'</span><span class='op'>,</span> <span class='str'>'cog1out.txt'</span><span class='op'>,</span> <span class='str'>'cog1.txt'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'cog1out.txt'</span><span class='op'>,</span> <span class='str'>'cog1out.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testGlobalsDontCrossFiles</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Make sure that global values don't get shared between files.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'one.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog s = "This was set in one.cog" ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog cog.outl(s) ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'one.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog s = "This was set in one.cog" ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog cog.outl(s) ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This was set in one.cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'two.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> try:</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl(s)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> except NameError:</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("s isn't set!")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'two.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> try:</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl(s)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> except NameError:</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("s isn't set!")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> s isn't set!</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cogfiles.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> # Please run cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> one.cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> </span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> two.cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'@cogfiles.txt'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'one.cog'</span><span class='op'>,</span> <span class='str'>'one.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'two.cog'</span><span class='op'>,</span> <span class='str'>'two.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='str'>"(changed)"</span><span class='op'>)</span> <span class='op'>>=</span> <span class='num'>0</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testRemoveGeneratedOutput</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cog1.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("This line was generated.")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This line was generated.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This line was not.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cog1.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("This line was generated.")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This line was not.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cog1.out2'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("This line was generated.")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This line was generated.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This line was not.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Remove generated output.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-x'</span><span class='op'>,</span> <span class='str'>'cog1.txt'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'cog1.txt'</span><span class='op'>,</span> <span class='str'>'cog1.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Regenerate the generated output.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'cog1.txt'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'cog1.txt'</span><span class='op'>,</span> <span class='str'>'cog1.out2'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Remove the generated output again.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-x'</span><span class='op'>,</span> <span class='str'>'cog1.txt'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'cog1.txt'</span><span class='op'>,</span> <span class='str'>'cog1.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testMsgCall</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.msg("Hello there!")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> #[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>output</span><span class='op'>,</span> <span class='str'>"Message: Hello there!\n"</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testErrorMessageHasNoTraceback</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Test that a Cog error is printed to stderr with no traceback.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cog1.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("This line was newly")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("generated by cog")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("blah blah.")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Xhis line was newly</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> generated by cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> blah blah.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>stderr</span> <span class='op'>=</span> <span class='nam'>StringIO</span><span class='op'>.</span><span class='nam'>StringIO</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>setOutput</span><span class='op'>(</span><span class='nam'>stderr</span><span class='op'>=</span><span class='nam'>stderr</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>main</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-c'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>"cog1.txt"</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>"Cogging cog1.txt\n"</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>stderr</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>"cog1.txt(9): Output has been edited! Delete old checksum to unprotect.\n"</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testDashD</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> --[[[cog cog.outl("Defined fooey as " + fooey) ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> --[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'test.kablooey'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> --[[[cog cog.outl("Defined fooey as " + fooey) ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Defined fooey as kablooey</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> --[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'test.einstein'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> --[[[cog cog.outl("Defined fooey as " + fooey) ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Defined fooey as e=mc2</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> --[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-D'</span><span class='op'>,</span> <span class='str'>'fooey=kablooey'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.kablooey'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-Dfooey=kablooey'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.kablooey'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-Dfooey=e=mc2'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.einstein'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-Dbar=quux'</span><span class='op'>,</span> <span class='str'>'-Dfooey=kablooey'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.kablooey'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-Dfooey=kablooey'</span><span class='op'>,</span> <span class='str'>'-Dbar=quux'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.kablooey'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-Dfooey=gooey'</span><span class='op'>,</span> <span class='str'>'-Dfooey=kablooey'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.kablooey'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testOutputToStdout</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> --[[[cog cog.outl('Hey there!') ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> --[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>stderr</span> <span class='op'>=</span> <span class='nam'>StringIO</span><span class='op'>.</span><span class='nam'>StringIO</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>setOutput</span><span class='op'>(</span><span class='nam'>stderr</span><span class='op'>=</span><span class='nam'>stderr</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>outerr</span> <span class='op'>=</span> <span class='nam'>stderr</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>output</span><span class='op'>,</span> <span class='str'>"--[[[cog cog.outl('Hey there!') ]]]\nHey there!\n--[[[end]]]\n"</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>outerr</span><span class='op'>,</span> <span class='str'>""</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testSuffixOutputLines</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Hey there.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> ;[[[cog cog.outl('a\\nb\\n \\nc') ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> ;[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Good bye.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Hey there.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> ;[[[cog cog.outl('a\\nb\\n \\nc') ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> a (foo)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> b (foo)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> </span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> c (foo)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> ;[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Good bye.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-s'</span><span class='op'>,</span> <span class='str'>' (foo)'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testEmptySuffix</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> ;[[[cog cog.outl('a\\nb\\nc') ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> ;[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> ;[[[cog cog.outl('a\\nb\\nc') ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> a</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> b</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> c</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> ;[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-s'</span><span class='op'>,</span> <span class='str'>''</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testHellishSuffix</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> ;[[[cog cog.outl('a\\n\\nb') ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> ;[[[cog cog.outl('a\\n\\nb') ]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> a /\\n*+([)]><</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> </span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> b /\\n*+([)]><</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-z'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-s'</span><span class='op'>,</span> <span class='str'>r' /\n*+([)]><'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>class</span> <span class='nam'>WritabilityTests</span><span class='op'>(</span><span class='nam'>TestCaseWithTempDir</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> for fn in ['DoSomething', 'DoAnotherThing', 'DoLastThing']:</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("void %s();" % fn)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> for fn in ['DoSomething', 'DoAnotherThing', 'DoLastThing']:</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("void %s();" % fn)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> void DoSomething();</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> void DoAnotherThing();</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> void DoLastThing();</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='exc'> <span class='key'>if</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>name</span> <span class='op'>==</span> <span class='str'>'nt'</span><span class='op'>:</span> <span class='com'># pragma: no cover</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># for Windows</span><span class="strut"> </span></p>
-<p class='exc'> <span class='nam'>cmd_w_args</span> <span class='op'>=</span> <span class='str'>'attrib -R %s'</span><span class="strut"> </span></p>
-<p class='exc'> <span class='nam'>cmd_w_asterisk</span> <span class='op'>=</span> <span class='str'>'attrib -R *'</span><span class="strut"> </span></p>
-<p class='exc'> <span class='key'>else</span><span class='op'>:</span> <span class='com'># pragma: no cover</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># for unix-like</span><span class="strut"> </span></p>
-<p class='exc'> <span class='nam'>cmd_w_args</span> <span class='op'>=</span> <span class='str'>'chmod +w %s'</span><span class="strut"> </span></p>
-<p class='exc'> <span class='nam'>cmd_w_asterisk</span> <span class='op'>=</span> <span class='str'>'chmod +w *'</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>setUp</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>TestCaseWithTempDir</span><span class='op'>.</span><span class='nam'>setUp</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>testcog</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>tempdir</span> <span class='op'>/</span> <span class='str'>'test.cog'</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>testcog</span><span class='op'>.</span><span class='nam'>chmod</span><span class='op'>(</span><span class='nam'>stat</span><span class='op'>.</span><span class='nam'>S_IREAD</span><span class='op'>)</span> <span class='com'># Make the file readonly.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>assert</span> <span class='key'>not</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>access</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>testcog</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>W_OK</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>tearDown</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>testcog</span><span class='op'>.</span><span class='nam'>chmod</span><span class='op'>(</span><span class='nam'>stat</span><span class='op'>.</span><span class='nam'>S_IWRITE</span><span class='op'>)</span> <span class='com'># Make the file writable again.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>TestCaseWithTempDir</span><span class='op'>.</span><span class='nam'>tearDown</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testReadonlyNoCommand</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaisesMsg</span><span class='op'>(</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>CogError</span><span class='op'>,</span> <span class='str'>"Can't overwrite test.cog"</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>assert</span> <span class='key'>not</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>access</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>testcog</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>W_OK</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testReadonlyWithCommand</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-w'</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cmd_w_args</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>assert</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>access</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>testcog</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>W_OK</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testReadonlyWithCommandWithNoSlot</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-w'</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cmd_w_asterisk</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>assert</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>access</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>testcog</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>W_OK</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testReadonlyWithIneffectualCommand</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaisesMsg</span><span class='op'>(</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>CogError</span><span class='op'>,</span> <span class='str'>"Couldn't make test.cog writable"</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-w'</span><span class='op'>,</span> <span class='str'>'echo %s'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>assert</span> <span class='key'>not</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>access</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>testcog</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>W_OK</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>class</span> <span class='nam'>ChecksumTests</span><span class='op'>(</span><span class='nam'>TestCaseWithTempDir</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testCreateChecksumOutput</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cog1.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("This line was generated.")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This line was generated.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This line was not.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cog1.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("This line was generated.")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This line was generated.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]] (checksum: 8adb13fb59b996a1c7f0065ea9f3d893)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This line was not.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-c'</span><span class='op'>,</span> <span class='str'>'cog1.txt'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'cog1.txt'</span><span class='op'>,</span> <span class='str'>'cog1.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testCheckChecksumOutput</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cog1.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("This line was newly")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("generated by cog")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("blah blah.")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This line was generated.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]] (checksum: 8adb13fb59b996a1c7f0065ea9f3d893)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cog1.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("This line was newly")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("generated by cog")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("blah blah.")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This line was newly</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> generated by cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> blah blah.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-c'</span><span class='op'>,</span> <span class='str'>'cog1.txt'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'cog1.txt'</span><span class='op'>,</span> <span class='str'>'cog1.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testRemoveChecksumOutput</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cog1.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("This line was newly")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("generated by cog")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("blah blah.")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This line was generated.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]] (checksum: 8adb13fb59b996a1c7f0065ea9f3d893) fooey</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cog1.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("This line was newly")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("generated by cog")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("blah blah.")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This line was newly</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> generated by cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> blah blah.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]] fooey</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'cog1.txt'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'cog1.txt'</span><span class='op'>,</span> <span class='str'>'cog1.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testTamperedChecksumOutput</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cog1.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("This line was newly")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("generated by cog")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("blah blah.")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Xhis line was newly</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> generated by cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> blah blah.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cog2.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("This line was newly")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("generated by cog")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("blah blah.")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This line was newly</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> generated by cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> blah blah!</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cog3.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("This line was newly")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("generated by cog")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("blah blah.")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> </span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This line was newly</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> generated by cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> blah blah.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cog4.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("This line was newly")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("generated by cog")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("blah blah.")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This line was newly</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> generated by cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> blah blah..</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cog5.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("This line was newly")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("generated by cog")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("blah blah.")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> This line was newly</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> generated by cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> blah blah.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> extra</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'cog6.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("This line was newly")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("generated by cog")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("blah blah.")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaisesMsg</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>"cog1.txt(9): Output has been edited! Delete old checksum to unprotect."</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-c'</span><span class='op'>,</span> <span class='str'>"cog1.txt"</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaisesMsg</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>"cog2.txt(9): Output has been edited! Delete old checksum to unprotect."</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-c'</span><span class='op'>,</span> <span class='str'>"cog2.txt"</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaisesMsg</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>"cog3.txt(10): Output has been edited! Delete old checksum to unprotect."</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-c'</span><span class='op'>,</span> <span class='str'>"cog3.txt"</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaisesMsg</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>"cog4.txt(9): Output has been edited! Delete old checksum to unprotect."</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-c'</span><span class='op'>,</span> <span class='str'>"cog4.txt"</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaisesMsg</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>"cog5.txt(10): Output has been edited! Delete old checksum to unprotect."</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-c'</span><span class='op'>,</span> <span class='str'>"cog5.txt"</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaisesMsg</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>"cog6.txt(6): Output has been edited! Delete old checksum to unprotect."</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-c'</span><span class='op'>,</span> <span class='str'>"cog6.txt"</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>class</span> <span class='nam'>BlakeTests</span><span class='op'>(</span><span class='nam'>TestCaseWithTempDir</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Blake Winton's contributions. </span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testDeleteCode</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># -o sets the output file.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> // This is my C++ file.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing']</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> for fn in fnames:</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("void %s();" % fn)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Some Sample Code Here</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]Data Data</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> And Some More</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> // This is my C++ file.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> void DoSomething();</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> void DoAnotherThing();</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> void DoLastThing();</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> And Some More</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-d'</span><span class='op'>,</span> <span class='str'>'-o'</span><span class='op'>,</span> <span class='str'>'test.cogged'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cogged'</span><span class='op'>,</span> <span class='str'>'test.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testDeleteCodeWithDashRFails</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> // This is my C++ file.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaises</span><span class='op'>(</span><span class='nam'>CogUsageError</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-d'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testSettingGlobals</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Blake Winton contributed a way to set the globals that will be used in</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># processFile().</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> // This is my C++ file.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> for fn in fnames:</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.outl("void %s();" % fn)</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Some Sample Code Here</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]"""</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> // This is my C++ file.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> void DoBlake();</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> void DoWinton();</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> void DoContribution();</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>globals</span> <span class='op'>=</span> <span class='op'>{</span><span class='op'>}</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>globals</span><span class='op'>[</span><span class='str'>'fnames'</span><span class='op'>]</span> <span class='op'>=</span> <span class='op'>[</span><span class='str'>'DoBlake'</span><span class='op'>,</span> <span class='str'>'DoWinton'</span><span class='op'>,</span> <span class='str'>'DoContribution'</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bDeleteCode</span> <span class='op'>=</span> <span class='nam'>True</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>processFile</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.cogged'</span><span class='op'>,</span> <span class='nam'>globals</span><span class='op'>=</span><span class='nam'>globals</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cogged'</span><span class='op'>,</span> <span class='str'>'test.out'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>class</span> <span class='nam'>ErrorCallTests</span><span class='op'>(</span><span class='nam'>TestCaseWithTempDir</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testErrorCallHasNoTraceback</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Test that cog.error() doesn't show a traceback.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'error.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> cog.error("Something Bad!")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>main</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'error.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>output</span><span class='op'>,</span> <span class='str'>"Cogging error.cog\nError: Something Bad!\n"</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>testRealErrorHasTraceback</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Test that a genuine error does show a traceback.</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>'error.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> raise RuntimeError("Hey!")</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> //[[[end]]]</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class='op'>,</span><span class="strut"> </span></p>
-<p class='pln'> <span class='op'>}</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>main</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'error.cog'</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>msg</span> <span class='op'>=</span> <span class='str'>'Actual output:\n'</span> <span class='op'>+</span> <span class='nam'>output</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assert_</span><span class='op'>(</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>startswith</span><span class='op'>(</span><span class='str'>"Cogging error.cog\nTraceback (most recent"</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assert_</span><span class='op'>(</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='str'>"RuntimeError: Hey!"</span><span class='op'>)</span> <span class='op'>></span> <span class='num'>0</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='exc'><span class='key'>if</span> <span class='nam'>__name__</span> <span class='op'>==</span> <span class='str'>'__main__'</span><span class='op'>:</span> <span class='com'>#pragma: no cover</span><span class="strut"> </span></p>
-<p class='exc'> <span class='nam'>unittest</span><span class='op'>.</span><span class='nam'>main</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'><span class='com'># Things not yet tested:</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># - A bad -w command (currently fails silently).</span><span class="strut"> </span></p>
-
-</td>
-</tr>
-</table>
+ <table cellspacing='0' cellpadding='0'>
+ <tr>
+ <td class='linenos' valign='top'>
+<p id='n1' class='pln'>1</p>
+<p id='n2' class='pln'>2</p>
+<p id='n3' class='pln'>3</p>
+<p id='n4' class='pln'>4</p>
+<p id='n5' class='pln'>5</p>
+<p id='n6' class='pln'>6</p>
+<p id='n7' class='stm run hide_run'>7</p>
+<p id='n8' class='stm run hide_run'>8</p>
+<p id='n9' class='stm run hide_run'>9</p>
+<p id='n10' class='stm run hide_run'>10</p>
+<p id='n11' class='stm run hide_run'>11</p>
+<p id='n12' class='stm run hide_run'>12</p>
+<p id='n13' class='stm run hide_run'>13</p>
+<p id='n14' class='stm run hide_run'>14</p>
+<p id='n15' class='pln'>15</p>
+<p id='n16' class='stm run hide_run'>16</p>
+<p id='n17' class='pln'>17</p>
+<p id='n18' class='pln'>18</p>
+<p id='n19' class='stm run hide_run'>19</p>
+<p id='n20' class='pln'>20</p>
+<p id='n21' class='pln'>21</p>
+<p id='n22' class='pln'>22</p>
+<p id='n23' class='stm run hide_run'>23</p>
+<p id='n24' class='stm run hide_run'>24</p>
+<p id='n25' class='stm run hide_run'>25</p>
+<p id='n26' class='stm run hide_run'>26</p>
+<p id='n27' class='stm run hide_run'>27</p>
+<p id='n28' class='pln'>28</p>
+<p id='n29' class='exc'>29</p>
+<p id='n30' class='stm run hide_run'>30</p>
+<p id='n31' class='pln'>31</p>
+<p id='n32' class='stm run hide_run'>32</p>
+<p id='n33' class='exc'>33</p>
+<p id='n34' class='pln'>34</p>
+<p id='n35' class='exc'>35</p>
+<p id='n36' class='exc'>36</p>
+<p id='n37' class='exc'>37</p>
+<p id='n38' class='exc'>38</p>
+<p id='n39' class='exc'>39</p>
+<p id='n40' class='exc'>40</p>
+<p id='n41' class='exc'>41</p>
+<p id='n42' class='pln'>42</p>
+<p id='n43' class='stm run hide_run'>43</p>
+<p id='n44' class='pln'>44</p>
+<p id='n45' class='pln'>45</p>
+<p id='n46' class='pln'>46</p>
+<p id='n47' class='stm run hide_run'>47</p>
+<p id='n48' class='stm run hide_run'>48</p>
+<p id='n49' class='pln'>49</p>
+<p id='n50' class='pln'>50</p>
+<p id='n51' class='pln'>51</p>
+<p id='n52' class='pln'>52</p>
+<p id='n53' class='pln'>53</p>
+<p id='n54' class='pln'>54</p>
+<p id='n55' class='pln'>55</p>
+<p id='n56' class='stm run hide_run'>56</p>
+<p id='n57' class='stm run hide_run'>57</p>
+<p id='n58' class='pln'>58</p>
+<p id='n59' class='stm run hide_run'>59</p>
+<p id='n60' class='stm run hide_run'>60</p>
+<p id='n61' class='pln'>61</p>
+<p id='n62' class='pln'>62</p>
+<p id='n63' class='pln'>63</p>
+<p id='n64' class='pln'>64</p>
+<p id='n65' class='pln'>65</p>
+<p id='n66' class='pln'>66</p>
+<p id='n67' class='pln'>67</p>
+<p id='n68' class='pln'>68</p>
+<p id='n69' class='pln'>69</p>
+<p id='n70' class='pln'>70</p>
+<p id='n71' class='pln'>71</p>
+<p id='n72' class='stm run hide_run'>72</p>
+<p id='n73' class='pln'>73</p>
+<p id='n74' class='pln'>74</p>
+<p id='n75' class='pln'>75</p>
+<p id='n76' class='pln'>76</p>
+<p id='n77' class='pln'>77</p>
+<p id='n78' class='pln'>78</p>
+<p id='n79' class='pln'>79</p>
+<p id='n80' class='pln'>80</p>
+<p id='n81' class='pln'>81</p>
+<p id='n82' class='pln'>82</p>
+<p id='n83' class='pln'>83</p>
+<p id='n84' class='pln'>84</p>
+<p id='n85' class='pln'>85</p>
+<p id='n86' class='stm run hide_run'>86</p>
+<p id='n87' class='pln'>87</p>
+<p id='n88' class='stm run hide_run'>88</p>
+<p id='n89' class='pln'>89</p>
+<p id='n90' class='pln'>90</p>
+<p id='n91' class='stm run hide_run'>91</p>
+<p id='n92' class='pln'>92</p>
+<p id='n93' class='pln'>93</p>
+<p id='n94' class='pln'>94</p>
+<p id='n95' class='pln'>95</p>
+<p id='n96' class='pln'>96</p>
+<p id='n97' class='pln'>97</p>
+<p id='n98' class='pln'>98</p>
+<p id='n99' class='stm run hide_run'>99</p>
+<p id='n100' class='stm run hide_run'>100</p>
+<p id='n101' class='pln'>101</p>
+<p id='n102' class='stm run hide_run'>102</p>
+<p id='n103' class='pln'>103</p>
+<p id='n104' class='stm run hide_run'>104</p>
+<p id='n105' class='pln'>105</p>
+<p id='n106' class='pln'>106</p>
+<p id='n107' class='pln'>107</p>
+<p id='n108' class='pln'>108</p>
+<p id='n109' class='pln'>109</p>
+<p id='n110' class='pln'>110</p>
+<p id='n111' class='pln'>111</p>
+<p id='n112' class='pln'>112</p>
+<p id='n113' class='pln'>113</p>
+<p id='n114' class='pln'>114</p>
+<p id='n115' class='pln'>115</p>
+<p id='n116' class='pln'>116</p>
+<p id='n117' class='pln'>117</p>
+<p id='n118' class='pln'>118</p>
+<p id='n119' class='pln'>119</p>
+<p id='n120' class='pln'>120</p>
+<p id='n121' class='pln'>121</p>
+<p id='n122' class='pln'>122</p>
+<p id='n123' class='stm run hide_run'>123</p>
+<p id='n124' class='stm run hide_run'>124</p>
+<p id='n125' class='pln'>125</p>
+<p id='n126' class='stm run hide_run'>126</p>
+<p id='n127' class='stm run hide_run'>127</p>
+<p id='n128' class='pln'>128</p>
+<p id='n129' class='pln'>129</p>
+<p id='n130' class='pln'>130</p>
+<p id='n131' class='pln'>131</p>
+<p id='n132' class='pln'>132</p>
+<p id='n133' class='pln'>133</p>
+<p id='n134' class='pln'>134</p>
+<p id='n135' class='pln'>135</p>
+<p id='n136' class='pln'>136</p>
+<p id='n137' class='pln'>137</p>
+<p id='n138' class='pln'>138</p>
+<p id='n139' class='pln'>139</p>
+<p id='n140' class='pln'>140</p>
+<p id='n141' class='stm run hide_run'>141</p>
+<p id='n142' class='stm run hide_run'>142</p>
+<p id='n143' class='pln'>143</p>
+<p id='n144' class='stm run hide_run'>144</p>
+<p id='n145' class='stm run hide_run'>145</p>
+<p id='n146' class='pln'>146</p>
+<p id='n147' class='pln'>147</p>
+<p id='n148' class='pln'>148</p>
+<p id='n149' class='pln'>149</p>
+<p id='n150' class='pln'>150</p>
+<p id='n151' class='pln'>151</p>
+<p id='n152' class='pln'>152</p>
+<p id='n153' class='pln'>153</p>
+<p id='n154' class='pln'>154</p>
+<p id='n155' class='pln'>155</p>
+<p id='n156' class='pln'>156</p>
+<p id='n157' class='pln'>157</p>
+<p id='n158' class='pln'>158</p>
+<p id='n159' class='pln'>159</p>
+<p id='n160' class='stm run hide_run'>160</p>
+<p id='n161' class='stm run hide_run'>161</p>
+<p id='n162' class='pln'>162</p>
+<p id='n163' class='stm run hide_run'>163</p>
+<p id='n164' class='pln'>164</p>
+<p id='n165' class='pln'>165</p>
+<p id='n166' class='stm run hide_run'>166</p>
+<p id='n167' class='pln'>167</p>
+<p id='n168' class='pln'>168</p>
+<p id='n169' class='pln'>169</p>
+<p id='n170' class='pln'>170</p>
+<p id='n171' class='pln'>171</p>
+<p id='n172' class='pln'>172</p>
+<p id='n173' class='pln'>173</p>
+<p id='n174' class='pln'>174</p>
+<p id='n175' class='pln'>175</p>
+<p id='n176' class='pln'>176</p>
+<p id='n177' class='pln'>177</p>
+<p id='n178' class='stm run hide_run'>178</p>
+<p id='n179' class='stm run hide_run'>179</p>
+<p id='n180' class='pln'>180</p>
+<p id='n181' class='stm run hide_run'>181</p>
+<p id='n182' class='stm run hide_run'>182</p>
+<p id='n183' class='pln'>183</p>
+<p id='n184' class='pln'>184</p>
+<p id='n185' class='pln'>185</p>
+<p id='n186' class='pln'>186</p>
+<p id='n187' class='pln'>187</p>
+<p id='n188' class='pln'>188</p>
+<p id='n189' class='pln'>189</p>
+<p id='n190' class='pln'>190</p>
+<p id='n191' class='pln'>191</p>
+<p id='n192' class='pln'>192</p>
+<p id='n193' class='pln'>193</p>
+<p id='n194' class='pln'>194</p>
+<p id='n195' class='pln'>195</p>
+<p id='n196' class='stm run hide_run'>196</p>
+<p id='n197' class='stm run hide_run'>197</p>
+<p id='n198' class='pln'>198</p>
+<p id='n199' class='stm run hide_run'>199</p>
+<p id='n200' class='stm run hide_run'>200</p>
+<p id='n201' class='pln'>201</p>
+<p id='n202' class='pln'>202</p>
+<p id='n203' class='pln'>203</p>
+<p id='n204' class='pln'>204</p>
+<p id='n205' class='pln'>205</p>
+<p id='n206' class='pln'>206</p>
+<p id='n207' class='pln'>207</p>
+<p id='n208' class='pln'>208</p>
+<p id='n209' class='pln'>209</p>
+<p id='n210' class='pln'>210</p>
+<p id='n211' class='pln'>211</p>
+<p id='n212' class='stm run hide_run'>212</p>
+<p id='n213' class='stm run hide_run'>213</p>
+<p id='n214' class='pln'>214</p>
+<p id='n215' class='stm run hide_run'>215</p>
+<p id='n216' class='stm run hide_run'>216</p>
+<p id='n217' class='pln'>217</p>
+<p id='n218' class='pln'>218</p>
+<p id='n219' class='pln'>219</p>
+<p id='n220' class='pln'>220</p>
+<p id='n221' class='pln'>221</p>
+<p id='n222' class='pln'>222</p>
+<p id='n223' class='pln'>223</p>
+<p id='n224' class='pln'>224</p>
+<p id='n225' class='pln'>225</p>
+<p id='n226' class='pln'>226</p>
+<p id='n227' class='pln'>227</p>
+<p id='n228' class='pln'>228</p>
+<p id='n229' class='stm run hide_run'>229</p>
+<p id='n230' class='stm run hide_run'>230</p>
+<p id='n231' class='pln'>231</p>
+<p id='n232' class='stm run hide_run'>232</p>
+<p id='n233' class='stm run hide_run'>233</p>
+<p id='n234' class='pln'>234</p>
+<p id='n235' class='pln'>235</p>
+<p id='n236' class='pln'>236</p>
+<p id='n237' class='pln'>237</p>
+<p id='n238' class='pln'>238</p>
+<p id='n239' class='pln'>239</p>
+<p id='n240' class='pln'>240</p>
+<p id='n241' class='pln'>241</p>
+<p id='n242' class='pln'>242</p>
+<p id='n243' class='pln'>243</p>
+<p id='n244' class='pln'>244</p>
+<p id='n245' class='pln'>245</p>
+<p id='n246' class='pln'>246</p>
+<p id='n247' class='stm run hide_run'>247</p>
+<p id='n248' class='stm run hide_run'>248</p>
+<p id='n249' class='pln'>249</p>
+<p id='n250' class='stm run hide_run'>250</p>
+<p id='n251' class='pln'>251</p>
+<p id='n252' class='pln'>252</p>
+<p id='n253' class='stm run hide_run'>253</p>
+<p id='n254' class='pln'>254</p>
+<p id='n255' class='pln'>255</p>
+<p id='n256' class='pln'>256</p>
+<p id='n257' class='pln'>257</p>
+<p id='n258' class='pln'>258</p>
+<p id='n259' class='pln'>259</p>
+<p id='n260' class='pln'>260</p>
+<p id='n261' class='pln'>261</p>
+<p id='n262' class='pln'>262</p>
+<p id='n263' class='pln'>263</p>
+<p id='n264' class='pln'>264</p>
+<p id='n265' class='stm run hide_run'>265</p>
+<p id='n266' class='stm run hide_run'>266</p>
+<p id='n267' class='pln'>267</p>
+<p id='n268' class='stm run hide_run'>268</p>
+<p id='n269' class='pln'>269</p>
+<p id='n270' class='stm run hide_run'>270</p>
+<p id='n271' class='pln'>271</p>
+<p id='n272' class='pln'>272</p>
+<p id='n273' class='pln'>273</p>
+<p id='n274' class='pln'>274</p>
+<p id='n275' class='pln'>275</p>
+<p id='n276' class='pln'>276</p>
+<p id='n277' class='pln'>277</p>
+<p id='n278' class='pln'>278</p>
+<p id='n279' class='stm run hide_run'>279</p>
+<p id='n280' class='stm run hide_run'>280</p>
+<p id='n281' class='pln'>281</p>
+<p id='n282' class='stm run hide_run'>282</p>
+<p id='n283' class='pln'>283</p>
+<p id='n284' class='pln'>284</p>
+<p id='n285' class='pln'>285</p>
+<p id='n286' class='stm run hide_run'>286</p>
+<p id='n287' class='pln'>287</p>
+<p id='n288' class='pln'>288</p>
+<p id='n289' class='pln'>289</p>
+<p id='n290' class='pln'>290</p>
+<p id='n291' class='pln'>291</p>
+<p id='n292' class='pln'>292</p>
+<p id='n293' class='pln'>293</p>
+<p id='n294' class='pln'>294</p>
+<p id='n295' class='pln'>295</p>
+<p id='n296' class='pln'>296</p>
+<p id='n297' class='pln'>297</p>
+<p id='n298' class='pln'>298</p>
+<p id='n299' class='stm run hide_run'>299</p>
+<p id='n300' class='stm run hide_run'>300</p>
+<p id='n301' class='pln'>301</p>
+<p id='n302' class='stm run hide_run'>302</p>
+<p id='n303' class='pln'>303</p>
+<p id='n304' class='pln'>304</p>
+<p id='n305' class='pln'>305</p>
+<p id='n306' class='stm run hide_run'>306</p>
+<p id='n307' class='pln'>307</p>
+<p id='n308' class='pln'>308</p>
+<p id='n309' class='pln'>309</p>
+<p id='n310' class='pln'>310</p>
+<p id='n311' class='pln'>311</p>
+<p id='n312' class='pln'>312</p>
+<p id='n313' class='pln'>313</p>
+<p id='n314' class='pln'>314</p>
+<p id='n315' class='pln'>315</p>
+<p id='n316' class='pln'>316</p>
+<p id='n317' class='pln'>317</p>
+<p id='n318' class='pln'>318</p>
+<p id='n319' class='pln'>319</p>
+<p id='n320' class='pln'>320</p>
+<p id='n321' class='pln'>321</p>
+<p id='n322' class='pln'>322</p>
+<p id='n323' class='pln'>323</p>
+<p id='n324' class='stm run hide_run'>324</p>
+<p id='n325' class='stm run hide_run'>325</p>
+<p id='n326' class='pln'>326</p>
+<p id='n327' class='stm run hide_run'>327</p>
+<p id='n328' class='stm run hide_run'>328</p>
+<p id='n329' class='pln'>329</p>
+<p id='n330' class='pln'>330</p>
+<p id='n331' class='pln'>331</p>
+<p id='n332' class='pln'>332</p>
+<p id='n333' class='pln'>333</p>
+<p id='n334' class='pln'>334</p>
+<p id='n335' class='pln'>335</p>
+<p id='n336' class='pln'>336</p>
+<p id='n337' class='pln'>337</p>
+<p id='n338' class='pln'>338</p>
+<p id='n339' class='pln'>339</p>
+<p id='n340' class='pln'>340</p>
+<p id='n341' class='pln'>341</p>
+<p id='n342' class='pln'>342</p>
+<p id='n343' class='stm run hide_run'>343</p>
+<p id='n344' class='stm run hide_run'>344</p>
+<p id='n345' class='pln'>345</p>
+<p id='n346' class='stm run hide_run'>346</p>
+<p id='n347' class='stm run hide_run'>347</p>
+<p id='n348' class='pln'>348</p>
+<p id='n349' class='pln'>349</p>
+<p id='n350' class='pln'>350</p>
+<p id='n351' class='pln'>351</p>
+<p id='n352' class='pln'>352</p>
+<p id='n353' class='pln'>353</p>
+<p id='n354' class='pln'>354</p>
+<p id='n355' class='stm run hide_run'>355</p>
+<p id='n356' class='pln'>356</p>
+<p id='n357' class='pln'>357</p>
+<p id='n358' class='pln'>358</p>
+<p id='n359' class='pln'>359</p>
+<p id='n360' class='pln'>360</p>
+<p id='n361' class='pln'>361</p>
+<p id='n362' class='pln'>362</p>
+<p id='n363' class='stm run hide_run'>363</p>
+<p id='n364' class='stm run hide_run'>364</p>
+<p id='n365' class='pln'>365</p>
+<p id='n366' class='stm run hide_run'>366</p>
+<p id='n367' class='stm run hide_run'>367</p>
+<p id='n368' class='pln'>368</p>
+<p id='n369' class='pln'>369</p>
+<p id='n370' class='pln'>370</p>
+<p id='n371' class='pln'>371</p>
+<p id='n372' class='pln'>372</p>
+<p id='n373' class='pln'>373</p>
+<p id='n374' class='stm run hide_run'>374</p>
+<p id='n375' class='pln'>375</p>
+<p id='n376' class='pln'>376</p>
+<p id='n377' class='pln'>377</p>
+<p id='n378' class='pln'>378</p>
+<p id='n379' class='stm run hide_run'>379</p>
+<p id='n380' class='stm run hide_run'>380</p>
+<p id='n381' class='pln'>381</p>
+<p id='n382' class='pln'>382</p>
+<p id='n383' class='pln'>383</p>
+<p id='n384' class='pln'>384</p>
+<p id='n385' class='pln'>385</p>
+<p id='n386' class='pln'>386</p>
+<p id='n387' class='pln'>387</p>
+<p id='n388' class='pln'>388</p>
+<p id='n389' class='pln'>389</p>
+<p id='n390' class='stm run hide_run'>390</p>
+<p id='n391' class='pln'>391</p>
+<p id='n392' class='pln'>392</p>
+<p id='n393' class='pln'>393</p>
+<p id='n394' class='pln'>394</p>
+<p id='n395' class='pln'>395</p>
+<p id='n396' class='pln'>396</p>
+<p id='n397' class='pln'>397</p>
+<p id='n398' class='pln'>398</p>
+<p id='n399' class='pln'>399</p>
+<p id='n400' class='pln'>400</p>
+<p id='n401' class='stm run hide_run'>401</p>
+<p id='n402' class='stm run hide_run'>402</p>
+<p id='n403' class='pln'>403</p>
+<p id='n404' class='stm run hide_run'>404</p>
+<p id='n405' class='pln'>405</p>
+<p id='n406' class='pln'>406</p>
+<p id='n407' class='pln'>407</p>
+<p id='n408' class='stm run hide_run'>408</p>
+<p id='n409' class='stm mis'>409</p>
+<p id='n410' class='stm mis'>410</p>
+<p id='n411' class='stm mis'>411</p>
+<p id='n412' class='stm mis'>412</p>
+<p id='n413' class='stm mis'>413</p>
+<p id='n414' class='stm mis'>414</p>
+<p id='n415' class='stm mis'>415</p>
+<p id='n416' class='pln'>416</p>
+<p id='n417' class='stm run hide_run'>417</p>
+<p id='n418' class='stm mis'>418</p>
+<p id='n419' class='stm mis'>419</p>
+<p id='n420' class='stm mis'>420</p>
+<p id='n421' class='stm mis'>421</p>
+<p id='n422' class='stm mis'>422</p>
+<p id='n423' class='stm mis'>423</p>
+<p id='n424' class='stm mis'>424</p>
+<p id='n425' class='stm mis'>425</p>
+<p id='n426' class='stm mis'>426</p>
+<p id='n427' class='pln'>427</p>
+<p id='n428' class='stm run hide_run'>428</p>
+<p id='n429' class='pln'>429</p>
+<p id='n430' class='stm mis'>430</p>
+<p id='n431' class='stm mis'>431</p>
+<p id='n432' class='stm mis'>432</p>
+<p id='n433' class='stm mis'>433</p>
+<p id='n434' class='stm mis'>434</p>
+<p id='n435' class='pln'>435</p>
+<p id='n436' class='stm run hide_run'>436</p>
+<p id='n437' class='pln'>437</p>
+<p id='n438' class='pln'>438</p>
+<p id='n439' class='pln'>439</p>
+<p id='n440' class='pln'>440</p>
+<p id='n441' class='stm run hide_run'>441</p>
+<p id='n442' class='stm mis'>442</p>
+<p id='n443' class='stm mis'>443</p>
+<p id='n444' class='pln'>444</p>
+<p id='n445' class='pln'>445</p>
+<p id='n446' class='pln'>446</p>
+<p id='n447' class='stm run hide_run'>447</p>
+<p id='n448' class='stm mis'>448</p>
+<p id='n449' class='pln'>449</p>
+<p id='n450' class='pln'>450</p>
+<p id='n451' class='pln'>451</p>
+<p id='n452' class='pln'>452</p>
+<p id='n453' class='stm mis'>453</p>
+<p id='n454' class='pln'>454</p>
+<p id='n455' class='stm run hide_run'>455</p>
+<p id='n456' class='stm mis'>456</p>
+<p id='n457' class='pln'>457</p>
+<p id='n458' class='pln'>458</p>
+<p id='n459' class='pln'>459</p>
+<p id='n460' class='pln'>460</p>
+<p id='n461' class='pln'>461</p>
+<p id='n462' class='stm mis'>462</p>
+<p id='n463' class='pln'>463</p>
+<p id='n464' class='stm mis'>464</p>
+<p id='n465' class='pln'>465</p>
+<p id='n466' class='pln'>466</p>
+<p id='n467' class='pln'>467</p>
+<p id='n468' class='pln'>468</p>
+<p id='n469' class='pln'>469</p>
+<p id='n470' class='pln'>470</p>
+<p id='n471' class='pln'>471</p>
+<p id='n472' class='pln'>472</p>
+<p id='n473' class='stm mis'>473</p>
+<p id='n474' class='pln'>474</p>
+<p id='n475' class='stm run hide_run'>475</p>
+<p id='n476' class='stm mis'>476</p>
+<p id='n477' class='pln'>477</p>
+<p id='n478' class='pln'>478</p>
+<p id='n479' class='stm mis'>479</p>
+<p id='n480' class='pln'>480</p>
+<p id='n481' class='stm mis'>481</p>
+<p id='n482' class='pln'>482</p>
+<p id='n483' class='pln'>483</p>
+<p id='n484' class='pln'>484</p>
+<p id='n485' class='pln'>485</p>
+<p id='n486' class='pln'>486</p>
+<p id='n487' class='pln'>487</p>
+<p id='n488' class='stm mis'>488</p>
+<p id='n489' class='pln'>489</p>
+<p id='n490' class='stm run hide_run'>490</p>
+<p id='n491' class='stm mis'>491</p>
+<p id='n492' class='pln'>492</p>
+<p id='n493' class='pln'>493</p>
+<p id='n494' class='stm mis'>494</p>
+<p id='n495' class='pln'>495</p>
+<p id='n496' class='stm mis'>496</p>
+<p id='n497' class='pln'>497</p>
+<p id='n498' class='pln'>498</p>
+<p id='n499' class='pln'>499</p>
+<p id='n500' class='pln'>500</p>
+<p id='n501' class='pln'>501</p>
+<p id='n502' class='pln'>502</p>
+<p id='n503' class='stm mis'>503</p>
+<p id='n504' class='pln'>504</p>
+<p id='n505' class='stm run hide_run'>505</p>
+<p id='n506' class='stm mis'>506</p>
+<p id='n507' class='pln'>507</p>
+<p id='n508' class='pln'>508</p>
+<p id='n509' class='pln'>509</p>
+<p id='n510' class='pln'>510</p>
+<p id='n511' class='stm mis'>511</p>
+<p id='n512' class='pln'>512</p>
+<p id='n513' class='stm mis'>513</p>
+<p id='n514' class='pln'>514</p>
+<p id='n515' class='pln'>515</p>
+<p id='n516' class='pln'>516</p>
+<p id='n517' class='pln'>517</p>
+<p id='n518' class='pln'>518</p>
+<p id='n519' class='pln'>519</p>
+<p id='n520' class='pln'>520</p>
+<p id='n521' class='pln'>521</p>
+<p id='n522' class='stm mis'>522</p>
+<p id='n523' class='pln'>523</p>
+<p id='n524' class='stm run hide_run'>524</p>
+<p id='n525' class='stm mis'>525</p>
+<p id='n526' class='pln'>526</p>
+<p id='n527' class='pln'>527</p>
+<p id='n528' class='pln'>528</p>
+<p id='n529' class='pln'>529</p>
+<p id='n530' class='pln'>530</p>
+<p id='n531' class='pln'>531</p>
+<p id='n532' class='stm mis'>532</p>
+<p id='n533' class='pln'>533</p>
+<p id='n534' class='stm mis'>534</p>
+<p id='n535' class='pln'>535</p>
+<p id='n536' class='pln'>536</p>
+<p id='n537' class='pln'>537</p>
+<p id='n538' class='pln'>538</p>
+<p id='n539' class='pln'>539</p>
+<p id='n540' class='pln'>540</p>
+<p id='n541' class='pln'>541</p>
+<p id='n542' class='pln'>542</p>
+<p id='n543' class='pln'>543</p>
+<p id='n544' class='pln'>544</p>
+<p id='n545' class='stm mis'>545</p>
+<p id='n546' class='pln'>546</p>
+<p id='n547' class='stm run hide_run'>547</p>
+<p id='n548' class='stm mis'>548</p>
+<p id='n549' class='pln'>549</p>
+<p id='n550' class='pln'>550</p>
+<p id='n551' class='pln'>551</p>
+<p id='n552' class='pln'>552</p>
+<p id='n553' class='pln'>553</p>
+<p id='n554' class='pln'>554</p>
+<p id='n555' class='stm mis'>555</p>
+<p id='n556' class='pln'>556</p>
+<p id='n557' class='stm mis'>557</p>
+<p id='n558' class='pln'>558</p>
+<p id='n559' class='pln'>559</p>
+<p id='n560' class='pln'>560</p>
+<p id='n561' class='pln'>561</p>
+<p id='n562' class='pln'>562</p>
+<p id='n563' class='pln'>563</p>
+<p id='n564' class='pln'>564</p>
+<p id='n565' class='pln'>565</p>
+<p id='n566' class='pln'>566</p>
+<p id='n567' class='pln'>567</p>
+<p id='n568' class='stm mis'>568</p>
+<p id='n569' class='pln'>569</p>
+<p id='n570' class='stm run hide_run'>570</p>
+<p id='n571' class='pln'>571</p>
+<p id='n572' class='pln'>572</p>
+<p id='n573' class='pln'>573</p>
+<p id='n574' class='stm run hide_run'>574</p>
+<p id='n575' class='stm mis'>575</p>
+<p id='n576' class='pln'>576</p>
+<p id='n577' class='pln'>577</p>
+<p id='n578' class='pln'>578</p>
+<p id='n579' class='pln'>579</p>
+<p id='n580' class='stm mis'>580</p>
+<p id='n581' class='stm mis'>581</p>
+<p id='n582' class='pln'>582</p>
+<p id='n583' class='pln'>583</p>
+<p id='n584' class='pln'>584</p>
+<p id='n585' class='stm run hide_run'>585</p>
+<p id='n586' class='stm mis'>586</p>
+<p id='n587' class='pln'>587</p>
+<p id='n588' class='pln'>588</p>
+<p id='n589' class='pln'>589</p>
+<p id='n590' class='pln'>590</p>
+<p id='n591' class='stm mis'>591</p>
+<p id='n592' class='stm mis'>592</p>
+<p id='n593' class='pln'>593</p>
+<p id='n594' class='pln'>594</p>
+<p id='n595' class='pln'>595</p>
+<p id='n596' class='stm run hide_run'>596</p>
+<p id='n597' class='stm mis'>597</p>
+<p id='n598' class='pln'>598</p>
+<p id='n599' class='pln'>599</p>
+<p id='n600' class='pln'>600</p>
+<p id='n601' class='pln'>601</p>
+<p id='n602' class='pln'>602</p>
+<p id='n603' class='pln'>603</p>
+<p id='n604' class='pln'>604</p>
+<p id='n605' class='pln'>605</p>
+<p id='n606' class='pln'>606</p>
+<p id='n607' class='pln'>607</p>
+<p id='n608' class='pln'>608</p>
+<p id='n609' class='pln'>609</p>
+<p id='n610' class='pln'>610</p>
+<p id='n611' class='stm mis'>611</p>
+<p id='n612' class='stm mis'>612</p>
+<p id='n613' class='pln'>613</p>
+<p id='n614' class='stm run hide_run'>614</p>
+<p id='n615' class='pln'>615</p>
+<p id='n616' class='pln'>616</p>
+<p id='n617' class='pln'>617</p>
+<p id='n618' class='pln'>618</p>
+<p id='n619' class='stm run hide_run'>619</p>
+<p id='n620' class='pln'>620</p>
+<p id='n621' class='pln'>621</p>
+<p id='n622' class='pln'>622</p>
+<p id='n623' class='stm mis'>623</p>
+<p id='n624' class='stm mis'>624</p>
+<p id='n625' class='stm mis'>625</p>
+<p id='n626' class='pln'>626</p>
+<p id='n627' class='stm run hide_run'>627</p>
+<p id='n628' class='stm mis'>628</p>
+<p id='n629' class='stm mis'>629</p>
+<p id='n630' class='stm mis'>630</p>
+<p id='n631' class='pln'>631</p>
+<p id='n632' class='stm run hide_run'>632</p>
+<p id='n633' class='stm mis'>633</p>
+<p id='n634' class='stm mis'>634</p>
+<p id='n635' class='stm mis'>635</p>
+<p id='n636' class='stm mis'>636</p>
+<p id='n637' class='stm mis'>637</p>
+<p id='n638' class='pln'>638</p>
+<p id='n639' class='stm run hide_run'>639</p>
+<p id='n640' class='pln'>640</p>
+<p id='n641' class='stm mis'>641</p>
+<p id='n642' class='stm mis'>642</p>
+<p id='n643' class='stm mis'>643</p>
+<p id='n644' class='stm mis'>644</p>
+<p id='n645' class='stm mis'>645</p>
+<p id='n646' class='pln'>646</p>
+<p id='n647' class='stm run hide_run'>647</p>
+<p id='n648' class='pln'>648</p>
+<p id='n649' class='stm mis'>649</p>
+<p id='n650' class='stm mis'>650</p>
+<p id='n651' class='stm mis'>651</p>
+<p id='n652' class='stm mis'>652</p>
+<p id='n653' class='stm mis'>653</p>
+<p id='n654' class='pln'>654</p>
+<p id='n655' class='stm run hide_run'>655</p>
+<p id='n656' class='pln'>656</p>
+<p id='n657' class='stm mis'>657</p>
+<p id='n658' class='stm mis'>658</p>
+<p id='n659' class='stm mis'>659</p>
+<p id='n660' class='stm mis'>660</p>
+<p id='n661' class='stm mis'>661</p>
+<p id='n662' class='pln'>662</p>
+<p id='n663' class='stm run hide_run'>663</p>
+<p id='n664' class='pln'>664</p>
+<p id='n665' class='stm mis'>665</p>
+<p id='n666' class='stm mis'>666</p>
+<p id='n667' class='stm mis'>667</p>
+<p id='n668' class='stm mis'>668</p>
+<p id='n669' class='stm mis'>669</p>
+<p id='n670' class='pln'>670</p>
+<p id='n671' class='stm run hide_run'>671</p>
+<p id='n672' class='pln'>672</p>
+<p id='n673' class='pln'>673</p>
+<p id='n674' class='stm mis'>674</p>
+<p id='n675' class='stm mis'>675</p>
+<p id='n676' class='stm mis'>676</p>
+<p id='n677' class='stm mis'>677</p>
+<p id='n678' class='stm mis'>678</p>
+<p id='n679' class='stm mis'>679</p>
+<p id='n680' class='pln'>680</p>
+<p id='n681' class='stm run hide_run'>681</p>
+<p id='n682' class='pln'>682</p>
+<p id='n683' class='stm run hide_run'>683</p>
+<p id='n684' class='pln'>684</p>
+<p id='n685' class='pln'>685</p>
+<p id='n686' class='pln'>686</p>
+<p id='n687' class='stm mis'>687</p>
+<p id='n688' class='stm mis'>688</p>
+<p id='n689' class='stm mis'>689</p>
+<p id='n690' class='pln'>690</p>
+<p id='n691' class='stm run hide_run'>691</p>
+<p id='n692' class='pln'>692</p>
+<p id='n693' class='stm mis'>693</p>
+<p id='n694' class='stm mis'>694</p>
+<p id='n695' class='stm mis'>695</p>
+<p id='n696' class='stm mis'>696</p>
+<p id='n697' class='stm mis'>697</p>
+<p id='n698' class='pln'>698</p>
+<p id='n699' class='stm run hide_run'>699</p>
+<p id='n700' class='stm mis'>700</p>
+<p id='n701' class='pln'>701</p>
+<p id='n702' class='stm mis'>702</p>
+<p id='n703' class='pln'>703</p>
+<p id='n704' class='stm run hide_run'>704</p>
+<p id='n705' class='stm mis'>705</p>
+<p id='n706' class='pln'>706</p>
+<p id='n707' class='stm run hide_run'>707</p>
+<p id='n708' class='stm mis'>708</p>
+<p id='n709' class='stm mis'>709</p>
+<p id='n710' class='stm mis'>710</p>
+<p id='n711' class='stm mis'>711</p>
+<p id='n712' class='pln'>712</p>
+<p id='n713' class='stm mis'>713</p>
+<p id='n714' class='stm mis'>714</p>
+<p id='n715' class='pln'>715</p>
+<p id='n716' class='pln'>716</p>
+<p id='n717' class='stm run hide_run'>717</p>
+<p id='n718' class='pln'>718</p>
+<p id='n719' class='stm run hide_run'>719</p>
+<p id='n720' class='pln'>720</p>
+<p id='n721' class='stm mis'>721</p>
+<p id='n722' class='stm mis'>722</p>
+<p id='n723' class='stm mis'>723</p>
+<p id='n724' class='stm mis'>724</p>
+<p id='n725' class='stm mis'>725</p>
+<p id='n726' class='pln'>726</p>
+<p id='n727' class='stm run hide_run'>727</p>
+<p id='n728' class='stm mis'>728</p>
+<p id='n729' class='pln'>729</p>
+<p id='n730' class='pln'>730</p>
+<p id='n731' class='pln'>731</p>
+<p id='n732' class='pln'>732</p>
+<p id='n733' class='pln'>733</p>
+<p id='n734' class='stm mis'>734</p>
+<p id='n735' class='stm mis'>735</p>
+<p id='n736' class='pln'>736</p>
+<p id='n737' class='stm run hide_run'>737</p>
+<p id='n738' class='stm mis'>738</p>
+<p id='n739' class='stm mis'>739</p>
+<p id='n740' class='stm mis'>740</p>
+<p id='n741' class='pln'>741</p>
+<p id='n742' class='stm run hide_run'>742</p>
+<p id='n743' class='stm mis'>743</p>
+<p id='n744' class='stm mis'>744</p>
+<p id='n745' class='stm mis'>745</p>
+<p id='n746' class='stm mis'>746</p>
+<p id='n747' class='pln'>747</p>
+<p id='n748' class='stm run hide_run'>748</p>
+<p id='n749' class='pln'>749</p>
+<p id='n750' class='stm mis'>750</p>
+<p id='n751' class='stm mis'>751</p>
+<p id='n752' class='stm mis'>752</p>
+<p id='n753' class='stm mis'>753</p>
+<p id='n754' class='pln'>754</p>
+<p id='n755' class='stm run hide_run'>755</p>
+<p id='n756' class='stm mis'>756</p>
+<p id='n757' class='pln'>757</p>
+<p id='n758' class='pln'>758</p>
+<p id='n759' class='pln'>759</p>
+<p id='n760' class='pln'>760</p>
+<p id='n761' class='pln'>761</p>
+<p id='n762' class='stm mis'>762</p>
+<p id='n763' class='stm mis'>763</p>
+<p id='n764' class='pln'>764</p>
+<p id='n765' class='stm run hide_run'>765</p>
+<p id='n766' class='stm mis'>766</p>
+<p id='n767' class='pln'>767</p>
+<p id='n768' class='pln'>768</p>
+<p id='n769' class='pln'>769</p>
+<p id='n770' class='pln'>770</p>
+<p id='n771' class='pln'>771</p>
+<p id='n772' class='pln'>772</p>
+<p id='n773' class='pln'>773</p>
+<p id='n774' class='pln'>774</p>
+<p id='n775' class='pln'>775</p>
+<p id='n776' class='pln'>776</p>
+<p id='n777' class='pln'>777</p>
+<p id='n778' class='pln'>778</p>
+<p id='n779' class='pln'>779</p>
+<p id='n780' class='pln'>780</p>
+<p id='n781' class='pln'>781</p>
+<p id='n782' class='pln'>782</p>
+<p id='n783' class='pln'>783</p>
+<p id='n784' class='pln'>784</p>
+<p id='n785' class='pln'>785</p>
+<p id='n786' class='pln'>786</p>
+<p id='n787' class='pln'>787</p>
+<p id='n788' class='pln'>788</p>
+<p id='n789' class='stm mis'>789</p>
+<p id='n790' class='stm mis'>790</p>
+<p id='n791' class='pln'>791</p>
+<p id='n792' class='pln'>792</p>
+<p id='n793' class='stm mis'>793</p>
+<p id='n794' class='stm mis'>794</p>
+<p id='n795' class='stm mis'>795</p>
+<p id='n796' class='pln'>796</p>
+<p id='n797' class='stm run hide_run'>797</p>
+<p id='n798' class='stm mis'>798</p>
+<p id='n799' class='stm mis'>799</p>
+<p id='n800' class='pln'>800</p>
+<p id='n801' class='pln'>801</p>
+<p id='n802' class='stm run hide_run'>802</p>
+<p id='n803' class='pln'>803</p>
+<p id='n804' class='stm run hide_run'>804</p>
+<p id='n805' class='stm mis'>805</p>
+<p id='n806' class='pln'>806</p>
+<p id='n807' class='pln'>807</p>
+<p id='n808' class='pln'>808</p>
+<p id='n809' class='pln'>809</p>
+<p id='n810' class='pln'>810</p>
+<p id='n811' class='pln'>811</p>
+<p id='n812' class='pln'>812</p>
+<p id='n813' class='pln'>813</p>
+<p id='n814' class='pln'>814</p>
+<p id='n815' class='pln'>815</p>
+<p id='n816' class='pln'>816</p>
+<p id='n817' class='pln'>817</p>
+<p id='n818' class='pln'>818</p>
+<p id='n819' class='pln'>819</p>
+<p id='n820' class='pln'>820</p>
+<p id='n821' class='pln'>821</p>
+<p id='n822' class='pln'>822</p>
+<p id='n823' class='pln'>823</p>
+<p id='n824' class='pln'>824</p>
+<p id='n825' class='pln'>825</p>
+<p id='n826' class='pln'>826</p>
+<p id='n827' class='pln'>827</p>
+<p id='n828' class='pln'>828</p>
+<p id='n829' class='pln'>829</p>
+<p id='n830' class='stm mis'>830</p>
+<p id='n831' class='stm mis'>831</p>
+<p id='n832' class='stm mis'>832</p>
+<p id='n833' class='stm mis'>833</p>
+<p id='n834' class='stm mis'>834</p>
+<p id='n835' class='pln'>835</p>
+<p id='n836' class='stm run hide_run'>836</p>
+<p id='n837' class='pln'>837</p>
+<p id='n838' class='stm mis'>838</p>
+<p id='n839' class='pln'>839</p>
+<p id='n840' class='pln'>840</p>
+<p id='n841' class='pln'>841</p>
+<p id='n842' class='pln'>842</p>
+<p id='n843' class='pln'>843</p>
+<p id='n844' class='pln'>844</p>
+<p id='n845' class='pln'>845</p>
+<p id='n846' class='pln'>846</p>
+<p id='n847' class='pln'>847</p>
+<p id='n848' class='pln'>848</p>
+<p id='n849' class='pln'>849</p>
+<p id='n850' class='pln'>850</p>
+<p id='n851' class='pln'>851</p>
+<p id='n852' class='pln'>852</p>
+<p id='n853' class='pln'>853</p>
+<p id='n854' class='pln'>854</p>
+<p id='n855' class='pln'>855</p>
+<p id='n856' class='pln'>856</p>
+<p id='n857' class='pln'>857</p>
+<p id='n858' class='pln'>858</p>
+<p id='n859' class='pln'>859</p>
+<p id='n860' class='pln'>860</p>
+<p id='n861' class='pln'>861</p>
+<p id='n862' class='pln'>862</p>
+<p id='n863' class='stm mis'>863</p>
+<p id='n864' class='stm mis'>864</p>
+<p id='n865' class='stm mis'>865</p>
+<p id='n866' class='pln'>866</p>
+<p id='n867' class='stm run hide_run'>867</p>
+<p id='n868' class='stm mis'>868</p>
+<p id='n869' class='pln'>869</p>
+<p id='n870' class='pln'>870</p>
+<p id='n871' class='pln'>871</p>
+<p id='n872' class='pln'>872</p>
+<p id='n873' class='pln'>873</p>
+<p id='n874' class='pln'>874</p>
+<p id='n875' class='pln'>875</p>
+<p id='n876' class='pln'>876</p>
+<p id='n877' class='pln'>877</p>
+<p id='n878' class='pln'>878</p>
+<p id='n879' class='pln'>879</p>
+<p id='n880' class='pln'>880</p>
+<p id='n881' class='pln'>881</p>
+<p id='n882' class='pln'>882</p>
+<p id='n883' class='pln'>883</p>
+<p id='n884' class='pln'>884</p>
+<p id='n885' class='pln'>885</p>
+<p id='n886' class='pln'>886</p>
+<p id='n887' class='pln'>887</p>
+<p id='n888' class='pln'>888</p>
+<p id='n889' class='pln'>889</p>
+<p id='n890' class='pln'>890</p>
+<p id='n891' class='pln'>891</p>
+<p id='n892' class='pln'>892</p>
+<p id='n893' class='pln'>893</p>
+<p id='n894' class='pln'>894</p>
+<p id='n895' class='pln'>895</p>
+<p id='n896' class='pln'>896</p>
+<p id='n897' class='pln'>897</p>
+<p id='n898' class='pln'>898</p>
+<p id='n899' class='pln'>899</p>
+<p id='n900' class='pln'>900</p>
+<p id='n901' class='pln'>901</p>
+<p id='n902' class='pln'>902</p>
+<p id='n903' class='pln'>903</p>
+<p id='n904' class='pln'>904</p>
+<p id='n905' class='pln'>905</p>
+<p id='n906' class='pln'>906</p>
+<p id='n907' class='stm mis'>907</p>
+<p id='n908' class='stm mis'>908</p>
+<p id='n909' class='stm mis'>909</p>
+<p id='n910' class='stm mis'>910</p>
+<p id='n911' class='stm mis'>911</p>
+<p id='n912' class='stm mis'>912</p>
+<p id='n913' class='pln'>913</p>
+<p id='n914' class='stm run hide_run'>914</p>
+<p id='n915' class='stm mis'>915</p>
+<p id='n916' class='pln'>916</p>
+<p id='n917' class='pln'>917</p>
+<p id='n918' class='pln'>918</p>
+<p id='n919' class='pln'>919</p>
+<p id='n920' class='pln'>920</p>
+<p id='n921' class='pln'>921</p>
+<p id='n922' class='pln'>922</p>
+<p id='n923' class='pln'>923</p>
+<p id='n924' class='pln'>924</p>
+<p id='n925' class='pln'>925</p>
+<p id='n926' class='pln'>926</p>
+<p id='n927' class='pln'>927</p>
+<p id='n928' class='pln'>928</p>
+<p id='n929' class='pln'>929</p>
+<p id='n930' class='pln'>930</p>
+<p id='n931' class='pln'>931</p>
+<p id='n932' class='pln'>932</p>
+<p id='n933' class='pln'>933</p>
+<p id='n934' class='pln'>934</p>
+<p id='n935' class='pln'>935</p>
+<p id='n936' class='pln'>936</p>
+<p id='n937' class='pln'>937</p>
+<p id='n938' class='pln'>938</p>
+<p id='n939' class='pln'>939</p>
+<p id='n940' class='pln'>940</p>
+<p id='n941' class='pln'>941</p>
+<p id='n942' class='pln'>942</p>
+<p id='n943' class='pln'>943</p>
+<p id='n944' class='pln'>944</p>
+<p id='n945' class='pln'>945</p>
+<p id='n946' class='pln'>946</p>
+<p id='n947' class='pln'>947</p>
+<p id='n948' class='pln'>948</p>
+<p id='n949' class='pln'>949</p>
+<p id='n950' class='pln'>950</p>
+<p id='n951' class='pln'>951</p>
+<p id='n952' class='pln'>952</p>
+<p id='n953' class='pln'>953</p>
+<p id='n954' class='pln'>954</p>
+<p id='n955' class='pln'>955</p>
+<p id='n956' class='pln'>956</p>
+<p id='n957' class='pln'>957</p>
+<p id='n958' class='stm mis'>958</p>
+<p id='n959' class='stm mis'>959</p>
+<p id='n960' class='stm mis'>960</p>
+<p id='n961' class='stm mis'>961</p>
+<p id='n962' class='stm mis'>962</p>
+<p id='n963' class='stm mis'>963</p>
+<p id='n964' class='pln'>964</p>
+<p id='n965' class='stm run hide_run'>965</p>
+<p id='n966' class='stm mis'>966</p>
+<p id='n967' class='pln'>967</p>
+<p id='n968' class='pln'>968</p>
+<p id='n969' class='pln'>969</p>
+<p id='n970' class='pln'>970</p>
+<p id='n971' class='pln'>971</p>
+<p id='n972' class='pln'>972</p>
+<p id='n973' class='pln'>973</p>
+<p id='n974' class='pln'>974</p>
+<p id='n975' class='pln'>975</p>
+<p id='n976' class='pln'>976</p>
+<p id='n977' class='pln'>977</p>
+<p id='n978' class='pln'>978</p>
+<p id='n979' class='pln'>979</p>
+<p id='n980' class='pln'>980</p>
+<p id='n981' class='pln'>981</p>
+<p id='n982' class='pln'>982</p>
+<p id='n983' class='pln'>983</p>
+<p id='n984' class='pln'>984</p>
+<p id='n985' class='pln'>985</p>
+<p id='n986' class='pln'>986</p>
+<p id='n987' class='pln'>987</p>
+<p id='n988' class='pln'>988</p>
+<p id='n989' class='pln'>989</p>
+<p id='n990' class='pln'>990</p>
+<p id='n991' class='pln'>991</p>
+<p id='n992' class='pln'>992</p>
+<p id='n993' class='pln'>993</p>
+<p id='n994' class='pln'>994</p>
+<p id='n995' class='pln'>995</p>
+<p id='n996' class='pln'>996</p>
+<p id='n997' class='pln'>997</p>
+<p id='n998' class='pln'>998</p>
+<p id='n999' class='pln'>999</p>
+<p id='n1000' class='pln'>1000</p>
+<p id='n1001' class='pln'>1001</p>
+<p id='n1002' class='stm mis'>1002</p>
+<p id='n1003' class='stm mis'>1003</p>
+<p id='n1004' class='stm mis'>1004</p>
+<p id='n1005' class='stm mis'>1005</p>
+<p id='n1006' class='pln'>1006</p>
+<p id='n1007' class='stm run hide_run'>1007</p>
+<p id='n1008' class='stm mis'>1008</p>
+<p id='n1009' class='pln'>1009</p>
+<p id='n1010' class='pln'>1010</p>
+<p id='n1011' class='pln'>1011</p>
+<p id='n1012' class='pln'>1012</p>
+<p id='n1013' class='pln'>1013</p>
+<p id='n1014' class='pln'>1014</p>
+<p id='n1015' class='pln'>1015</p>
+<p id='n1016' class='pln'>1016</p>
+<p id='n1017' class='pln'>1017</p>
+<p id='n1018' class='pln'>1018</p>
+<p id='n1019' class='pln'>1019</p>
+<p id='n1020' class='pln'>1020</p>
+<p id='n1021' class='pln'>1021</p>
+<p id='n1022' class='pln'>1022</p>
+<p id='n1023' class='pln'>1023</p>
+<p id='n1024' class='stm mis'>1024</p>
+<p id='n1025' class='stm mis'>1025</p>
+<p id='n1026' class='pln'>1026</p>
+<p id='n1027' class='stm run hide_run'>1027</p>
+<p id='n1028' class='stm mis'>1028</p>
+<p id='n1029' class='pln'>1029</p>
+<p id='n1030' class='pln'>1030</p>
+<p id='n1031' class='pln'>1031</p>
+<p id='n1032' class='pln'>1032</p>
+<p id='n1033' class='pln'>1033</p>
+<p id='n1034' class='pln'>1034</p>
+<p id='n1035' class='pln'>1035</p>
+<p id='n1036' class='pln'>1036</p>
+<p id='n1037' class='pln'>1037</p>
+<p id='n1038' class='pln'>1038</p>
+<p id='n1039' class='pln'>1039</p>
+<p id='n1040' class='pln'>1040</p>
+<p id='n1041' class='pln'>1041</p>
+<p id='n1042' class='pln'>1042</p>
+<p id='n1043' class='pln'>1043</p>
+<p id='n1044' class='pln'>1044</p>
+<p id='n1045' class='pln'>1045</p>
+<p id='n1046' class='pln'>1046</p>
+<p id='n1047' class='pln'>1047</p>
+<p id='n1048' class='pln'>1048</p>
+<p id='n1049' class='pln'>1049</p>
+<p id='n1050' class='pln'>1050</p>
+<p id='n1051' class='pln'>1051</p>
+<p id='n1052' class='pln'>1052</p>
+<p id='n1053' class='pln'>1053</p>
+<p id='n1054' class='pln'>1054</p>
+<p id='n1055' class='pln'>1055</p>
+<p id='n1056' class='pln'>1056</p>
+<p id='n1057' class='pln'>1057</p>
+<p id='n1058' class='pln'>1058</p>
+<p id='n1059' class='pln'>1059</p>
+<p id='n1060' class='pln'>1060</p>
+<p id='n1061' class='pln'>1061</p>
+<p id='n1062' class='pln'>1062</p>
+<p id='n1063' class='pln'>1063</p>
+<p id='n1064' class='pln'>1064</p>
+<p id='n1065' class='pln'>1065</p>
+<p id='n1066' class='stm mis'>1066</p>
+<p id='n1067' class='stm mis'>1067</p>
+<p id='n1068' class='stm mis'>1068</p>
+<p id='n1069' class='stm mis'>1069</p>
+<p id='n1070' class='stm mis'>1070</p>
+<p id='n1071' class='pln'>1071</p>
+<p id='n1072' class='pln'>1072</p>
+<p id='n1073' class='stm run hide_run'>1073</p>
+<p id='n1074' class='pln'>1074</p>
+<p id='n1075' class='pln'>1075</p>
+<p id='n1076' class='stm run hide_run'>1076</p>
+<p id='n1077' class='pln'>1077</p>
+<p id='n1078' class='pln'>1078</p>
+<p id='n1079' class='pln'>1079</p>
+<p id='n1080' class='pln'>1080</p>
+<p id='n1081' class='pln'>1081</p>
+<p id='n1082' class='pln'>1082</p>
+<p id='n1083' class='pln'>1083</p>
+<p id='n1084' class='pln'>1084</p>
+<p id='n1085' class='stm run hide_run'>1085</p>
+<p id='n1086' class='pln'>1086</p>
+<p id='n1087' class='pln'>1087</p>
+<p id='n1088' class='pln'>1088</p>
+<p id='n1089' class='pln'>1089</p>
+<p id='n1090' class='pln'>1090</p>
+<p id='n1091' class='pln'>1091</p>
+<p id='n1092' class='pln'>1092</p>
+<p id='n1093' class='pln'>1093</p>
+<p id='n1094' class='stm run hide_run'>1094</p>
+<p id='n1095' class='stm mis'>1095</p>
+<p id='n1096' class='stm mis'>1096</p>
+<p id='n1097' class='stm mis'>1097</p>
+<p id='n1098' class='pln'>1098</p>
+<p id='n1099' class='stm run hide_run'>1099</p>
+<p id='n1100' class='stm mis'>1100</p>
+<p id='n1101' class='stm mis'>1101</p>
+<p id='n1102' class='stm mis'>1102</p>
+<p id='n1103' class='pln'>1103</p>
+<p id='n1104' class='stm run hide_run'>1104</p>
+<p id='n1105' class='stm mis'>1105</p>
+<p id='n1106' class='stm mis'>1106</p>
+<p id='n1107' class='stm mis'>1107</p>
+<p id='n1108' class='pln'>1108</p>
+<p id='n1109' class='stm run hide_run'>1109</p>
+<p id='n1110' class='stm mis'>1110</p>
+<p id='n1111' class='stm mis'>1111</p>
+<p id='n1112' class='stm mis'>1112</p>
+<p id='n1113' class='pln'>1113</p>
+<p id='n1114' class='pln'>1114</p>
+<p id='n1115' class='stm run hide_run'>1115</p>
+<p id='n1116' class='pln'>1116</p>
+<p id='n1117' class='pln'>1117</p>
+<p id='n1118' class='pln'>1118</p>
+<p id='n1119' class='pln'>1119</p>
+<p id='n1120' class='pln'>1120</p>
+<p id='n1121' class='stm run hide_run'>1121</p>
+<p id='n1122' class='stm mis'>1122</p>
+<p id='n1123' class='stm mis'>1123</p>
+<p id='n1124' class='pln'>1124</p>
+<p id='n1125' class='stm run hide_run'>1125</p>
+<p id='n1126' class='stm mis'>1126</p>
+<p id='n1127' class='pln'>1127</p>
+<p id='n1128' class='pln'>1128</p>
+<p id='n1129' class='pln'>1129</p>
+<p id='n1130' class='pln'>1130</p>
+<p id='n1131' class='stm mis'>1131</p>
+<p id='n1132' class='stm mis'>1132</p>
+<p id='n1133' class='stm mis'>1133</p>
+<p id='n1134' class='pln'>1134</p>
+<p id='n1135' class='pln'>1135</p>
+<p id='n1136' class='stm run hide_run'>1136</p>
+<p id='n1137' class='stm run hide_run'>1137</p>
+<p id='n1138' class='pln'>1138</p>
+<p id='n1139' class='pln'>1139</p>
+<p id='n1140' class='pln'>1140</p>
+<p id='n1141' class='pln'>1141</p>
+<p id='n1142' class='pln'>1142</p>
+<p id='n1143' class='pln'>1143</p>
+<p id='n1144' class='pln'>1144</p>
+<p id='n1145' class='pln'>1145</p>
+<p id='n1146' class='pln'>1146</p>
+<p id='n1147' class='pln'>1147</p>
+<p id='n1148' class='pln'>1148</p>
+<p id='n1149' class='pln'>1149</p>
+<p id='n1150' class='pln'>1150</p>
+<p id='n1151' class='pln'>1151</p>
+<p id='n1152' class='pln'>1152</p>
+<p id='n1153' class='pln'>1153</p>
+<p id='n1154' class='pln'>1154</p>
+<p id='n1155' class='pln'>1155</p>
+<p id='n1156' class='pln'>1156</p>
+<p id='n1157' class='pln'>1157</p>
+<p id='n1158' class='pln'>1158</p>
+<p id='n1159' class='pln'>1159</p>
+<p id='n1160' class='pln'>1160</p>
+<p id='n1161' class='pln'>1161</p>
+<p id='n1162' class='pln'>1162</p>
+<p id='n1163' class='pln'>1163</p>
+<p id='n1164' class='pln'>1164</p>
+<p id='n1165' class='pln'>1165</p>
+<p id='n1166' class='pln'>1166</p>
+<p id='n1167' class='pln'>1167</p>
+<p id='n1168' class='pln'>1168</p>
+<p id='n1169' class='pln'>1169</p>
+<p id='n1170' class='pln'>1170</p>
+<p id='n1171' class='pln'>1171</p>
+<p id='n1172' class='pln'>1172</p>
+<p id='n1173' class='pln'>1173</p>
+<p id='n1174' class='pln'>1174</p>
+<p id='n1175' class='pln'>1175</p>
+<p id='n1176' class='pln'>1176</p>
+<p id='n1177' class='pln'>1177</p>
+<p id='n1178' class='pln'>1178</p>
+<p id='n1179' class='pln'>1179</p>
+<p id='n1180' class='pln'>1180</p>
+<p id='n1181' class='pln'>1181</p>
+<p id='n1182' class='pln'>1182</p>
+<p id='n1183' class='stm run hide_run'>1183</p>
+<p id='n1184' class='pln'>1184</p>
+<p id='n1185' class='stm mis'>1185</p>
+<p id='n1186' class='stm mis'>1186</p>
+<p id='n1187' class='pln'>1187</p>
+<p id='n1188' class='stm run hide_run'>1188</p>
+<p id='n1189' class='pln'>1189</p>
+<p id='n1190' class='stm mis'>1190</p>
+<p id='n1191' class='stm mis'>1191</p>
+<p id='n1192' class='stm mis'>1192</p>
+<p id='n1193' class='pln'>1193</p>
+<p id='n1194' class='stm run hide_run'>1194</p>
+<p id='n1195' class='pln'>1195</p>
+<p id='n1196' class='stm mis'>1196</p>
+<p id='n1197' class='stm mis'>1197</p>
+<p id='n1198' class='stm mis'>1198</p>
+<p id='n1199' class='pln'>1199</p>
+<p id='n1200' class='stm run hide_run'>1200</p>
+<p id='n1201' class='pln'>1201</p>
+<p id='n1202' class='stm mis'>1202</p>
+<p id='n1203' class='stm mis'>1203</p>
+<p id='n1204' class='stm mis'>1204</p>
+<p id='n1205' class='pln'>1205</p>
+<p id='n1206' class='stm run hide_run'>1206</p>
+<p id='n1207' class='pln'>1207</p>
+<p id='n1208' class='stm mis'>1208</p>
+<p id='n1209' class='stm mis'>1209</p>
+<p id='n1210' class='stm mis'>1210</p>
+<p id='n1211' class='pln'>1211</p>
+<p id='n1212' class='stm run hide_run'>1212</p>
+<p id='n1213' class='stm mis'>1213</p>
+<p id='n1214' class='pln'>1214</p>
+<p id='n1215' class='pln'>1215</p>
+<p id='n1216' class='pln'>1216</p>
+<p id='n1217' class='pln'>1217</p>
+<p id='n1218' class='pln'>1218</p>
+<p id='n1219' class='pln'>1219</p>
+<p id='n1220' class='pln'>1220</p>
+<p id='n1221' class='pln'>1221</p>
+<p id='n1222' class='pln'>1222</p>
+<p id='n1223' class='pln'>1223</p>
+<p id='n1224' class='stm mis'>1224</p>
+<p id='n1225' class='pln'>1225</p>
+<p id='n1226' class='stm mis'>1226</p>
+<p id='n1227' class='stm mis'>1227</p>
+<p id='n1228' class='stm mis'>1228</p>
+<p id='n1229' class='pln'>1229</p>
+<p id='n1230' class='stm mis'>1230</p>
+<p id='n1231' class='stm mis'>1231</p>
+<p id='n1232' class='stm mis'>1232</p>
+<p id='n1233' class='pln'>1233</p>
+<p id='n1234' class='stm mis'>1234</p>
+<p id='n1235' class='stm mis'>1235</p>
+<p id='n1236' class='stm mis'>1236</p>
+<p id='n1237' class='pln'>1237</p>
+<p id='n1238' class='stm mis'>1238</p>
+<p id='n1239' class='stm mis'>1239</p>
+<p id='n1240' class='stm mis'>1240</p>
+<p id='n1241' class='pln'>1241</p>
+<p id='n1242' class='stm mis'>1242</p>
+<p id='n1243' class='stm mis'>1243</p>
+<p id='n1244' class='stm mis'>1244</p>
+<p id='n1245' class='pln'>1245</p>
+<p id='n1246' class='stm mis'>1246</p>
+<p id='n1247' class='stm mis'>1247</p>
+<p id='n1248' class='stm mis'>1248</p>
+<p id='n1249' class='pln'>1249</p>
+<p id='n1250' class='stm mis'>1250</p>
+<p id='n1251' class='stm mis'>1251</p>
+<p id='n1252' class='stm mis'>1252</p>
+<p id='n1253' class='pln'>1253</p>
+<p id='n1254' class='stm run hide_run'>1254</p>
+<p id='n1255' class='pln'>1255</p>
+<p id='n1256' class='pln'>1256</p>
+<p id='n1257' class='stm mis'>1257</p>
+<p id='n1258' class='pln'>1258</p>
+<p id='n1259' class='pln'>1259</p>
+<p id='n1260' class='pln'>1260</p>
+<p id='n1261' class='pln'>1261</p>
+<p id='n1262' class='pln'>1262</p>
+<p id='n1263' class='pln'>1263</p>
+<p id='n1264' class='pln'>1264</p>
+<p id='n1265' class='pln'>1265</p>
+<p id='n1266' class='pln'>1266</p>
+<p id='n1267' class='pln'>1267</p>
+<p id='n1268' class='pln'>1268</p>
+<p id='n1269' class='pln'>1269</p>
+<p id='n1270' class='pln'>1270</p>
+<p id='n1271' class='pln'>1271</p>
+<p id='n1272' class='pln'>1272</p>
+<p id='n1273' class='pln'>1273</p>
+<p id='n1274' class='pln'>1274</p>
+<p id='n1275' class='pln'>1275</p>
+<p id='n1276' class='pln'>1276</p>
+<p id='n1277' class='pln'>1277</p>
+<p id='n1278' class='pln'>1278</p>
+<p id='n1279' class='pln'>1279</p>
+<p id='n1280' class='pln'>1280</p>
+<p id='n1281' class='stm mis'>1281</p>
+<p id='n1282' class='pln'>1282</p>
+<p id='n1283' class='pln'>1283</p>
+<p id='n1284' class='stm mis'>1284</p>
+<p id='n1285' class='stm mis'>1285</p>
+<p id='n1286' class='pln'>1286</p>
+<p id='n1287' class='pln'>1287</p>
+<p id='n1288' class='stm run hide_run'>1288</p>
+<p id='n1289' class='pln'>1289</p>
+<p id='n1290' class='stm run hide_run'>1290</p>
+<p id='n1291' class='pln'>1291</p>
+<p id='n1292' class='stm mis'>1292</p>
+<p id='n1293' class='pln'>1293</p>
+<p id='n1294' class='pln'>1294</p>
+<p id='n1295' class='pln'>1295</p>
+<p id='n1296' class='pln'>1296</p>
+<p id='n1297' class='pln'>1297</p>
+<p id='n1298' class='pln'>1298</p>
+<p id='n1299' class='pln'>1299</p>
+<p id='n1300' class='pln'>1300</p>
+<p id='n1301' class='pln'>1301</p>
+<p id='n1302' class='pln'>1302</p>
+<p id='n1303' class='pln'>1303</p>
+<p id='n1304' class='pln'>1304</p>
+<p id='n1305' class='pln'>1305</p>
+<p id='n1306' class='pln'>1306</p>
+<p id='n1307' class='stm mis'>1307</p>
+<p id='n1308' class='stm mis'>1308</p>
+<p id='n1309' class='stm mis'>1309</p>
+<p id='n1310' class='stm mis'>1310</p>
+<p id='n1311' class='stm mis'>1311</p>
+<p id='n1312' class='stm mis'>1312</p>
+<p id='n1313' class='stm mis'>1313</p>
+<p id='n1314' class='stm mis'>1314</p>
+<p id='n1315' class='stm mis'>1315</p>
+<p id='n1316' class='stm mis'>1316</p>
+<p id='n1317' class='stm mis'>1317</p>
+<p id='n1318' class='stm mis'>1318</p>
+<p id='n1319' class='pln'>1319</p>
+<p id='n1320' class='stm run hide_run'>1320</p>
+<p id='n1321' class='stm mis'>1321</p>
+<p id='n1322' class='pln'>1322</p>
+<p id='n1323' class='pln'>1323</p>
+<p id='n1324' class='pln'>1324</p>
+<p id='n1325' class='pln'>1325</p>
+<p id='n1326' class='pln'>1326</p>
+<p id='n1327' class='pln'>1327</p>
+<p id='n1328' class='pln'>1328</p>
+<p id='n1329' class='pln'>1329</p>
+<p id='n1330' class='pln'>1330</p>
+<p id='n1331' class='pln'>1331</p>
+<p id='n1332' class='pln'>1332</p>
+<p id='n1333' class='pln'>1333</p>
+<p id='n1334' class='pln'>1334</p>
+<p id='n1335' class='pln'>1335</p>
+<p id='n1336' class='pln'>1336</p>
+<p id='n1337' class='pln'>1337</p>
+<p id='n1338' class='pln'>1338</p>
+<p id='n1339' class='pln'>1339</p>
+<p id='n1340' class='pln'>1340</p>
+<p id='n1341' class='pln'>1341</p>
+<p id='n1342' class='pln'>1342</p>
+<p id='n1343' class='pln'>1343</p>
+<p id='n1344' class='pln'>1344</p>
+<p id='n1345' class='pln'>1345</p>
+<p id='n1346' class='pln'>1346</p>
+<p id='n1347' class='stm mis'>1347</p>
+<p id='n1348' class='stm mis'>1348</p>
+<p id='n1349' class='stm mis'>1349</p>
+<p id='n1350' class='stm mis'>1350</p>
+<p id='n1351' class='stm mis'>1351</p>
+<p id='n1352' class='stm mis'>1352</p>
+<p id='n1353' class='pln'>1353</p>
+<p id='n1354' class='stm run hide_run'>1354</p>
+<p id='n1355' class='pln'>1355</p>
+<p id='n1356' class='stm mis'>1356</p>
+<p id='n1357' class='pln'>1357</p>
+<p id='n1358' class='pln'>1358</p>
+<p id='n1359' class='pln'>1359</p>
+<p id='n1360' class='pln'>1360</p>
+<p id='n1361' class='pln'>1361</p>
+<p id='n1362' class='pln'>1362</p>
+<p id='n1363' class='pln'>1363</p>
+<p id='n1364' class='pln'>1364</p>
+<p id='n1365' class='pln'>1365</p>
+<p id='n1366' class='pln'>1366</p>
+<p id='n1367' class='pln'>1367</p>
+<p id='n1368' class='pln'>1368</p>
+<p id='n1369' class='pln'>1369</p>
+<p id='n1370' class='pln'>1370</p>
+<p id='n1371' class='pln'>1371</p>
+<p id='n1372' class='pln'>1372</p>
+<p id='n1373' class='pln'>1373</p>
+<p id='n1374' class='pln'>1374</p>
+<p id='n1375' class='pln'>1375</p>
+<p id='n1376' class='pln'>1376</p>
+<p id='n1377' class='pln'>1377</p>
+<p id='n1378' class='pln'>1378</p>
+<p id='n1379' class='pln'>1379</p>
+<p id='n1380' class='pln'>1380</p>
+<p id='n1381' class='pln'>1381</p>
+<p id='n1382' class='pln'>1382</p>
+<p id='n1383' class='pln'>1383</p>
+<p id='n1384' class='pln'>1384</p>
+<p id='n1385' class='pln'>1385</p>
+<p id='n1386' class='pln'>1386</p>
+<p id='n1387' class='pln'>1387</p>
+<p id='n1388' class='pln'>1388</p>
+<p id='n1389' class='pln'>1389</p>
+<p id='n1390' class='pln'>1390</p>
+<p id='n1391' class='pln'>1391</p>
+<p id='n1392' class='pln'>1392</p>
+<p id='n1393' class='pln'>1393</p>
+<p id='n1394' class='pln'>1394</p>
+<p id='n1395' class='pln'>1395</p>
+<p id='n1396' class='pln'>1396</p>
+<p id='n1397' class='pln'>1397</p>
+<p id='n1398' class='pln'>1398</p>
+<p id='n1399' class='pln'>1399</p>
+<p id='n1400' class='pln'>1400</p>
+<p id='n1401' class='stm mis'>1401</p>
+<p id='n1402' class='stm mis'>1402</p>
+<p id='n1403' class='stm mis'>1403</p>
+<p id='n1404' class='stm mis'>1404</p>
+<p id='n1405' class='stm mis'>1405</p>
+<p id='n1406' class='stm mis'>1406</p>
+<p id='n1407' class='pln'>1407</p>
+<p id='n1408' class='stm run hide_run'>1408</p>
+<p id='n1409' class='stm mis'>1409</p>
+<p id='n1410' class='pln'>1410</p>
+<p id='n1411' class='pln'>1411</p>
+<p id='n1412' class='pln'>1412</p>
+<p id='n1413' class='pln'>1413</p>
+<p id='n1414' class='pln'>1414</p>
+<p id='n1415' class='pln'>1415</p>
+<p id='n1416' class='pln'>1416</p>
+<p id='n1417' class='pln'>1417</p>
+<p id='n1418' class='pln'>1418</p>
+<p id='n1419' class='pln'>1419</p>
+<p id='n1420' class='pln'>1420</p>
+<p id='n1421' class='pln'>1421</p>
+<p id='n1422' class='pln'>1422</p>
+<p id='n1423' class='pln'>1423</p>
+<p id='n1424' class='pln'>1424</p>
+<p id='n1425' class='pln'>1425</p>
+<p id='n1426' class='pln'>1426</p>
+<p id='n1427' class='pln'>1427</p>
+<p id='n1428' class='pln'>1428</p>
+<p id='n1429' class='pln'>1429</p>
+<p id='n1430' class='pln'>1430</p>
+<p id='n1431' class='pln'>1431</p>
+<p id='n1432' class='pln'>1432</p>
+<p id='n1433' class='pln'>1433</p>
+<p id='n1434' class='pln'>1434</p>
+<p id='n1435' class='pln'>1435</p>
+<p id='n1436' class='pln'>1436</p>
+<p id='n1437' class='stm mis'>1437</p>
+<p id='n1438' class='pln'>1438</p>
+<p id='n1439' class='stm mis'>1439</p>
+<p id='n1440' class='stm mis'>1440</p>
+<p id='n1441' class='stm mis'>1441</p>
+<p id='n1442' class='pln'>1442</p>
+<p id='n1443' class='stm mis'>1443</p>
+<p id='n1444' class='stm mis'>1444</p>
+<p id='n1445' class='stm mis'>1445</p>
+<p id='n1446' class='pln'>1446</p>
+<p id='n1447' class='stm mis'>1447</p>
+<p id='n1448' class='stm mis'>1448</p>
+<p id='n1449' class='pln'>1449</p>
+<p id='n1450' class='stm run hide_run'>1450</p>
+<p id='n1451' class='stm mis'>1451</p>
+<p id='n1452' class='pln'>1452</p>
+<p id='n1453' class='pln'>1453</p>
+<p id='n1454' class='pln'>1454</p>
+<p id='n1455' class='pln'>1455</p>
+<p id='n1456' class='pln'>1456</p>
+<p id='n1457' class='stm mis'>1457</p>
+<p id='n1458' class='stm mis'>1458</p>
+<p id='n1459' class='stm mis'>1459</p>
+<p id='n1460' class='stm mis'>1460</p>
+<p id='n1461' class='pln'>1461</p>
+<p id='n1462' class='stm run hide_run'>1462</p>
+<p id='n1463' class='pln'>1463</p>
+<p id='n1464' class='pln'>1464</p>
+<p id='n1465' class='stm mis'>1465</p>
+<p id='n1466' class='pln'>1466</p>
+<p id='n1467' class='pln'>1467</p>
+<p id='n1468' class='pln'>1468</p>
+<p id='n1469' class='pln'>1469</p>
+<p id='n1470' class='pln'>1470</p>
+<p id='n1471' class='pln'>1471</p>
+<p id='n1472' class='pln'>1472</p>
+<p id='n1473' class='pln'>1473</p>
+<p id='n1474' class='pln'>1474</p>
+<p id='n1475' class='pln'>1475</p>
+<p id='n1476' class='pln'>1476</p>
+<p id='n1477' class='pln'>1477</p>
+<p id='n1478' class='pln'>1478</p>
+<p id='n1479' class='stm mis'>1479</p>
+<p id='n1480' class='stm mis'>1480</p>
+<p id='n1481' class='stm mis'>1481</p>
+<p id='n1482' class='stm mis'>1482</p>
+<p id='n1483' class='stm mis'>1483</p>
+<p id='n1484' class='stm mis'>1484</p>
+<p id='n1485' class='stm mis'>1485</p>
+<p id='n1486' class='pln'>1486</p>
+<p id='n1487' class='stm run hide_run'>1487</p>
+<p id='n1488' class='stm mis'>1488</p>
+<p id='n1489' class='pln'>1489</p>
+<p id='n1490' class='pln'>1490</p>
+<p id='n1491' class='pln'>1491</p>
+<p id='n1492' class='pln'>1492</p>
+<p id='n1493' class='pln'>1493</p>
+<p id='n1494' class='pln'>1494</p>
+<p id='n1495' class='pln'>1495</p>
+<p id='n1496' class='pln'>1496</p>
+<p id='n1497' class='pln'>1497</p>
+<p id='n1498' class='pln'>1498</p>
+<p id='n1499' class='pln'>1499</p>
+<p id='n1500' class='pln'>1500</p>
+<p id='n1501' class='pln'>1501</p>
+<p id='n1502' class='pln'>1502</p>
+<p id='n1503' class='pln'>1503</p>
+<p id='n1504' class='pln'>1504</p>
+<p id='n1505' class='pln'>1505</p>
+<p id='n1506' class='pln'>1506</p>
+<p id='n1507' class='stm mis'>1507</p>
+<p id='n1508' class='stm mis'>1508</p>
+<p id='n1509' class='stm mis'>1509</p>
+<p id='n1510' class='stm mis'>1510</p>
+<p id='n1511' class='stm mis'>1511</p>
+<p id='n1512' class='stm mis'>1512</p>
+<p id='n1513' class='stm mis'>1513</p>
+<p id='n1514' class='stm mis'>1514</p>
+<p id='n1515' class='stm mis'>1515</p>
+<p id='n1516' class='stm mis'>1516</p>
+<p id='n1517' class='stm mis'>1517</p>
+<p id='n1518' class='stm mis'>1518</p>
+<p id='n1519' class='stm mis'>1519</p>
+<p id='n1520' class='stm mis'>1520</p>
+<p id='n1521' class='stm mis'>1521</p>
+<p id='n1522' class='stm mis'>1522</p>
+<p id='n1523' class='stm mis'>1523</p>
+<p id='n1524' class='stm mis'>1524</p>
+<p id='n1525' class='pln'>1525</p>
+<p id='n1526' class='stm run hide_run'>1526</p>
+<p id='n1527' class='stm mis'>1527</p>
+<p id='n1528' class='pln'>1528</p>
+<p id='n1529' class='pln'>1529</p>
+<p id='n1530' class='pln'>1530</p>
+<p id='n1531' class='pln'>1531</p>
+<p id='n1532' class='pln'>1532</p>
+<p id='n1533' class='pln'>1533</p>
+<p id='n1534' class='stm mis'>1534</p>
+<p id='n1535' class='stm mis'>1535</p>
+<p id='n1536' class='stm mis'>1536</p>
+<p id='n1537' class='stm mis'>1537</p>
+<p id='n1538' class='stm mis'>1538</p>
+<p id='n1539' class='stm mis'>1539</p>
+<p id='n1540' class='stm mis'>1540</p>
+<p id='n1541' class='stm mis'>1541</p>
+<p id='n1542' class='pln'>1542</p>
+<p id='n1543' class='stm run hide_run'>1543</p>
+<p id='n1544' class='stm mis'>1544</p>
+<p id='n1545' class='pln'>1545</p>
+<p id='n1546' class='pln'>1546</p>
+<p id='n1547' class='pln'>1547</p>
+<p id='n1548' class='pln'>1548</p>
+<p id='n1549' class='pln'>1549</p>
+<p id='n1550' class='pln'>1550</p>
+<p id='n1551' class='pln'>1551</p>
+<p id='n1552' class='pln'>1552</p>
+<p id='n1553' class='pln'>1553</p>
+<p id='n1554' class='pln'>1554</p>
+<p id='n1555' class='pln'>1555</p>
+<p id='n1556' class='pln'>1556</p>
+<p id='n1557' class='pln'>1557</p>
+<p id='n1558' class='pln'>1558</p>
+<p id='n1559' class='pln'>1559</p>
+<p id='n1560' class='pln'>1560</p>
+<p id='n1561' class='pln'>1561</p>
+<p id='n1562' class='pln'>1562</p>
+<p id='n1563' class='pln'>1563</p>
+<p id='n1564' class='stm mis'>1564</p>
+<p id='n1565' class='stm mis'>1565</p>
+<p id='n1566' class='stm mis'>1566</p>
+<p id='n1567' class='pln'>1567</p>
+<p id='n1568' class='stm run hide_run'>1568</p>
+<p id='n1569' class='stm mis'>1569</p>
+<p id='n1570' class='pln'>1570</p>
+<p id='n1571' class='pln'>1571</p>
+<p id='n1572' class='pln'>1572</p>
+<p id='n1573' class='pln'>1573</p>
+<p id='n1574' class='pln'>1574</p>
+<p id='n1575' class='pln'>1575</p>
+<p id='n1576' class='pln'>1576</p>
+<p id='n1577' class='pln'>1577</p>
+<p id='n1578' class='pln'>1578</p>
+<p id='n1579' class='pln'>1579</p>
+<p id='n1580' class='pln'>1580</p>
+<p id='n1581' class='pln'>1581</p>
+<p id='n1582' class='pln'>1582</p>
+<p id='n1583' class='pln'>1583</p>
+<p id='n1584' class='stm mis'>1584</p>
+<p id='n1585' class='stm mis'>1585</p>
+<p id='n1586' class='stm mis'>1586</p>
+<p id='n1587' class='pln'>1587</p>
+<p id='n1588' class='stm run hide_run'>1588</p>
+<p id='n1589' class='stm mis'>1589</p>
+<p id='n1590' class='pln'>1590</p>
+<p id='n1591' class='pln'>1591</p>
+<p id='n1592' class='pln'>1592</p>
+<p id='n1593' class='pln'>1593</p>
+<p id='n1594' class='pln'>1594</p>
+<p id='n1595' class='pln'>1595</p>
+<p id='n1596' class='pln'>1596</p>
+<p id='n1597' class='pln'>1597</p>
+<p id='n1598' class='pln'>1598</p>
+<p id='n1599' class='pln'>1599</p>
+<p id='n1600' class='pln'>1600</p>
+<p id='n1601' class='pln'>1601</p>
+<p id='n1602' class='stm mis'>1602</p>
+<p id='n1603' class='stm mis'>1603</p>
+<p id='n1604' class='stm mis'>1604</p>
+<p id='n1605' class='pln'>1605</p>
+<p id='n1606' class='stm run hide_run'>1606</p>
+<p id='n1607' class='pln'>1607</p>
+<p id='n1608' class='stm run hide_run'>1608</p>
+<p id='n1609' class='pln'>1609</p>
+<p id='n1610' class='pln'>1610</p>
+<p id='n1611' class='pln'>1611</p>
+<p id='n1612' class='pln'>1612</p>
+<p id='n1613' class='pln'>1613</p>
+<p id='n1614' class='pln'>1614</p>
+<p id='n1615' class='pln'>1615</p>
+<p id='n1616' class='pln'>1616</p>
+<p id='n1617' class='pln'>1617</p>
+<p id='n1618' class='pln'>1618</p>
+<p id='n1619' class='pln'>1619</p>
+<p id='n1620' class='pln'>1620</p>
+<p id='n1621' class='pln'>1621</p>
+<p id='n1622' class='pln'>1622</p>
+<p id='n1623' class='pln'>1623</p>
+<p id='n1624' class='pln'>1624</p>
+<p id='n1625' class='pln'>1625</p>
+<p id='n1626' class='pln'>1626</p>
+<p id='n1627' class='pln'>1627</p>
+<p id='n1628' class='pln'>1628</p>
+<p id='n1629' class='exc'>1629</p>
+<p id='n1630' class='pln'>1630</p>
+<p id='n1631' class='exc'>1631</p>
+<p id='n1632' class='exc'>1632</p>
+<p id='n1633' class='exc'>1633</p>
+<p id='n1634' class='pln'>1634</p>
+<p id='n1635' class='exc'>1635</p>
+<p id='n1636' class='exc'>1636</p>
+<p id='n1637' class='pln'>1637</p>
+<p id='n1638' class='stm run hide_run'>1638</p>
+<p id='n1639' class='stm mis'>1639</p>
+<p id='n1640' class='stm mis'>1640</p>
+<p id='n1641' class='stm mis'>1641</p>
+<p id='n1642' class='stm mis'>1642</p>
+<p id='n1643' class='stm mis'>1643</p>
+<p id='n1644' class='pln'>1644</p>
+<p id='n1645' class='stm run hide_run'>1645</p>
+<p id='n1646' class='stm mis'>1646</p>
+<p id='n1647' class='stm mis'>1647</p>
+<p id='n1648' class='pln'>1648</p>
+<p id='n1649' class='stm run hide_run'>1649</p>
+<p id='n1650' class='stm mis'>1650</p>
+<p id='n1651' class='pln'>1651</p>
+<p id='n1652' class='pln'>1652</p>
+<p id='n1653' class='stm mis'>1653</p>
+<p id='n1654' class='pln'>1654</p>
+<p id='n1655' class='stm run hide_run'>1655</p>
+<p id='n1656' class='stm mis'>1656</p>
+<p id='n1657' class='stm mis'>1657</p>
+<p id='n1658' class='stm mis'>1658</p>
+<p id='n1659' class='pln'>1659</p>
+<p id='n1660' class='stm run hide_run'>1660</p>
+<p id='n1661' class='stm mis'>1661</p>
+<p id='n1662' class='stm mis'>1662</p>
+<p id='n1663' class='stm mis'>1663</p>
+<p id='n1664' class='pln'>1664</p>
+<p id='n1665' class='stm run hide_run'>1665</p>
+<p id='n1666' class='stm mis'>1666</p>
+<p id='n1667' class='pln'>1667</p>
+<p id='n1668' class='pln'>1668</p>
+<p id='n1669' class='stm mis'>1669</p>
+<p id='n1670' class='pln'>1670</p>
+<p id='n1671' class='stm run hide_run'>1671</p>
+<p id='n1672' class='pln'>1672</p>
+<p id='n1673' class='stm run hide_run'>1673</p>
+<p id='n1674' class='stm mis'>1674</p>
+<p id='n1675' class='pln'>1675</p>
+<p id='n1676' class='pln'>1676</p>
+<p id='n1677' class='pln'>1677</p>
+<p id='n1678' class='pln'>1678</p>
+<p id='n1679' class='pln'>1679</p>
+<p id='n1680' class='pln'>1680</p>
+<p id='n1681' class='pln'>1681</p>
+<p id='n1682' class='pln'>1682</p>
+<p id='n1683' class='pln'>1683</p>
+<p id='n1684' class='pln'>1684</p>
+<p id='n1685' class='pln'>1685</p>
+<p id='n1686' class='pln'>1686</p>
+<p id='n1687' class='pln'>1687</p>
+<p id='n1688' class='pln'>1688</p>
+<p id='n1689' class='pln'>1689</p>
+<p id='n1690' class='pln'>1690</p>
+<p id='n1691' class='pln'>1691</p>
+<p id='n1692' class='pln'>1692</p>
+<p id='n1693' class='pln'>1693</p>
+<p id='n1694' class='stm mis'>1694</p>
+<p id='n1695' class='stm mis'>1695</p>
+<p id='n1696' class='stm mis'>1696</p>
+<p id='n1697' class='pln'>1697</p>
+<p id='n1698' class='stm run hide_run'>1698</p>
+<p id='n1699' class='stm mis'>1699</p>
+<p id='n1700' class='pln'>1700</p>
+<p id='n1701' class='pln'>1701</p>
+<p id='n1702' class='pln'>1702</p>
+<p id='n1703' class='pln'>1703</p>
+<p id='n1704' class='pln'>1704</p>
+<p id='n1705' class='pln'>1705</p>
+<p id='n1706' class='pln'>1706</p>
+<p id='n1707' class='pln'>1707</p>
+<p id='n1708' class='pln'>1708</p>
+<p id='n1709' class='pln'>1709</p>
+<p id='n1710' class='pln'>1710</p>
+<p id='n1711' class='pln'>1711</p>
+<p id='n1712' class='pln'>1712</p>
+<p id='n1713' class='pln'>1713</p>
+<p id='n1714' class='pln'>1714</p>
+<p id='n1715' class='pln'>1715</p>
+<p id='n1716' class='pln'>1716</p>
+<p id='n1717' class='pln'>1717</p>
+<p id='n1718' class='pln'>1718</p>
+<p id='n1719' class='pln'>1719</p>
+<p id='n1720' class='pln'>1720</p>
+<p id='n1721' class='pln'>1721</p>
+<p id='n1722' class='pln'>1722</p>
+<p id='n1723' class='stm mis'>1723</p>
+<p id='n1724' class='stm mis'>1724</p>
+<p id='n1725' class='stm mis'>1725</p>
+<p id='n1726' class='pln'>1726</p>
+<p id='n1727' class='stm run hide_run'>1727</p>
+<p id='n1728' class='stm mis'>1728</p>
+<p id='n1729' class='pln'>1729</p>
+<p id='n1730' class='pln'>1730</p>
+<p id='n1731' class='pln'>1731</p>
+<p id='n1732' class='pln'>1732</p>
+<p id='n1733' class='pln'>1733</p>
+<p id='n1734' class='pln'>1734</p>
+<p id='n1735' class='pln'>1735</p>
+<p id='n1736' class='pln'>1736</p>
+<p id='n1737' class='pln'>1737</p>
+<p id='n1738' class='pln'>1738</p>
+<p id='n1739' class='pln'>1739</p>
+<p id='n1740' class='pln'>1740</p>
+<p id='n1741' class='pln'>1741</p>
+<p id='n1742' class='pln'>1742</p>
+<p id='n1743' class='pln'>1743</p>
+<p id='n1744' class='pln'>1744</p>
+<p id='n1745' class='pln'>1745</p>
+<p id='n1746' class='pln'>1746</p>
+<p id='n1747' class='pln'>1747</p>
+<p id='n1748' class='pln'>1748</p>
+<p id='n1749' class='pln'>1749</p>
+<p id='n1750' class='pln'>1750</p>
+<p id='n1751' class='pln'>1751</p>
+<p id='n1752' class='stm mis'>1752</p>
+<p id='n1753' class='stm mis'>1753</p>
+<p id='n1754' class='stm mis'>1754</p>
+<p id='n1755' class='pln'>1755</p>
+<p id='n1756' class='stm run hide_run'>1756</p>
+<p id='n1757' class='stm mis'>1757</p>
+<p id='n1758' class='pln'>1758</p>
+<p id='n1759' class='pln'>1759</p>
+<p id='n1760' class='pln'>1760</p>
+<p id='n1761' class='pln'>1761</p>
+<p id='n1762' class='pln'>1762</p>
+<p id='n1763' class='pln'>1763</p>
+<p id='n1764' class='pln'>1764</p>
+<p id='n1765' class='pln'>1765</p>
+<p id='n1766' class='pln'>1766</p>
+<p id='n1767' class='pln'>1767</p>
+<p id='n1768' class='pln'>1768</p>
+<p id='n1769' class='pln'>1769</p>
+<p id='n1770' class='pln'>1770</p>
+<p id='n1771' class='pln'>1771</p>
+<p id='n1772' class='pln'>1772</p>
+<p id='n1773' class='pln'>1773</p>
+<p id='n1774' class='pln'>1774</p>
+<p id='n1775' class='pln'>1775</p>
+<p id='n1776' class='pln'>1776</p>
+<p id='n1777' class='pln'>1777</p>
+<p id='n1778' class='pln'>1778</p>
+<p id='n1779' class='pln'>1779</p>
+<p id='n1780' class='pln'>1780</p>
+<p id='n1781' class='pln'>1781</p>
+<p id='n1782' class='pln'>1782</p>
+<p id='n1783' class='pln'>1783</p>
+<p id='n1784' class='pln'>1784</p>
+<p id='n1785' class='pln'>1785</p>
+<p id='n1786' class='pln'>1786</p>
+<p id='n1787' class='pln'>1787</p>
+<p id='n1788' class='pln'>1788</p>
+<p id='n1789' class='pln'>1789</p>
+<p id='n1790' class='pln'>1790</p>
+<p id='n1791' class='pln'>1791</p>
+<p id='n1792' class='pln'>1792</p>
+<p id='n1793' class='pln'>1793</p>
+<p id='n1794' class='pln'>1794</p>
+<p id='n1795' class='pln'>1795</p>
+<p id='n1796' class='pln'>1796</p>
+<p id='n1797' class='pln'>1797</p>
+<p id='n1798' class='pln'>1798</p>
+<p id='n1799' class='pln'>1799</p>
+<p id='n1800' class='pln'>1800</p>
+<p id='n1801' class='pln'>1801</p>
+<p id='n1802' class='pln'>1802</p>
+<p id='n1803' class='pln'>1803</p>
+<p id='n1804' class='pln'>1804</p>
+<p id='n1805' class='pln'>1805</p>
+<p id='n1806' class='pln'>1806</p>
+<p id='n1807' class='pln'>1807</p>
+<p id='n1808' class='pln'>1808</p>
+<p id='n1809' class='pln'>1809</p>
+<p id='n1810' class='pln'>1810</p>
+<p id='n1811' class='pln'>1811</p>
+<p id='n1812' class='pln'>1812</p>
+<p id='n1813' class='pln'>1813</p>
+<p id='n1814' class='pln'>1814</p>
+<p id='n1815' class='pln'>1815</p>
+<p id='n1816' class='pln'>1816</p>
+<p id='n1817' class='pln'>1817</p>
+<p id='n1818' class='pln'>1818</p>
+<p id='n1819' class='pln'>1819</p>
+<p id='n1820' class='pln'>1820</p>
+<p id='n1821' class='pln'>1821</p>
+<p id='n1822' class='pln'>1822</p>
+<p id='n1823' class='pln'>1823</p>
+<p id='n1824' class='pln'>1824</p>
+<p id='n1825' class='pln'>1825</p>
+<p id='n1826' class='pln'>1826</p>
+<p id='n1827' class='pln'>1827</p>
+<p id='n1828' class='pln'>1828</p>
+<p id='n1829' class='pln'>1829</p>
+<p id='n1830' class='stm mis'>1830</p>
+<p id='n1831' class='stm mis'>1831</p>
+<p id='n1832' class='pln'>1832</p>
+<p id='n1833' class='pln'>1833</p>
+<p id='n1834' class='stm mis'>1834</p>
+<p id='n1835' class='pln'>1835</p>
+<p id='n1836' class='pln'>1836</p>
+<p id='n1837' class='stm mis'>1837</p>
+<p id='n1838' class='pln'>1838</p>
+<p id='n1839' class='pln'>1839</p>
+<p id='n1840' class='stm mis'>1840</p>
+<p id='n1841' class='pln'>1841</p>
+<p id='n1842' class='pln'>1842</p>
+<p id='n1843' class='stm mis'>1843</p>
+<p id='n1844' class='pln'>1844</p>
+<p id='n1845' class='pln'>1845</p>
+<p id='n1846' class='stm mis'>1846</p>
+<p id='n1847' class='pln'>1847</p>
+<p id='n1848' class='pln'>1848</p>
+<p id='n1849' class='pln'>1849</p>
+<p id='n1850' class='stm run hide_run'>1850</p>
+<p id='n1851' class='pln'>1851</p>
+<p id='n1852' class='pln'>1852</p>
+<p id='n1853' class='stm run hide_run'>1853</p>
+<p id='n1854' class='pln'>1854</p>
+<p id='n1855' class='stm mis'>1855</p>
+<p id='n1856' class='pln'>1856</p>
+<p id='n1857' class='pln'>1857</p>
+<p id='n1858' class='pln'>1858</p>
+<p id='n1859' class='pln'>1859</p>
+<p id='n1860' class='pln'>1860</p>
+<p id='n1861' class='pln'>1861</p>
+<p id='n1862' class='pln'>1862</p>
+<p id='n1863' class='pln'>1863</p>
+<p id='n1864' class='pln'>1864</p>
+<p id='n1865' class='pln'>1865</p>
+<p id='n1866' class='pln'>1866</p>
+<p id='n1867' class='pln'>1867</p>
+<p id='n1868' class='pln'>1868</p>
+<p id='n1869' class='pln'>1869</p>
+<p id='n1870' class='pln'>1870</p>
+<p id='n1871' class='pln'>1871</p>
+<p id='n1872' class='pln'>1872</p>
+<p id='n1873' class='pln'>1873</p>
+<p id='n1874' class='pln'>1874</p>
+<p id='n1875' class='pln'>1875</p>
+<p id='n1876' class='pln'>1876</p>
+<p id='n1877' class='stm mis'>1877</p>
+<p id='n1878' class='stm mis'>1878</p>
+<p id='n1879' class='stm mis'>1879</p>
+<p id='n1880' class='pln'>1880</p>
+<p id='n1881' class='stm run hide_run'>1881</p>
+<p id='n1882' class='stm mis'>1882</p>
+<p id='n1883' class='pln'>1883</p>
+<p id='n1884' class='pln'>1884</p>
+<p id='n1885' class='pln'>1885</p>
+<p id='n1886' class='pln'>1886</p>
+<p id='n1887' class='pln'>1887</p>
+<p id='n1888' class='stm mis'>1888</p>
+<p id='n1889' class='stm mis'>1889</p>
+<p id='n1890' class='pln'>1890</p>
+<p id='n1891' class='stm run hide_run'>1891</p>
+<p id='n1892' class='pln'>1892</p>
+<p id='n1893' class='pln'>1893</p>
+<p id='n1894' class='stm mis'>1894</p>
+<p id='n1895' class='pln'>1895</p>
+<p id='n1896' class='pln'>1896</p>
+<p id='n1897' class='pln'>1897</p>
+<p id='n1898' class='pln'>1898</p>
+<p id='n1899' class='pln'>1899</p>
+<p id='n1900' class='pln'>1900</p>
+<p id='n1901' class='pln'>1901</p>
+<p id='n1902' class='pln'>1902</p>
+<p id='n1903' class='pln'>1903</p>
+<p id='n1904' class='pln'>1904</p>
+<p id='n1905' class='pln'>1905</p>
+<p id='n1906' class='pln'>1906</p>
+<p id='n1907' class='pln'>1907</p>
+<p id='n1908' class='pln'>1908</p>
+<p id='n1909' class='pln'>1909</p>
+<p id='n1910' class='pln'>1910</p>
+<p id='n1911' class='pln'>1911</p>
+<p id='n1912' class='stm mis'>1912</p>
+<p id='n1913' class='stm mis'>1913</p>
+<p id='n1914' class='stm mis'>1914</p>
+<p id='n1915' class='stm mis'>1915</p>
+<p id='n1916' class='stm mis'>1916</p>
+<p id='n1917' class='stm mis'>1917</p>
+<p id='n1918' class='pln'>1918</p>
+<p id='n1919' class='stm run hide_run'>1919</p>
+<p id='n1920' class='pln'>1920</p>
+<p id='n1921' class='stm run hide_run'>1921</p>
+<p id='n1922' class='pln'>1922</p>
+<p id='n1923' class='stm mis'>1923</p>
+<p id='n1924' class='pln'>1924</p>
+<p id='n1925' class='pln'>1925</p>
+<p id='n1926' class='pln'>1926</p>
+<p id='n1927' class='pln'>1927</p>
+<p id='n1928' class='pln'>1928</p>
+<p id='n1929' class='pln'>1929</p>
+<p id='n1930' class='pln'>1930</p>
+<p id='n1931' class='pln'>1931</p>
+<p id='n1932' class='stm mis'>1932</p>
+<p id='n1933' class='stm mis'>1933</p>
+<p id='n1934' class='stm mis'>1934</p>
+<p id='n1935' class='stm mis'>1935</p>
+<p id='n1936' class='pln'>1936</p>
+<p id='n1937' class='stm run hide_run'>1937</p>
+<p id='n1938' class='pln'>1938</p>
+<p id='n1939' class='stm mis'>1939</p>
+<p id='n1940' class='pln'>1940</p>
+<p id='n1941' class='pln'>1941</p>
+<p id='n1942' class='pln'>1942</p>
+<p id='n1943' class='pln'>1943</p>
+<p id='n1944' class='pln'>1944</p>
+<p id='n1945' class='pln'>1945</p>
+<p id='n1946' class='pln'>1946</p>
+<p id='n1947' class='pln'>1947</p>
+<p id='n1948' class='stm mis'>1948</p>
+<p id='n1949' class='stm mis'>1949</p>
+<p id='n1950' class='stm mis'>1950</p>
+<p id='n1951' class='stm mis'>1951</p>
+<p id='n1952' class='stm mis'>1952</p>
+<p id='n1953' class='stm mis'>1953</p>
+<p id='n1954' class='pln'>1954</p>
+<p id='n1955' class='pln'>1955</p>
+<p id='n1956' class='exc'>1956</p>
+<p id='n1957' class='exc'>1957</p>
+<p id='n1958' class='pln'>1958</p>
+<p id='n1959' class='pln'>1959</p>
+<p id='n1960' class='pln'>1960</p>
+
+ </td>
+ <td class='text' valign='top'>
+<p id='t1' class='pln'><span class='str'>""" Test cogapp.</span><span class='strut'> </span></p>
+<p id='t2' class='pln'><span class='str'> http://nedbatchelder.com/code/cog</span><span class='strut'> </span></p>
+<p id='t3' class='pln'><span class='str'> </span><span class='strut'> </span></p>
+<p id='t4' class='pln'><span class='str'> Copyright 2004-2009, Ned Batchelder.</span><span class='strut'> </span></p>
+<p id='t5' class='pln'><span class='str'>"""</span><span class='strut'> </span></p>
+<p id='t6' class='pln'><span class='strut'> </span></p>
+<p id='t7' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>unittest</span><span class='strut'> </span></p>
+<p id='t8' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>os</span><span class='op'>,</span> <span class='nam'>random</span><span class='op'>,</span> <span class='nam'>re</span><span class='op'>,</span> <span class='nam'>StringIO</span><span class='op'>,</span> <span class='nam'>stat</span><span class='op'>,</span> <span class='nam'>sys</span><span class='op'>,</span> <span class='nam'>tempfile</span><span class='strut'> </span></p>
+<p id='t9' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>path</span> <span class='com'># Non-standard, from http://www.jorendorff.com/articles/python/path</span><span class='strut'> </span></p>
+<p id='t10' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>cogapp</span> <span class='key'>import</span> <span class='nam'>Cog</span><span class='op'>,</span> <span class='nam'>CogOptions</span><span class='op'>,</span> <span class='nam'>CogGenerator</span><span class='strut'> </span></p>
+<p id='t11' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>cogapp</span> <span class='key'>import</span> <span class='nam'>CogError</span><span class='op'>,</span> <span class='nam'>CogUsageError</span><span class='op'>,</span> <span class='nam'>CogGeneratedError</span><span class='strut'> </span></p>
+<p id='t12' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>cogapp</span> <span class='key'>import</span> <span class='nam'>usage</span><span class='op'>,</span> <span class='nam'>__version__</span><span class='strut'> </span></p>
+<p id='t13' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>whiteutils</span> <span class='key'>import</span> <span class='nam'>reindentBlock</span><span class='strut'> </span></p>
+<p id='t14' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>makefiles</span> <span class='key'>import</span> <span class='op'>*</span><span class='strut'> </span></p>
+<p id='t15' class='pln'><span class='strut'> </span></p>
+<p id='t16' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>TestCase</span><span class='op'>(</span><span class='nam'>unittest</span><span class='op'>.</span><span class='nam'>TestCase</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t17' class='pln'> <span class='str'>""" Base class for all Cog test cases. Adds utility methods I like.</span><span class='strut'> </span></p>
+<p id='t18' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t19' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>assertRaisesMsg</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>excClass</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>,</span> <span class='nam'>callableObj</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t20' class='pln'> <span class='str'>""" Just like unittest.TestCase.assertRaises,</span><span class='strut'> </span></p>
+<p id='t21' class='pln'><span class='str'> but checks that the message is right too.</span><span class='strut'> </span></p>
+<p id='t22' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t23' class='stm run hide_run'> <span class='key'>try</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t24' class='stm run hide_run'> <span class='nam'>callableObj</span><span class='op'>(</span><span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t25' class='stm run hide_run'> <span class='key'>except</span> <span class='nam'>excClass</span><span class='op'>,</span> <span class='nam'>exc</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t26' class='stm run hide_run'> <span class='nam'>excMsg</span> <span class='op'>=</span> <span class='nam'>str</span><span class='op'>(</span><span class='nam'>exc</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t27' class='stm run hide_run'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>msg</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t28' class='pln'> <span class='com'># No message provided: it passes.</span><span class='strut'> </span></p>
+<p id='t29' class='exc'> <span class='key'>return</span> <span class='com'>#pragma: no cover</span><span class='strut'> </span></p>
+<p id='t30' class='stm run hide_run'> <span class='key'>elif</span> <span class='nam'>excMsg</span> <span class='op'>==</span> <span class='nam'>msg</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t31' class='pln'> <span class='com'># Message provided, and we got the right message: it passes.</span><span class='strut'> </span></p>
+<p id='t32' class='stm run hide_run'> <span class='key'>return</span><span class='strut'> </span></p>
+<p id='t33' class='exc'> <span class='key'>else</span><span class='op'>:</span> <span class='com'>#pragma: no cover</span><span class='strut'> </span></p>
+<p id='t34' class='pln'> <span class='com'># Message provided, and it didn't match: fail!</span><span class='strut'> </span></p>
+<p id='t35' class='exc'> <span class='key'>raise</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>failureException</span><span class='op'>(</span><span class='str'>"Right exception, wrong message: got '%s' expected '%s'"</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>excMsg</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t36' class='exc'> <span class='key'>else</span><span class='op'>:</span> <span class='com'>#pragma: no cover</span><span class='strut'> </span></p>
+<p id='t37' class='exc'> <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>excClass</span><span class='op'>,</span><span class='str'>'__name__'</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t38' class='exc'> <span class='nam'>excName</span> <span class='op'>=</span> <span class='nam'>excClass</span><span class='op'>.</span><span class='nam'>__name__</span><span class='strut'> </span></p>
+<p id='t39' class='exc'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t40' class='exc'> <span class='nam'>excName</span> <span class='op'>=</span> <span class='nam'>str</span><span class='op'>(</span><span class='nam'>excClass</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t41' class='exc'> <span class='key'>raise</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>failureException</span><span class='op'>(</span><span class='str'>"Expected to raise %s, didn't get an exception at all"</span> <span class='op'>%</span> <span class='nam'>excName</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t42' class='pln'><span class='strut'> </span></p>
+<p id='t43' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>CogTestsInMemory</span><span class='op'>(</span><span class='nam'>TestCase</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t44' class='pln'> <span class='str'>""" Test cases for cogapp.Cog()</span><span class='strut'> </span></p>
+<p id='t45' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t46' class='pln'><span class='strut'> </span></p>
+<p id='t47' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testNoCog</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t48' class='stm run hide_run'> <span class='nam'>strings</span> <span class='op'>=</span> <span class='op'>[</span><span class='strut'> </span></p>
+<p id='t49' class='pln'> <span class='str'>''</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t50' class='pln'> <span class='str'>' '</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t51' class='pln'> <span class='str'>' \t \t \tx'</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t52' class='pln'> <span class='str'>'hello'</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t53' class='pln'> <span class='str'>'the cat\nin the\nhat.'</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t54' class='pln'> <span class='str'>'Horton\n\tHears A\n\t\tWho'</span><span class='strut'> </span></p>
+<p id='t55' class='pln'> <span class='op'>]</span><span class='strut'> </span></p>
+<p id='t56' class='stm run hide_run'> <span class='key'>for</span> <span class='nam'>s</span> <span class='key'>in</span> <span class='nam'>strings</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t57' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>s</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>s</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t58' class='pln'><span class='strut'> </span></p>
+<p id='t59' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testSimple</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t60' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t61' class='pln'><span class='str'> Some text.</span><span class='strut'> </span></p>
+<p id='t62' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t63' class='pln'><span class='str'> import cog</span><span class='strut'> </span></p>
+<p id='t64' class='pln'><span class='str'> cog.outl("This is line one\\n")</span><span class='strut'> </span></p>
+<p id='t65' class='pln'><span class='str'> cog.outl("This is line two")</span><span class='strut'> </span></p>
+<p id='t66' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t67' class='pln'><span class='str'> gobbledegook.</span><span class='strut'> </span></p>
+<p id='t68' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t69' class='pln'><span class='str'> epilogue.</span><span class='strut'> </span></p>
+<p id='t70' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t71' class='pln'><span class='strut'> </span></p>
+<p id='t72' class='stm run hide_run'> <span class='nam'>outfile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t73' class='pln'><span class='str'> Some text.</span><span class='strut'> </span></p>
+<p id='t74' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t75' class='pln'><span class='str'> import cog</span><span class='strut'> </span></p>
+<p id='t76' class='pln'><span class='str'> cog.outl("This is line one\\n")</span><span class='strut'> </span></p>
+<p id='t77' class='pln'><span class='str'> cog.outl("This is line two")</span><span class='strut'> </span></p>
+<p id='t78' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t79' class='pln'><span class='str'> This is line one</span><span class='strut'> </span></p>
+<p id='t80' class='pln'><span class='strut'> </span></p>
+<p id='t81' class='pln'><span class='str'> This is line two</span><span class='strut'> </span></p>
+<p id='t82' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t83' class='pln'><span class='str'> epilogue.</span><span class='strut'> </span></p>
+<p id='t84' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t85' class='pln'><span class='strut'> </span></p>
+<p id='t86' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>outfile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t87' class='pln'><span class='strut'> </span></p>
+<p id='t88' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testEmptyCog</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t89' class='pln'> <span class='com'># The cog clause can be totally empty. Not sure why you'd want it,</span><span class='strut'> </span></p>
+<p id='t90' class='pln'> <span class='com'># but it works.</span><span class='strut'> </span></p>
+<p id='t91' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t92' class='pln'><span class='str'> hello</span><span class='strut'> </span></p>
+<p id='t93' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t94' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t95' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t96' class='pln'><span class='str'> goodbye</span><span class='strut'> </span></p>
+<p id='t97' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t98' class='pln'><span class='strut'> </span></p>
+<p id='t99' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t100' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t101' class='pln'><span class='strut'> </span></p>
+<p id='t102' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testMultipleCogs</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t103' class='pln'> <span class='com'># One file can have many cog chunks, even abutting each other.</span><span class='strut'> </span></p>
+<p id='t104' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t105' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t106' class='pln'><span class='str'> cog.out("chunk1")</span><span class='strut'> </span></p>
+<p id='t107' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t108' class='pln'><span class='str'> chunk1</span><span class='strut'> </span></p>
+<p id='t109' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t110' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t111' class='pln'><span class='str'> cog.out("chunk2")</span><span class='strut'> </span></p>
+<p id='t112' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t113' class='pln'><span class='str'> chunk2</span><span class='strut'> </span></p>
+<p id='t114' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t115' class='pln'><span class='str'> between chunks</span><span class='strut'> </span></p>
+<p id='t116' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t117' class='pln'><span class='str'> cog.out("chunk3")</span><span class='strut'> </span></p>
+<p id='t118' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t119' class='pln'><span class='str'> chunk3</span><span class='strut'> </span></p>
+<p id='t120' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t121' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t122' class='pln'><span class='strut'> </span></p>
+<p id='t123' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t124' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t125' class='pln'><span class='strut'> </span></p>
+<p id='t126' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testTrimBlankLines</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t127' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t128' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t129' class='pln'><span class='str'> cog.out("This is line one\\n", trimblanklines=True)</span><span class='strut'> </span></p>
+<p id='t130' class='pln'><span class='str'> cog.out('''</span><span class='strut'> </span></p>
+<p id='t131' class='pln'><span class='str'> This is line two</span><span class='strut'> </span></p>
+<p id='t132' class='pln'><span class='str'> ''', dedent=True, trimblanklines=True)</span><span class='strut'> </span></p>
+<p id='t133' class='pln'><span class='str'> cog.outl("This is line three", trimblanklines=True)</span><span class='strut'> </span></p>
+<p id='t134' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t135' class='pln'><span class='str'> This is line one</span><span class='strut'> </span></p>
+<p id='t136' class='pln'><span class='str'> This is line two</span><span class='strut'> </span></p>
+<p id='t137' class='pln'><span class='str'> This is line three</span><span class='strut'> </span></p>
+<p id='t138' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t139' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t140' class='pln'><span class='strut'> </span></p>
+<p id='t141' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t142' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t143' class='pln'><span class='strut'> </span></p>
+<p id='t144' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testTrimEmptyBlankLines</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t145' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t146' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t147' class='pln'><span class='str'> cog.out("This is line one\\n", trimblanklines=True)</span><span class='strut'> </span></p>
+<p id='t148' class='pln'><span class='str'> cog.out('''</span><span class='strut'> </span></p>
+<p id='t149' class='pln'><span class='str'> This is line two</span><span class='strut'> </span></p>
+<p id='t150' class='pln'><span class='str'> ''', dedent=True, trimblanklines=True)</span><span class='strut'> </span></p>
+<p id='t151' class='pln'><span class='str'> cog.out('', dedent=True, trimblanklines=True)</span><span class='strut'> </span></p>
+<p id='t152' class='pln'><span class='str'> cog.outl("This is line three", trimblanklines=True)</span><span class='strut'> </span></p>
+<p id='t153' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t154' class='pln'><span class='str'> This is line one</span><span class='strut'> </span></p>
+<p id='t155' class='pln'><span class='str'> This is line two</span><span class='strut'> </span></p>
+<p id='t156' class='pln'><span class='str'> This is line three</span><span class='strut'> </span></p>
+<p id='t157' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t158' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t159' class='pln'><span class='strut'> </span></p>
+<p id='t160' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t161' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t162' class='pln'><span class='strut'> </span></p>
+<p id='t163' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>test22EndOfLine</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t164' class='pln'> <span class='com'># In Python 2.2, this cog file was not parsing because the</span><span class='strut'> </span></p>
+<p id='t165' class='pln'> <span class='com'># last line is indented but didn't end with a newline.</span><span class='strut'> </span></p>
+<p id='t166' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t167' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t168' class='pln'><span class='str'> import cog</span><span class='strut'> </span></p>
+<p id='t169' class='pln'><span class='str'> for i in range(3):</span><span class='strut'> </span></p>
+<p id='t170' class='pln'><span class='str'> cog.out("%d\\n" % i)</span><span class='strut'> </span></p>
+<p id='t171' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t172' class='pln'><span class='str'> 0</span><span class='strut'> </span></p>
+<p id='t173' class='pln'><span class='str'> 1</span><span class='strut'> </span></p>
+<p id='t174' class='pln'><span class='str'> 2</span><span class='strut'> </span></p>
+<p id='t175' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t176' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t177' class='pln'><span class='strut'> </span></p>
+<p id='t178' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t179' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t180' class='pln'><span class='strut'> </span></p>
+<p id='t181' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testIndentedCode</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t182' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t183' class='pln'><span class='str'> first line</span><span class='strut'> </span></p>
+<p id='t184' class='pln'><span class='str'> [[[cog</span><span class='strut'> </span></p>
+<p id='t185' class='pln'><span class='str'> import cog</span><span class='strut'> </span></p>
+<p id='t186' class='pln'><span class='str'> for i in range(3):</span><span class='strut'> </span></p>
+<p id='t187' class='pln'><span class='str'> cog.out("xx%d\\n" % i)</span><span class='strut'> </span></p>
+<p id='t188' class='pln'><span class='str'> ]]]</span><span class='strut'> </span></p>
+<p id='t189' class='pln'><span class='str'> xx0</span><span class='strut'> </span></p>
+<p id='t190' class='pln'><span class='str'> xx1</span><span class='strut'> </span></p>
+<p id='t191' class='pln'><span class='str'> xx2</span><span class='strut'> </span></p>
+<p id='t192' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p>
+<p id='t193' class='pln'><span class='str'> last line</span><span class='strut'> </span></p>
+<p id='t194' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t195' class='pln'><span class='strut'> </span></p>
+<p id='t196' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t197' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t198' class='pln'><span class='strut'> </span></p>
+<p id='t199' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testPrefixedCode</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t200' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t201' class='pln'><span class='str'> --[[[cog</span><span class='strut'> </span></p>
+<p id='t202' class='pln'><span class='str'> --import cog</span><span class='strut'> </span></p>
+<p id='t203' class='pln'><span class='str'> --for i in range(3):</span><span class='strut'> </span></p>
+<p id='t204' class='pln'><span class='str'> -- cog.out("xx%d\\n" % i)</span><span class='strut'> </span></p>
+<p id='t205' class='pln'><span class='str'> --]]]</span><span class='strut'> </span></p>
+<p id='t206' class='pln'><span class='str'> xx0</span><span class='strut'> </span></p>
+<p id='t207' class='pln'><span class='str'> xx1</span><span class='strut'> </span></p>
+<p id='t208' class='pln'><span class='str'> xx2</span><span class='strut'> </span></p>
+<p id='t209' class='pln'><span class='str'> --[[[end]]]</span><span class='strut'> </span></p>
+<p id='t210' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t211' class='pln'><span class='strut'> </span></p>
+<p id='t212' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t213' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t214' class='pln'><span class='strut'> </span></p>
+<p id='t215' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testPrefixedIndentedCode</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t216' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t217' class='pln'><span class='str'> prologue</span><span class='strut'> </span></p>
+<p id='t218' class='pln'><span class='str'> --[[[cog</span><span class='strut'> </span></p>
+<p id='t219' class='pln'><span class='str'> -- import cog</span><span class='strut'> </span></p>
+<p id='t220' class='pln'><span class='str'> -- for i in range(3):</span><span class='strut'> </span></p>
+<p id='t221' class='pln'><span class='str'> -- cog.out("xy%d\\n" % i)</span><span class='strut'> </span></p>
+<p id='t222' class='pln'><span class='str'> --]]]</span><span class='strut'> </span></p>
+<p id='t223' class='pln'><span class='str'> xy0</span><span class='strut'> </span></p>
+<p id='t224' class='pln'><span class='str'> xy1</span><span class='strut'> </span></p>
+<p id='t225' class='pln'><span class='str'> xy2</span><span class='strut'> </span></p>
+<p id='t226' class='pln'><span class='str'> --[[[end]]]</span><span class='strut'> </span></p>
+<p id='t227' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t228' class='pln'><span class='strut'> </span></p>
+<p id='t229' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t230' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t231' class='pln'><span class='strut'> </span></p>
+<p id='t232' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testBogusPrefixMatch</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t233' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t234' class='pln'><span class='str'> prologue</span><span class='strut'> </span></p>
+<p id='t235' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p>
+<p id='t236' class='pln'><span class='str'> import cog</span><span class='strut'> </span></p>
+<p id='t237' class='pln'><span class='str'> # This comment should not be clobbered by removing the pound sign.</span><span class='strut'> </span></p>
+<p id='t238' class='pln'><span class='str'> for i in range(3):</span><span class='strut'> </span></p>
+<p id='t239' class='pln'><span class='str'> cog.out("xy%d\\n" % i)</span><span class='strut'> </span></p>
+<p id='t240' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p>
+<p id='t241' class='pln'><span class='str'> xy0</span><span class='strut'> </span></p>
+<p id='t242' class='pln'><span class='str'> xy1</span><span class='strut'> </span></p>
+<p id='t243' class='pln'><span class='str'> xy2</span><span class='strut'> </span></p>
+<p id='t244' class='pln'><span class='str'> #[[[end]]]</span><span class='strut'> </span></p>
+<p id='t245' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t246' class='pln'><span class='strut'> </span></p>
+<p id='t247' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t248' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t249' class='pln'><span class='strut'> </span></p>
+<p id='t250' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testNoFinalNewline</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t251' class='pln'> <span class='com'># If the cog'ed output has no final newline,</span><span class='strut'> </span></p>
+<p id='t252' class='pln'> <span class='com'># it shouldn't eat up the cog terminator.</span><span class='strut'> </span></p>
+<p id='t253' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t254' class='pln'><span class='str'> prologue</span><span class='strut'> </span></p>
+<p id='t255' class='pln'><span class='str'> [[[cog</span><span class='strut'> </span></p>
+<p id='t256' class='pln'><span class='str'> import cog</span><span class='strut'> </span></p>
+<p id='t257' class='pln'><span class='str'> for i in range(3):</span><span class='strut'> </span></p>
+<p id='t258' class='pln'><span class='str'> cog.out("%d" % i)</span><span class='strut'> </span></p>
+<p id='t259' class='pln'><span class='str'> ]]]</span><span class='strut'> </span></p>
+<p id='t260' class='pln'><span class='str'> 012</span><span class='strut'> </span></p>
+<p id='t261' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p>
+<p id='t262' class='pln'><span class='str'> epilogue</span><span class='strut'> </span></p>
+<p id='t263' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t264' class='pln'><span class='strut'> </span></p>
+<p id='t265' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t266' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t267' class='pln'><span class='strut'> </span></p>
+<p id='t268' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testNoOutputAtAll</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t269' class='pln'> <span class='com'># If there is absolutely no cog output, that's ok.</span><span class='strut'> </span></p>
+<p id='t270' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t271' class='pln'><span class='str'> prologue</span><span class='strut'> </span></p>
+<p id='t272' class='pln'><span class='str'> [[[cog</span><span class='strut'> </span></p>
+<p id='t273' class='pln'><span class='str'> i = 1</span><span class='strut'> </span></p>
+<p id='t274' class='pln'><span class='str'> ]]]</span><span class='strut'> </span></p>
+<p id='t275' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p>
+<p id='t276' class='pln'><span class='str'> epilogue</span><span class='strut'> </span></p>
+<p id='t277' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t278' class='pln'><span class='strut'> </span></p>
+<p id='t279' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t280' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t281' class='pln'><span class='strut'> </span></p>
+<p id='t282' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testPurelyBlankLine</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t283' class='pln'> <span class='com'># If there is a blank line in the cog code with no whitespace</span><span class='strut'> </span></p>
+<p id='t284' class='pln'> <span class='com'># prefix, that should be OK.</span><span class='strut'> </span></p>
+<p id='t285' class='pln'><span class='strut'> </span></p>
+<p id='t286' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t287' class='pln'><span class='str'> prologue</span><span class='strut'> </span></p>
+<p id='t288' class='pln'><span class='str'> [[[cog</span><span class='strut'> </span></p>
+<p id='t289' class='pln'><span class='str'> import sys</span><span class='strut'> </span></p>
+<p id='t290' class='pln'><span class='str'> cog.out("Hello")</span><span class='strut'> </span></p>
+<p id='t291' class='pln'><span class='str'> $</span><span class='strut'> </span></p>
+<p id='t292' class='pln'><span class='str'> cog.out("There")</span><span class='strut'> </span></p>
+<p id='t293' class='pln'><span class='str'> ]]]</span><span class='strut'> </span></p>
+<p id='t294' class='pln'><span class='str'> HelloThere</span><span class='strut'> </span></p>
+<p id='t295' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p>
+<p id='t296' class='pln'><span class='str'> epilogue</span><span class='strut'> </span></p>
+<p id='t297' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t298' class='pln'><span class='strut'> </span></p>
+<p id='t299' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='str'>'$'</span><span class='op'>,</span> <span class='str'>''</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t300' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t301' class='pln'><span class='strut'> </span></p>
+<p id='t302' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testEmptyOutl</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t303' class='pln'> <span class='com'># Alexander Belchenko suggested the string argument to outl should</span><span class='strut'> </span></p>
+<p id='t304' class='pln'> <span class='com'># be optional. Does it work?</span><span class='strut'> </span></p>
+<p id='t305' class='pln'><span class='strut'> </span></p>
+<p id='t306' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t307' class='pln'><span class='str'> prologue</span><span class='strut'> </span></p>
+<p id='t308' class='pln'><span class='str'> [[[cog</span><span class='strut'> </span></p>
+<p id='t309' class='pln'><span class='str'> cog.outl("x")</span><span class='strut'> </span></p>
+<p id='t310' class='pln'><span class='str'> cog.outl()</span><span class='strut'> </span></p>
+<p id='t311' class='pln'><span class='str'> cog.outl("y")</span><span class='strut'> </span></p>
+<p id='t312' class='pln'><span class='str'> cog.outl(trimblanklines=True)</span><span class='strut'> </span></p>
+<p id='t313' class='pln'><span class='str'> cog.outl("z")</span><span class='strut'> </span></p>
+<p id='t314' class='pln'><span class='str'> ]]]</span><span class='strut'> </span></p>
+<p id='t315' class='pln'><span class='str'> x</span><span class='strut'> </span></p>
+<p id='t316' class='pln'><span class='strut'> </span></p>
+<p id='t317' class='pln'><span class='str'> y</span><span class='strut'> </span></p>
+<p id='t318' class='pln'><span class='str'> </span><span class='strut'> </span></p>
+<p id='t319' class='pln'><span class='str'> z</span><span class='strut'> </span></p>
+<p id='t320' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p>
+<p id='t321' class='pln'><span class='str'> epilogue</span><span class='strut'> </span></p>
+<p id='t322' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t323' class='pln'><span class='strut'> </span></p>
+<p id='t324' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t325' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t326' class='pln'><span class='strut'> </span></p>
+<p id='t327' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testFirstLineNum</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t328' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t329' class='pln'><span class='str'> fooey</span><span class='strut'> </span></p>
+<p id='t330' class='pln'><span class='str'> [[[cog</span><span class='strut'> </span></p>
+<p id='t331' class='pln'><span class='str'> cog.outl("started at line number %d" % cog.firstLineNum)</span><span class='strut'> </span></p>
+<p id='t332' class='pln'><span class='str'> ]]]</span><span class='strut'> </span></p>
+<p id='t333' class='pln'><span class='str'> started at line number 2</span><span class='strut'> </span></p>
+<p id='t334' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p>
+<p id='t335' class='pln'><span class='str'> blah blah</span><span class='strut'> </span></p>
+<p id='t336' class='pln'><span class='str'> [[[cog</span><span class='strut'> </span></p>
+<p id='t337' class='pln'><span class='str'> cog.outl("and again at line %d" % cog.firstLineNum)</span><span class='strut'> </span></p>
+<p id='t338' class='pln'><span class='str'> ]]]</span><span class='strut'> </span></p>
+<p id='t339' class='pln'><span class='str'> and again at line 8</span><span class='strut'> </span></p>
+<p id='t340' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p>
+<p id='t341' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t342' class='pln'><span class='strut'> </span></p>
+<p id='t343' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t344' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t345' class='pln'><span class='strut'> </span></p>
+<p id='t346' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testCompactOneLineCode</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t347' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t348' class='pln'><span class='str'> first line</span><span class='strut'> </span></p>
+<p id='t349' class='pln'><span class='str'> hey: [[[cog cog.outl("hello %d" % (3*3*3*3)) ]]] looky!</span><span class='strut'> </span></p>
+<p id='t350' class='pln'><span class='str'> get rid of this!</span><span class='strut'> </span></p>
+<p id='t351' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p>
+<p id='t352' class='pln'><span class='str'> last line</span><span class='strut'> </span></p>
+<p id='t353' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t354' class='pln'><span class='strut'> </span></p>
+<p id='t355' class='stm run hide_run'> <span class='nam'>outfile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t356' class='pln'><span class='str'> first line</span><span class='strut'> </span></p>
+<p id='t357' class='pln'><span class='str'> hey: [[[cog cog.outl("hello %d" % (3*3*3*3)) ]]] looky!</span><span class='strut'> </span></p>
+<p id='t358' class='pln'><span class='str'> hello 81</span><span class='strut'> </span></p>
+<p id='t359' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p>
+<p id='t360' class='pln'><span class='str'> last line</span><span class='strut'> </span></p>
+<p id='t361' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t362' class='pln'><span class='strut'> </span></p>
+<p id='t363' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t364' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>outfile</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t365' class='pln'><span class='strut'> </span></p>
+<p id='t366' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testInsideOutCompact</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t367' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t368' class='pln'><span class='str'> first line</span><span class='strut'> </span></p>
+<p id='t369' class='pln'><span class='str'> hey?: ]]] what is this? [[[cog strange!</span><span class='strut'> </span></p>
+<p id='t370' class='pln'><span class='str'> get rid of this!</span><span class='strut'> </span></p>
+<p id='t371' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p>
+<p id='t372' class='pln'><span class='str'> last line</span><span class='strut'> </span></p>
+<p id='t373' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t374' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaisesMsg</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t375' class='pln'> <span class='str'>"infile.txt(2): Cog code markers inverted"</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t376' class='pln'> <span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t377' class='pln'> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>"infile.txt"</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t378' class='pln'><span class='strut'> </span></p>
+<p id='t379' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testSharingGlobals</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t380' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t381' class='pln'><span class='str'> first line</span><span class='strut'> </span></p>
+<p id='t382' class='pln'><span class='str'> hey: [[[cog s="hey there" ]]] looky!</span><span class='strut'> </span></p>
+<p id='t383' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p>
+<p id='t384' class='pln'><span class='str'> more literal junk.</span><span class='strut'> </span></p>
+<p id='t385' class='pln'><span class='str'> [[[cog cog.outl(s) ]]]</span><span class='strut'> </span></p>
+<p id='t386' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p>
+<p id='t387' class='pln'><span class='str'> last line</span><span class='strut'> </span></p>
+<p id='t388' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t389' class='pln'><span class='strut'> </span></p>
+<p id='t390' class='stm run hide_run'> <span class='nam'>outfile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t391' class='pln'><span class='str'> first line</span><span class='strut'> </span></p>
+<p id='t392' class='pln'><span class='str'> hey: [[[cog s="hey there" ]]] looky!</span><span class='strut'> </span></p>
+<p id='t393' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p>
+<p id='t394' class='pln'><span class='str'> more literal junk.</span><span class='strut'> </span></p>
+<p id='t395' class='pln'><span class='str'> [[[cog cog.outl(s) ]]]</span><span class='strut'> </span></p>
+<p id='t396' class='pln'><span class='str'> hey there</span><span class='strut'> </span></p>
+<p id='t397' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p>
+<p id='t398' class='pln'><span class='str'> last line</span><span class='strut'> </span></p>
+<p id='t399' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t400' class='pln'><span class='strut'> </span></p>
+<p id='t401' class='stm run hide_run'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t402' class='stm run hide_run'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>outfile</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t403' class='pln'><span class='strut'> </span></p>
+<p id='t404' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>CogOptionsTests</span><span class='op'>(</span><span class='nam'>TestCase</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t405' class='pln'> <span class='str'>""" Test the CogOptions class.</span><span class='strut'> </span></p>
+<p id='t406' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t407' class='pln'><span class='strut'> </span></p>
+<p id='t408' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testEquality</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t409' class='stm mis'> <span class='nam'>o</span> <span class='op'>=</span> <span class='nam'>CogOptions</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t410' class='stm mis'> <span class='nam'>p</span> <span class='op'>=</span> <span class='nam'>CogOptions</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t411' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>o</span><span class='op'>,</span> <span class='nam'>p</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t412' class='stm mis'> <span class='nam'>o</span><span class='op'>.</span><span class='nam'>parseArgs</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'-r'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t413' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertNotEqual</span><span class='op'>(</span><span class='nam'>o</span><span class='op'>,</span> <span class='nam'>p</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t414' class='stm mis'> <span class='nam'>p</span><span class='op'>.</span><span class='nam'>parseArgs</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'-r'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t415' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>o</span><span class='op'>,</span> <span class='nam'>p</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t416' class='pln'><span class='strut'> </span></p>
+<p id='t417' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testCloning</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t418' class='stm mis'> <span class='nam'>o</span> <span class='op'>=</span> <span class='nam'>CogOptions</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t419' class='stm mis'> <span class='nam'>o</span><span class='op'>.</span><span class='nam'>parseArgs</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'fooey'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'booey'</span><span class='op'>,</span> <span class='str'>'-s'</span><span class='op'>,</span> <span class='str'>' /*x*/'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t420' class='stm mis'> <span class='nam'>p</span> <span class='op'>=</span> <span class='nam'>o</span><span class='op'>.</span><span class='nam'>clone</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t421' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>o</span><span class='op'>,</span> <span class='nam'>p</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t422' class='stm mis'> <span class='nam'>p</span><span class='op'>.</span><span class='nam'>parseArgs</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'huey'</span><span class='op'>,</span> <span class='str'>'-D'</span><span class='op'>,</span> <span class='str'>'foo=quux'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t423' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertNotEqual</span><span class='op'>(</span><span class='nam'>o</span><span class='op'>,</span> <span class='nam'>p</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t424' class='stm mis'> <span class='nam'>q</span> <span class='op'>=</span> <span class='nam'>CogOptions</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t425' class='stm mis'> <span class='nam'>q</span><span class='op'>.</span><span class='nam'>parseArgs</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'fooey'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'booey'</span><span class='op'>,</span> <span class='str'>'-s'</span><span class='op'>,</span> <span class='str'>' /*x*/'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'huey'</span><span class='op'>,</span> <span class='str'>'-D'</span><span class='op'>,</span> <span class='str'>'foo=quux'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t426' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>p</span><span class='op'>,</span> <span class='nam'>q</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t427' class='pln'><span class='strut'> </span></p>
+<p id='t428' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testCombiningFlags</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t429' class='pln'> <span class='com'># Single-character flags can be combined.</span><span class='strut'> </span></p>
+<p id='t430' class='stm mis'> <span class='nam'>o</span> <span class='op'>=</span> <span class='nam'>CogOptions</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t431' class='stm mis'> <span class='nam'>o</span><span class='op'>.</span><span class='nam'>parseArgs</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'-e'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-z'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t432' class='stm mis'> <span class='nam'>p</span> <span class='op'>=</span> <span class='nam'>CogOptions</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t433' class='stm mis'> <span class='nam'>p</span><span class='op'>.</span><span class='nam'>parseArgs</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'-erz'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t434' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>o</span><span class='op'>,</span> <span class='nam'>p</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t435' class='pln'><span class='strut'> </span></p>
+<p id='t436' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>FileStructureTests</span><span class='op'>(</span><span class='nam'>TestCase</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t437' class='pln'> <span class='str'>""" Test cases to check that we're properly strict about the structure</span><span class='strut'> </span></p>
+<p id='t438' class='pln'><span class='str'> of files.</span><span class='strut'> </span></p>
+<p id='t439' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t440' class='pln'><span class='strut'> </span></p>
+<p id='t441' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>isBad</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t442' class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t443' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaisesMsg</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t444' class='pln'> <span class='nam'>msg</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t445' class='pln'> <span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>,</span> <span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'infile.txt'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t446' class='pln'><span class='strut'> </span></p>
+<p id='t447' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testBeginNoEnd</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t448' class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t449' class='pln'><span class='str'> Fooey</span><span class='strut'> </span></p>
+<p id='t450' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p>
+<p id='t451' class='pln'><span class='str'> cog.outl('hello')</span><span class='strut'> </span></p>
+<p id='t452' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t453' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBad</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>,</span> <span class='str'>"infile.txt(2): Cog block begun but never ended."</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t454' class='pln'><span class='strut'> </span></p>
+<p id='t455' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testNoEoo</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t456' class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t457' class='pln'><span class='str'> Fooey</span><span class='strut'> </span></p>
+<p id='t458' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p>
+<p id='t459' class='pln'><span class='str'> cog.outl('hello')</span><span class='strut'> </span></p>
+<p id='t460' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p>
+<p id='t461' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t462' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBad</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>,</span> <span class='str'>"infile.txt(4): Missing '[[[end]]]' before end of file."</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t463' class='pln'><span class='strut'> </span></p>
+<p id='t464' class='stm mis'> <span class='nam'>infile2</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t465' class='pln'><span class='str'> Fooey</span><span class='strut'> </span></p>
+<p id='t466' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p>
+<p id='t467' class='pln'><span class='str'> cog.outl('hello')</span><span class='strut'> </span></p>
+<p id='t468' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p>
+<p id='t469' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p>
+<p id='t470' class='pln'><span class='str'> cog.outl('goodbye')</span><span class='strut'> </span></p>
+<p id='t471' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p>
+<p id='t472' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t473' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBad</span><span class='op'>(</span><span class='nam'>infile2</span><span class='op'>,</span> <span class='str'>"infile.txt(5): Unexpected '[[[cog'"</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t474' class='pln'><span class='strut'> </span></p>
+<p id='t475' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testStartWithEnd</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t476' class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t477' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p>
+<p id='t478' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t479' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBad</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>,</span> <span class='str'>"infile.txt(1): Unexpected ']]]'"</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t480' class='pln'><span class='strut'> </span></p>
+<p id='t481' class='stm mis'> <span class='nam'>infile2</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t482' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p>
+<p id='t483' class='pln'><span class='str'> cog.outl('hello')</span><span class='strut'> </span></p>
+<p id='t484' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p>
+<p id='t485' class='pln'><span class='str'> #[[[end]]] </span><span class='strut'> </span></p>
+<p id='t486' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p>
+<p id='t487' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t488' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBad</span><span class='op'>(</span><span class='nam'>infile2</span><span class='op'>,</span> <span class='str'>"infile.txt(5): Unexpected ']]]'"</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t489' class='pln'><span class='strut'> </span></p>
+<p id='t490' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testStartWithEoo</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t491' class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t492' class='pln'><span class='str'> #[[[end]]]</span><span class='strut'> </span></p>
+<p id='t493' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t494' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBad</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>,</span> <span class='str'>"infile.txt(1): Unexpected '[[[end]]]'"</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t495' class='pln'><span class='strut'> </span></p>
+<p id='t496' class='stm mis'> <span class='nam'>infile2</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t497' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p>
+<p id='t498' class='pln'><span class='str'> cog.outl('hello')</span><span class='strut'> </span></p>
+<p id='t499' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p>
+<p id='t500' class='pln'><span class='str'> #[[[end]]]</span><span class='strut'> </span></p>
+<p id='t501' class='pln'><span class='str'> #[[[end]]]</span><span class='strut'> </span></p>
+<p id='t502' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t503' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBad</span><span class='op'>(</span><span class='nam'>infile2</span><span class='op'>,</span> <span class='str'>"infile.txt(5): Unexpected '[[[end]]]'"</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t504' class='pln'><span class='strut'> </span></p>
+<p id='t505' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testNoEnd</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t506' class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t507' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p>
+<p id='t508' class='pln'><span class='str'> cog.outl("hello")</span><span class='strut'> </span></p>
+<p id='t509' class='pln'><span class='str'> #[[[end]]]</span><span class='strut'> </span></p>
+<p id='t510' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t511' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBad</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>,</span> <span class='str'>"infile.txt(3): Unexpected '[[[end]]]'"</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t512' class='pln'><span class='strut'> </span></p>
+<p id='t513' class='stm mis'> <span class='nam'>infile2</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t514' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p>
+<p id='t515' class='pln'><span class='str'> cog.outl('hello')</span><span class='strut'> </span></p>
+<p id='t516' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p>
+<p id='t517' class='pln'><span class='str'> #[[[end]]]</span><span class='strut'> </span></p>
+<p id='t518' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p>
+<p id='t519' class='pln'><span class='str'> cog.outl("hello")</span><span class='strut'> </span></p>
+<p id='t520' class='pln'><span class='str'> #[[[end]]]</span><span class='strut'> </span></p>
+<p id='t521' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t522' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBad</span><span class='op'>(</span><span class='nam'>infile2</span><span class='op'>,</span> <span class='str'>"infile.txt(7): Unexpected '[[[end]]]'"</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t523' class='pln'><span class='strut'> </span></p>
+<p id='t524' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testTwoBegins</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t525' class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t526' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p>
+<p id='t527' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p>
+<p id='t528' class='pln'><span class='str'> cog.outl("hello")</span><span class='strut'> </span></p>
+<p id='t529' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p>
+<p id='t530' class='pln'><span class='str'> #[[[end]]]</span><span class='strut'> </span></p>
+<p id='t531' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t532' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBad</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>,</span> <span class='str'>"infile.txt(2): Unexpected '[[[cog'"</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t533' class='pln'><span class='strut'> </span></p>
+<p id='t534' class='stm mis'> <span class='nam'>infile2</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t535' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p>
+<p id='t536' class='pln'><span class='str'> cog.outl("hello")</span><span class='strut'> </span></p>
+<p id='t537' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p>
+<p id='t538' class='pln'><span class='str'> #[[[end]]]</span><span class='strut'> </span></p>
+<p id='t539' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p>
+<p id='t540' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p>
+<p id='t541' class='pln'><span class='str'> cog.outl("hello")</span><span class='strut'> </span></p>
+<p id='t542' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p>
+<p id='t543' class='pln'><span class='str'> #[[[end]]]</span><span class='strut'> </span></p>
+<p id='t544' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t545' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBad</span><span class='op'>(</span><span class='nam'>infile2</span><span class='op'>,</span> <span class='str'>"infile.txt(6): Unexpected '[[[cog'"</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t546' class='pln'><span class='strut'> </span></p>
+<p id='t547' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testTwoEnds</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t548' class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t549' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p>
+<p id='t550' class='pln'><span class='str'> cog.outl("hello")</span><span class='strut'> </span></p>
+<p id='t551' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p>
+<p id='t552' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p>
+<p id='t553' class='pln'><span class='str'> #[[[end]]]</span><span class='strut'> </span></p>
+<p id='t554' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t555' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBad</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>,</span> <span class='str'>"infile.txt(4): Unexpected ']]]'"</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t556' class='pln'><span class='strut'> </span></p>
+<p id='t557' class='stm mis'> <span class='nam'>infile2</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t558' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p>
+<p id='t559' class='pln'><span class='str'> cog.outl("hello")</span><span class='strut'> </span></p>
+<p id='t560' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p>
+<p id='t561' class='pln'><span class='str'> #[[[end]]]</span><span class='strut'> </span></p>
+<p id='t562' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p>
+<p id='t563' class='pln'><span class='str'> cog.outl("hello")</span><span class='strut'> </span></p>
+<p id='t564' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p>
+<p id='t565' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p>
+<p id='t566' class='pln'><span class='str'> #[[[end]]]</span><span class='strut'> </span></p>
+<p id='t567' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t568' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBad</span><span class='op'>(</span><span class='nam'>infile2</span><span class='op'>,</span> <span class='str'>"infile.txt(8): Unexpected ']]]'"</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t569' class='pln'><span class='strut'> </span></p>
+<p id='t570' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>CogErrorTests</span><span class='op'>(</span><span class='nam'>TestCase</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t571' class='pln'> <span class='str'>""" Test cases for cog.error().</span><span class='strut'> </span></p>
+<p id='t572' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t573' class='pln'><span class='strut'> </span></p>
+<p id='t574' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testErrorMsg</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t575' class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t576' class='pln'><span class='str'> [[[cog cog.error("This ain't right!")]]]</span><span class='strut'> </span></p>
+<p id='t577' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p>
+<p id='t578' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t579' class='pln'><span class='strut'> </span></p>
+<p id='t580' class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t581' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaisesMsg</span><span class='op'>(</span><span class='nam'>CogGeneratedError</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t582' class='pln'> <span class='str'>"This ain't right!"</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t583' class='pln'> <span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>,</span> <span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t584' class='pln'><span class='strut'> </span></p>
+<p id='t585' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testErrorNoMsg</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t586' class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t587' class='pln'><span class='str'> [[[cog cog.error()]]]</span><span class='strut'> </span></p>
+<p id='t588' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p>
+<p id='t589' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t590' class='pln'><span class='strut'> </span></p>
+<p id='t591' class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t592' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaisesMsg</span><span class='op'>(</span><span class='nam'>CogGeneratedError</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t593' class='pln'> <span class='str'>"Error raised by cog generator."</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t594' class='pln'> <span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>,</span> <span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t595' class='pln'><span class='strut'> </span></p>
+<p id='t596' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testNoErrorIfErrorNotCalled</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t597' class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t598' class='pln'><span class='str'> --[[[cog</span><span class='strut'> </span></p>
+<p id='t599' class='pln'><span class='str'> --import cog</span><span class='strut'> </span></p>
+<p id='t600' class='pln'><span class='str'> --for i in range(3):</span><span class='strut'> </span></p>
+<p id='t601' class='pln'><span class='str'> -- if i > 10:</span><span class='strut'> </span></p>
+<p id='t602' class='pln'><span class='str'> -- cog.error("Something is amiss!")</span><span class='strut'> </span></p>
+<p id='t603' class='pln'><span class='str'> -- cog.out("xx%d\\n" % i)</span><span class='strut'> </span></p>
+<p id='t604' class='pln'><span class='str'> --]]]</span><span class='strut'> </span></p>
+<p id='t605' class='pln'><span class='str'> xx0</span><span class='strut'> </span></p>
+<p id='t606' class='pln'><span class='str'> xx1</span><span class='strut'> </span></p>
+<p id='t607' class='pln'><span class='str'> xx2</span><span class='strut'> </span></p>
+<p id='t608' class='pln'><span class='str'> --[[[end]]]</span><span class='strut'> </span></p>
+<p id='t609' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t610' class='pln'><span class='strut'> </span></p>
+<p id='t611' class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t612' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t613' class='pln'><span class='strut'> </span></p>
+<p id='t614' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>CogGeneratorGetCodeTests</span><span class='op'>(</span><span class='nam'>TestCase</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t615' class='pln'> <span class='str'>""" Unit tests against CogGenerator to see if its getCode() method works</span><span class='strut'> </span></p>
+<p id='t616' class='pln'><span class='str'> properly.</span><span class='strut'> </span></p>
+<p id='t617' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t618' class='pln'><span class='strut'> </span></p>
+<p id='t619' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>setUp</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t620' class='pln'> <span class='str'>""" All tests get a generator to use, and short same-length names for</span><span class='strut'> </span></p>
+<p id='t621' class='pln'><span class='str'> the functions we're going to use.</span><span class='strut'> </span></p>
+<p id='t622' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t623' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>gen</span> <span class='op'>=</span> <span class='nam'>CogGenerator</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t624' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>gen</span><span class='op'>.</span><span class='nam'>parseMarker</span><span class='strut'> </span></p>
+<p id='t625' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>gen</span><span class='op'>.</span><span class='nam'>parseLine</span><span class='strut'> </span></p>
+<p id='t626' class='pln'><span class='strut'> </span></p>
+<p id='t627' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testEmpty</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t628' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span><span class='op'>(</span><span class='str'>'// [[[cog'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t629' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span><span class='op'>(</span><span class='str'>'// ]]]'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t630' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>gen</span><span class='op'>.</span><span class='nam'>getCode</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>''</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t631' class='pln'><span class='strut'> </span></p>
+<p id='t632' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testSimple</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t633' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span><span class='op'>(</span><span class='str'>'// [[[cog'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t634' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>l</span><span class='op'>(</span><span class='str'>' print "hello"'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t635' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>l</span><span class='op'>(</span><span class='str'>' print "bye"'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t636' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span><span class='op'>(</span><span class='str'>'// ]]]'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t637' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>gen</span><span class='op'>.</span><span class='nam'>getCode</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'print "hello"\nprint "bye"'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t638' class='pln'><span class='strut'> </span></p>
+<p id='t639' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testCompressed1</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t640' class='pln'> <span class='com'># For a while, I supported compressed code blocks, but no longer.</span><span class='strut'> </span></p>
+<p id='t641' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span><span class='op'>(</span><span class='str'>'// [[[cog: print """'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t642' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>l</span><span class='op'>(</span><span class='str'>'// hello'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t643' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>l</span><span class='op'>(</span><span class='str'>'// bye'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t644' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span><span class='op'>(</span><span class='str'>'// """)]]]'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t645' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>gen</span><span class='op'>.</span><span class='nam'>getCode</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'hello\nbye'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t646' class='pln'><span class='strut'> </span></p>
+<p id='t647' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testCompressed2</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t648' class='pln'> <span class='com'># For a while, I supported compressed code blocks, but no longer.</span><span class='strut'> </span></p>
+<p id='t649' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span><span class='op'>(</span><span class='str'>'// [[[cog: print """'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t650' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>l</span><span class='op'>(</span><span class='str'>'hello'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t651' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>l</span><span class='op'>(</span><span class='str'>'bye'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t652' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span><span class='op'>(</span><span class='str'>'// """)]]]'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t653' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>gen</span><span class='op'>.</span><span class='nam'>getCode</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'hello\nbye'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t654' class='pln'><span class='strut'> </span></p>
+<p id='t655' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testCompressed3</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t656' class='pln'> <span class='com'># For a while, I supported compressed code blocks, but no longer.</span><span class='strut'> </span></p>
+<p id='t657' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span><span class='op'>(</span><span class='str'>'// [[[cog'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t658' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>l</span><span class='op'>(</span><span class='str'>'print """hello'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t659' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>l</span><span class='op'>(</span><span class='str'>'bye'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t660' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span><span class='op'>(</span><span class='str'>'// """)]]]'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t661' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>gen</span><span class='op'>.</span><span class='nam'>getCode</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'print """hello\nbye'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t662' class='pln'><span class='strut'> </span></p>
+<p id='t663' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testCompressed4</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t664' class='pln'> <span class='com'># For a while, I supported compressed code blocks, but no longer.</span><span class='strut'> </span></p>
+<p id='t665' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span><span class='op'>(</span><span class='str'>'// [[[cog: print """'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t666' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>l</span><span class='op'>(</span><span class='str'>'hello'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t667' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>l</span><span class='op'>(</span><span class='str'>'bye""")'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t668' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span><span class='op'>(</span><span class='str'>'// ]]]'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t669' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>gen</span><span class='op'>.</span><span class='nam'>getCode</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'hello\nbye""")'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t670' class='pln'><span class='strut'> </span></p>
+<p id='t671' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testNoCommonPrefixForMarkers</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t672' class='pln'> <span class='com'># It's important to be able to use #if 0 to hide lines from a</span><span class='strut'> </span></p>
+<p id='t673' class='pln'> <span class='com'># C++ compiler.</span><span class='strut'> </span></p>
+<p id='t674' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span><span class='op'>(</span><span class='str'>'#if 0 //[[[cog'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t675' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>l</span><span class='op'>(</span><span class='str'>'\timport cog, sys'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t676' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>l</span><span class='op'>(</span><span class='str'>''</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t677' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>l</span><span class='op'>(</span><span class='str'>'\tprint sys.argv'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t678' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>m</span><span class='op'>(</span><span class='str'>'#endif //]]]'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t679' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>gen</span><span class='op'>.</span><span class='nam'>getCode</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'import cog, sys\n\nprint sys.argv'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t680' class='pln'><span class='strut'> </span></p>
+<p id='t681' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>TestCaseWithTempDir</span><span class='op'>(</span><span class='nam'>TestCase</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t682' class='pln'><span class='strut'> </span></p>
+<p id='t683' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>newCog</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t684' class='pln'> <span class='str'>""" Initialize the cog members for another run.</span><span class='strut'> </span></p>
+<p id='t685' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t686' class='pln'> <span class='com'># Create a cog engine, and catch its output.</span><span class='strut'> </span></p>
+<p id='t687' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span> <span class='op'>=</span> <span class='nam'>Cog</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t688' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>StringIO</span><span class='op'>.</span><span class='nam'>StringIO</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t689' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>setOutput</span><span class='op'>(</span><span class='nam'>stdout</span><span class='op'>=</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>,</span> <span class='nam'>stderr</span><span class='op'>=</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t690' class='pln'><span class='strut'> </span></p>
+<p id='t691' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>setUp</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t692' class='pln'> <span class='com'># Create a temporary directory.</span><span class='strut'> </span></p>
+<p id='t693' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>tempdir</span> <span class='op'>=</span> <span class='nam'>path</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>(</span><span class='nam'>tempfile</span><span class='op'>.</span><span class='nam'>gettempdir</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span> <span class='op'>/</span> <span class='op'>(</span><span class='str'>'testcog_tempdir_'</span> <span class='op'>+</span> <span class='nam'>str</span><span class='op'>(</span><span class='nam'>random</span><span class='op'>.</span><span class='nam'>random</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='op'>[</span><span class='num'>2</span><span class='op'>:</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t694' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>tempdir</span><span class='op'>.</span><span class='nam'>mkdir</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t695' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>olddir</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>getcwd</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t696' class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>chdir</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>tempdir</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t697' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t698' class='pln'><span class='strut'> </span></p>
+<p id='t699' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>tearDown</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t700' class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>chdir</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>olddir</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t701' class='pln'> <span class='com'># Get rid of the temporary directory.</span><span class='strut'> </span></p>
+<p id='t702' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>tempdir</span><span class='op'>.</span><span class='nam'>rmtree</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t703' class='pln'><span class='strut'> </span></p>
+<p id='t704' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>sFName1</span><span class='op'>,</span> <span class='nam'>sFName2</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t705' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>tempdir</span> <span class='op'>/</span> <span class='nam'>sFName1</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>text</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>tempdir</span> <span class='op'>/</span> <span class='nam'>sFName2</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>text</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t706' class='pln'><span class='strut'> </span></p>
+<p id='t707' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>assertFileContent</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>sFName</span><span class='op'>,</span> <span class='nam'>sContent</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t708' class='stm mis'> <span class='nam'>sAbsName</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>tempdir</span> <span class='op'>/</span> <span class='nam'>sFName</span><span class='strut'> </span></p>
+<p id='t709' class='stm mis'> <span class='nam'>f</span> <span class='op'>=</span> <span class='nam'>open</span><span class='op'>(</span><span class='nam'>sAbsName</span><span class='op'>,</span> <span class='str'>'rb'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t710' class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t711' class='stm mis'> <span class='nam'>sFileContent</span> <span class='op'>=</span> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t712' class='pln'> <span class='key'>finally</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t713' class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t714' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>sFileContent</span><span class='op'>,</span> <span class='nam'>sContent</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t715' class='pln'><span class='strut'> </span></p>
+<p id='t716' class='pln'><span class='strut'> </span></p>
+<p id='t717' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>ArgumentHandlingTests</span><span class='op'>(</span><span class='nam'>TestCaseWithTempDir</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t718' class='pln'><span class='strut'> </span></p>
+<p id='t719' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testArgumentFailure</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t720' class='pln'> <span class='com'># Return value 2 means usage problem.</span><span class='strut'> </span></p>
+<p id='t721' class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>main</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-j'</span><span class='op'>]</span><span class='op'>)</span> <span class='op'>==</span> <span class='num'>2</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t722' class='stm mis'> <span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t723' class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='str'>"option -j not recognized"</span><span class='op'>)</span> <span class='op'>>=</span> <span class='num'>0</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t724' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaises</span><span class='op'>(</span><span class='nam'>CogUsageError</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t725' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaises</span><span class='op'>(</span><span class='nam'>CogUsageError</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-j'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t726' class='pln'><span class='strut'> </span></p>
+<p id='t727' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testNoDashOAndAtFile</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t728' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t729' class='pln'> <span class='str'>'cogfiles.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t730' class='pln'><span class='str'> # Please run cog</span><span class='strut'> </span></p>
+<p id='t731' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t732' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t733' class='pln'><span class='strut'> </span></p>
+<p id='t734' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t735' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaises</span><span class='op'>(</span><span class='nam'>CogUsageError</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-o'</span><span class='op'>,</span> <span class='str'>'foo'</span><span class='op'>,</span> <span class='str'>'@cogfiles.txt'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t736' class='pln'><span class='strut'> </span></p>
+<p id='t737' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testDashV</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t738' class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>main</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-v'</span><span class='op'>]</span><span class='op'>)</span> <span class='op'>==</span> <span class='num'>0</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t739' class='stm mis'> <span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t740' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='str'>'Cog version %s\n'</span> <span class='op'>%</span> <span class='nam'>__version__</span><span class='op'>,</span> <span class='nam'>output</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t741' class='pln'><span class='strut'> </span></p>
+<p id='t742' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>producesHelp</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>args</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t743' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t744' class='stm mis'> <span class='nam'>argv</span> <span class='op'>=</span> <span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>]</span> <span class='op'>+</span> <span class='nam'>args</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t745' class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>main</span><span class='op'>(</span><span class='nam'>argv</span><span class='op'>)</span> <span class='op'>==</span> <span class='num'>0</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t746' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEquals</span><span class='op'>(</span><span class='nam'>usage</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t747' class='pln'><span class='strut'> </span></p>
+<p id='t748' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testDashH</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t749' class='pln'> <span class='com'># -h or -? anywhere on the command line should just print help.</span><span class='strut'> </span></p>
+<p id='t750' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>producesHelp</span><span class='op'>(</span><span class='str'>"-h"</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t751' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>producesHelp</span><span class='op'>(</span><span class='str'>"-?"</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t752' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>producesHelp</span><span class='op'>(</span><span class='str'>"fooey.txt -h"</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t753' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>producesHelp</span><span class='op'>(</span><span class='str'>"-o -r @fooey.txt -? @booey.txt"</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t754' class='pln'><span class='strut'> </span></p>
+<p id='t755' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testDashOAndDashR</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t756' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t757' class='pln'> <span class='str'>'cogfile.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t758' class='pln'><span class='str'> # Please run cog</span><span class='strut'> </span></p>
+<p id='t759' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t760' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t761' class='pln'><span class='strut'> </span></p>
+<p id='t762' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t763' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaises</span><span class='op'>(</span><span class='nam'>CogUsageError</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-o'</span><span class='op'>,</span> <span class='str'>'foo'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'cogfile.txt'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t764' class='pln'><span class='strut'> </span></p>
+<p id='t765' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testDashZ</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t766' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t767' class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t768' class='pln'><span class='str'> // This is my C++ file.</span><span class='strut'> </span></p>
+<p id='t769' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t770' class='pln'><span class='str'> fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing']</span><span class='strut'> </span></p>
+<p id='t771' class='pln'><span class='str'> for fn in fnames:</span><span class='strut'> </span></p>
+<p id='t772' class='pln'><span class='str'> cog.outl("void %s();" % fn)</span><span class='strut'> </span></p>
+<p id='t773' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t774' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t775' class='pln'><span class='strut'> </span></p>
+<p id='t776' class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t777' class='pln'><span class='str'> // This is my C++ file.</span><span class='strut'> </span></p>
+<p id='t778' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t779' class='pln'><span class='str'> fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing']</span><span class='strut'> </span></p>
+<p id='t780' class='pln'><span class='str'> for fn in fnames:</span><span class='strut'> </span></p>
+<p id='t781' class='pln'><span class='str'> cog.outl("void %s();" % fn)</span><span class='strut'> </span></p>
+<p id='t782' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t783' class='pln'><span class='str'> void DoSomething();</span><span class='strut'> </span></p>
+<p id='t784' class='pln'><span class='str'> void DoAnotherThing();</span><span class='strut'> </span></p>
+<p id='t785' class='pln'><span class='str'> void DoLastThing();</span><span class='strut'> </span></p>
+<p id='t786' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t787' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t788' class='pln'><span class='strut'> </span></p>
+<p id='t789' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t790' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaisesMsg</span><span class='op'>(</span><span class='strut'> </span></p>
+<p id='t791' class='pln'> <span class='nam'>CogError</span><span class='op'>,</span> <span class='str'>"test.cog(6): Missing '[[[end]]]' before end of file."</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t792' class='pln'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t793' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t794' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-z'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t795' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t796' class='pln'><span class='strut'> </span></p>
+<p id='t797' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testBadDashD</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t798' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaises</span><span class='op'>(</span><span class='nam'>CogUsageError</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-Dfooey'</span><span class='op'>,</span> <span class='str'>'cog.txt'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t799' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaises</span><span class='op'>(</span><span class='nam'>CogUsageError</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-D'</span><span class='op'>,</span> <span class='str'>'fooey'</span><span class='op'>,</span> <span class='str'>'cog.txt'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t800' class='pln'><span class='strut'> </span></p>
+<p id='t801' class='pln'><span class='strut'> </span></p>
+<p id='t802' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>TestFileHandling</span><span class='op'>(</span><span class='nam'>TestCaseWithTempDir</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t803' class='pln'><span class='strut'> </span></p>
+<p id='t804' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testSimple</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t805' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t806' class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t807' class='pln'><span class='str'> // This is my C++ file.</span><span class='strut'> </span></p>
+<p id='t808' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t809' class='pln'><span class='str'> fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing']</span><span class='strut'> </span></p>
+<p id='t810' class='pln'><span class='str'> for fn in fnames:</span><span class='strut'> </span></p>
+<p id='t811' class='pln'><span class='str'> cog.outl("void %s();" % fn)</span><span class='strut'> </span></p>
+<p id='t812' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t813' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t814' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t815' class='pln'><span class='strut'> </span></p>
+<p id='t816' class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t817' class='pln'><span class='str'> // This is my C++ file.</span><span class='strut'> </span></p>
+<p id='t818' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t819' class='pln'><span class='str'> fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing']</span><span class='strut'> </span></p>
+<p id='t820' class='pln'><span class='str'> for fn in fnames:</span><span class='strut'> </span></p>
+<p id='t821' class='pln'><span class='str'> cog.outl("void %s();" % fn)</span><span class='strut'> </span></p>
+<p id='t822' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t823' class='pln'><span class='str'> void DoSomething();</span><span class='strut'> </span></p>
+<p id='t824' class='pln'><span class='str'> void DoAnotherThing();</span><span class='strut'> </span></p>
+<p id='t825' class='pln'><span class='str'> void DoLastThing();</span><span class='strut'> </span></p>
+<p id='t826' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t827' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t828' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t829' class='pln'><span class='strut'> </span></p>
+<p id='t830' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t831' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t832' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t833' class='stm mis'> <span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t834' class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='str'>"(changed)"</span><span class='op'>)</span> <span class='op'>>=</span> <span class='num'>0</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t835' class='pln'><span class='strut'> </span></p>
+<p id='t836' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testOutputFile</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t837' class='pln'> <span class='com'># -o sets the output file.</span><span class='strut'> </span></p>
+<p id='t838' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t839' class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t840' class='pln'><span class='str'> // This is my C++ file.</span><span class='strut'> </span></p>
+<p id='t841' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t842' class='pln'><span class='str'> fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing']</span><span class='strut'> </span></p>
+<p id='t843' class='pln'><span class='str'> for fn in fnames:</span><span class='strut'> </span></p>
+<p id='t844' class='pln'><span class='str'> cog.outl("void %s();" % fn)</span><span class='strut'> </span></p>
+<p id='t845' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t846' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t847' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t848' class='pln'><span class='strut'> </span></p>
+<p id='t849' class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t850' class='pln'><span class='str'> // This is my C++ file.</span><span class='strut'> </span></p>
+<p id='t851' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t852' class='pln'><span class='str'> fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing']</span><span class='strut'> </span></p>
+<p id='t853' class='pln'><span class='str'> for fn in fnames:</span><span class='strut'> </span></p>
+<p id='t854' class='pln'><span class='str'> cog.outl("void %s();" % fn)</span><span class='strut'> </span></p>
+<p id='t855' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t856' class='pln'><span class='str'> void DoSomething();</span><span class='strut'> </span></p>
+<p id='t857' class='pln'><span class='str'> void DoAnotherThing();</span><span class='strut'> </span></p>
+<p id='t858' class='pln'><span class='str'> void DoLastThing();</span><span class='strut'> </span></p>
+<p id='t859' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t860' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t861' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t862' class='pln'><span class='strut'> </span></p>
+<p id='t863' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t864' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-o'</span><span class='op'>,</span> <span class='str'>'test.cogged'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t865' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cogged'</span><span class='op'>,</span> <span class='str'>'test.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t866' class='pln'><span class='strut'> </span></p>
+<p id='t867' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testAtFile</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t868' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t869' class='pln'> <span class='str'>'one.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t870' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t871' class='pln'><span class='str'> cog.outl("hello world")</span><span class='strut'> </span></p>
+<p id='t872' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t873' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t874' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t875' class='pln'><span class='strut'> </span></p>
+<p id='t876' class='pln'> <span class='str'>'one.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t877' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t878' class='pln'><span class='str'> cog.outl("hello world")</span><span class='strut'> </span></p>
+<p id='t879' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t880' class='pln'><span class='str'> hello world</span><span class='strut'> </span></p>
+<p id='t881' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t882' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t883' class='pln'><span class='strut'> </span></p>
+<p id='t884' class='pln'> <span class='str'>'two.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t885' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t886' class='pln'><span class='str'> cog.outl("goodbye cruel world")</span><span class='strut'> </span></p>
+<p id='t887' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t888' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t889' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t890' class='pln'><span class='strut'> </span></p>
+<p id='t891' class='pln'> <span class='str'>'two.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t892' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t893' class='pln'><span class='str'> cog.outl("goodbye cruel world")</span><span class='strut'> </span></p>
+<p id='t894' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t895' class='pln'><span class='str'> goodbye cruel world</span><span class='strut'> </span></p>
+<p id='t896' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t897' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t898' class='pln'><span class='strut'> </span></p>
+<p id='t899' class='pln'> <span class='str'>'cogfiles.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t900' class='pln'><span class='str'> # Please run cog</span><span class='strut'> </span></p>
+<p id='t901' class='pln'><span class='str'> one.cog</span><span class='strut'> </span></p>
+<p id='t902' class='pln'><span class='str'> </span><span class='strut'> </span></p>
+<p id='t903' class='pln'><span class='str'> two.cog</span><span class='strut'> </span></p>
+<p id='t904' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t905' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t906' class='pln'><span class='strut'> </span></p>
+<p id='t907' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t908' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'@cogfiles.txt'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t909' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'one.cog'</span><span class='op'>,</span> <span class='str'>'one.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t910' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'two.cog'</span><span class='op'>,</span> <span class='str'>'two.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t911' class='stm mis'> <span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t912' class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='str'>"(changed)"</span><span class='op'>)</span> <span class='op'>>=</span> <span class='num'>0</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t913' class='pln'><span class='strut'> </span></p>
+<p id='t914' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testNestedAtFile</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t915' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t916' class='pln'> <span class='str'>'one.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t917' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t918' class='pln'><span class='str'> cog.outl("hello world")</span><span class='strut'> </span></p>
+<p id='t919' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t920' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t921' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t922' class='pln'><span class='strut'> </span></p>
+<p id='t923' class='pln'> <span class='str'>'one.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t924' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t925' class='pln'><span class='str'> cog.outl("hello world")</span><span class='strut'> </span></p>
+<p id='t926' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t927' class='pln'><span class='str'> hello world</span><span class='strut'> </span></p>
+<p id='t928' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t929' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t930' class='pln'><span class='strut'> </span></p>
+<p id='t931' class='pln'> <span class='str'>'two.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t932' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t933' class='pln'><span class='str'> cog.outl("goodbye cruel world")</span><span class='strut'> </span></p>
+<p id='t934' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t935' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t936' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t937' class='pln'><span class='strut'> </span></p>
+<p id='t938' class='pln'> <span class='str'>'two.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t939' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t940' class='pln'><span class='str'> cog.outl("goodbye cruel world")</span><span class='strut'> </span></p>
+<p id='t941' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t942' class='pln'><span class='str'> goodbye cruel world</span><span class='strut'> </span></p>
+<p id='t943' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t944' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t945' class='pln'><span class='strut'> </span></p>
+<p id='t946' class='pln'> <span class='str'>'cogfiles.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t947' class='pln'><span class='str'> # Please run cog</span><span class='strut'> </span></p>
+<p id='t948' class='pln'><span class='str'> one.cog</span><span class='strut'> </span></p>
+<p id='t949' class='pln'><span class='str'> @cogfiles2.txt</span><span class='strut'> </span></p>
+<p id='t950' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t951' class='pln'><span class='strut'> </span></p>
+<p id='t952' class='pln'> <span class='str'>'cogfiles2.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t953' class='pln'><span class='str'> # This one too, please.</span><span class='strut'> </span></p>
+<p id='t954' class='pln'><span class='str'> two.cog</span><span class='strut'> </span></p>
+<p id='t955' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t956' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t957' class='pln'><span class='strut'> </span></p>
+<p id='t958' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t959' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'@cogfiles.txt'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t960' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'one.cog'</span><span class='op'>,</span> <span class='str'>'one.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t961' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'two.cog'</span><span class='op'>,</span> <span class='str'>'two.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t962' class='stm mis'> <span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t963' class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='str'>"(changed)"</span><span class='op'>)</span> <span class='op'>>=</span> <span class='num'>0</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t964' class='pln'><span class='strut'> </span></p>
+<p id='t965' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testAtFileWithArgs</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t966' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t967' class='pln'> <span class='str'>'both.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t968' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t969' class='pln'><span class='str'> cog.outl("one: %s" % globals().has_key('one'))</span><span class='strut'> </span></p>
+<p id='t970' class='pln'><span class='str'> cog.outl("two: %s" % globals().has_key('two'))</span><span class='strut'> </span></p>
+<p id='t971' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t972' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t973' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t974' class='pln'><span class='strut'> </span></p>
+<p id='t975' class='pln'> <span class='str'>'one.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t976' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t977' class='pln'><span class='str'> cog.outl("one: %s" % globals().has_key('one'))</span><span class='strut'> </span></p>
+<p id='t978' class='pln'><span class='str'> cog.outl("two: %s" % globals().has_key('two'))</span><span class='strut'> </span></p>
+<p id='t979' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t980' class='pln'><span class='str'> one: True // ONE</span><span class='strut'> </span></p>
+<p id='t981' class='pln'><span class='str'> two: False // ONE</span><span class='strut'> </span></p>
+<p id='t982' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t983' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t984' class='pln'><span class='strut'> </span></p>
+<p id='t985' class='pln'> <span class='str'>'two.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t986' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t987' class='pln'><span class='str'> cog.outl("one: %s" % globals().has_key('one'))</span><span class='strut'> </span></p>
+<p id='t988' class='pln'><span class='str'> cog.outl("two: %s" % globals().has_key('two'))</span><span class='strut'> </span></p>
+<p id='t989' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t990' class='pln'><span class='str'> one: False // TWO</span><span class='strut'> </span></p>
+<p id='t991' class='pln'><span class='str'> two: True // TWO</span><span class='strut'> </span></p>
+<p id='t992' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t993' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t994' class='pln'><span class='strut'> </span></p>
+<p id='t995' class='pln'> <span class='str'>'cogfiles.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t996' class='pln'><span class='str'> # Please run cog</span><span class='strut'> </span></p>
+<p id='t997' class='pln'><span class='str'> both.cog -o both.one -s ' // ONE' -D one=x</span><span class='strut'> </span></p>
+<p id='t998' class='pln'><span class='str'> both.cog -o both.two -s ' // TWO' -D two=x</span><span class='strut'> </span></p>
+<p id='t999' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t1000' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t1001' class='pln'><span class='strut'> </span></p>
+<p id='t1002' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1003' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'@cogfiles.txt'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1004' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'both.one'</span><span class='op'>,</span> <span class='str'>'one.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1005' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'both.two'</span><span class='op'>,</span> <span class='str'>'two.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1006' class='pln'><span class='strut'> </span></p>
+<p id='t1007' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testAtFileWithBadArgCombo</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1008' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1009' class='pln'> <span class='str'>'both.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1010' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1011' class='pln'><span class='str'> cog.outl("one: %s" % globals().has_key('one'))</span><span class='strut'> </span></p>
+<p id='t1012' class='pln'><span class='str'> cog.outl("two: %s" % globals().has_key('two'))</span><span class='strut'> </span></p>
+<p id='t1013' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1014' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1015' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1016' class='pln'><span class='strut'> </span></p>
+<p id='t1017' class='pln'> <span class='str'>'cogfiles.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1018' class='pln'><span class='str'> # Please run cog</span><span class='strut'> </span></p>
+<p id='t1019' class='pln'><span class='str'> both.cog </span><span class='strut'> </span></p>
+<p id='t1020' class='pln'><span class='str'> both.cog -d # This is bad: -r and -d</span><span class='strut'> </span></p>
+<p id='t1021' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t1022' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t1023' class='pln'><span class='strut'> </span></p>
+<p id='t1024' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1025' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaises</span><span class='op'>(</span><span class='nam'>CogUsageError</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'@cogfiles.txt'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1026' class='pln'><span class='strut'> </span></p>
+<p id='t1027' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testAtFileWithTrickyFilenames</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1028' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1029' class='pln'> <span class='str'>'one 1.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1030' class='pln'><span class='str'> //[[[cog cog.outl("hello world") ]]]</span><span class='strut'> </span></p>
+<p id='t1031' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1032' class='pln'><span class='strut'> </span></p>
+<p id='t1033' class='pln'> <span class='str'>'one.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1034' class='pln'><span class='str'> //[[[cog cog.outl("hello world") ]]]</span><span class='strut'> </span></p>
+<p id='t1035' class='pln'><span class='str'> hello world //xxx</span><span class='strut'> </span></p>
+<p id='t1036' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1037' class='pln'><span class='strut'> </span></p>
+<p id='t1038' class='pln'> <span class='str'>'subdir'</span><span class='op'>:</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1039' class='pln'> <span class='str'>'subback.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1040' class='pln'><span class='str'> //[[[cog cog.outl("down deep with backslashes") ]]]</span><span class='strut'> </span></p>
+<p id='t1041' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1042' class='pln'><span class='strut'> </span></p>
+<p id='t1043' class='pln'> <span class='str'>'subfwd.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1044' class='pln'><span class='str'> //[[[cog cog.outl("down deep with slashes") ]]]</span><span class='strut'> </span></p>
+<p id='t1045' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1046' class='pln'> <span class='op'>}</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1047' class='pln'><span class='strut'> </span></p>
+<p id='t1048' class='pln'> <span class='str'>'subback.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1049' class='pln'><span class='str'> //[[[cog cog.outl("down deep with backslashes") ]]]</span><span class='strut'> </span></p>
+<p id='t1050' class='pln'><span class='str'> down deep with backslashes //yyy</span><span class='strut'> </span></p>
+<p id='t1051' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1052' class='pln'><span class='strut'> </span></p>
+<p id='t1053' class='pln'> <span class='str'>'subfwd.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1054' class='pln'><span class='str'> //[[[cog cog.outl("down deep with slashes") ]]]</span><span class='strut'> </span></p>
+<p id='t1055' class='pln'><span class='str'> down deep with slashes //zzz</span><span class='strut'> </span></p>
+<p id='t1056' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1057' class='pln'><span class='strut'> </span></p>
+<p id='t1058' class='pln'> <span class='str'>'cogfiles.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1059' class='pln'><span class='str'> # Please run cog</span><span class='strut'> </span></p>
+<p id='t1060' class='pln'><span class='str'> 'one 1.cog' -s ' //xxx'</span><span class='strut'> </span></p>
+<p id='t1061' class='pln'><span class='str'> subdir\subback.cog -s ' //yyy'</span><span class='strut'> </span></p>
+<p id='t1062' class='pln'><span class='str'> subdir/subfwd.cog -s ' //zzz'</span><span class='strut'> </span></p>
+<p id='t1063' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t1064' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t1065' class='pln'><span class='strut'> </span></p>
+<p id='t1066' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1067' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-z'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'@cogfiles.txt'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1068' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'one 1.cog'</span><span class='op'>,</span> <span class='str'>'one.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1069' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'subdir/subback.cog'</span><span class='op'>,</span> <span class='str'>'subback.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1070' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'subdir/subfwd.cog'</span><span class='op'>,</span> <span class='str'>'subfwd.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1071' class='pln'><span class='strut'> </span></p>
+<p id='t1072' class='pln'><span class='strut'> </span></p>
+<p id='t1073' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>CogTestLineEndings</span><span class='op'>(</span><span class='nam'>TestCaseWithTempDir</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1074' class='pln'> <span class='str'>"""Tests for -U option (force LF line-endings in output)."""</span><span class='strut'> </span></p>
+<p id='t1075' class='pln'><span class='strut'> </span></p>
+<p id='t1076' class='stm run hide_run'> <span class='nam'>lines_in</span> <span class='op'>=</span> <span class='op'>[</span><span class='str'>'Some text.'</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1077' class='pln'> <span class='str'>'//[[[cog'</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1078' class='pln'> <span class='str'>'cog.outl("Cog text")'</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1079' class='pln'> <span class='str'>'//]]]'</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1080' class='pln'> <span class='str'>'gobbledegook.'</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1081' class='pln'> <span class='str'>'//[[[end]]]'</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1082' class='pln'> <span class='str'>'epilogue.'</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1083' class='pln'> <span class='str'>''</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t1084' class='pln'><span class='strut'> </span></p>
+<p id='t1085' class='stm run hide_run'> <span class='nam'>lines_out</span> <span class='op'>=</span> <span class='op'>[</span><span class='str'>'Some text.'</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1086' class='pln'> <span class='str'>'//[[[cog'</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1087' class='pln'> <span class='str'>'cog.outl("Cog text")'</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1088' class='pln'> <span class='str'>'//]]]'</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1089' class='pln'> <span class='str'>'Cog text'</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1090' class='pln'> <span class='str'>'//[[[end]]]'</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1091' class='pln'> <span class='str'>'epilogue.'</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1092' class='pln'> <span class='str'>''</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t1093' class='pln'><span class='strut'> </span></p>
+<p id='t1094' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testOutputNativeEol</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1095' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='op'>{</span><span class='str'>'infile'</span><span class='op'>:</span> <span class='str'>'\n'</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines_in</span><span class='op'>)</span><span class='op'>}</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1096' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-o'</span><span class='op'>,</span> <span class='str'>'outfile'</span><span class='op'>,</span> <span class='str'>'infile'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1097' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFileContent</span><span class='op'>(</span><span class='str'>'outfile'</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>linesep</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines_out</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1098' class='pln'><span class='strut'> </span></p>
+<p id='t1099' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testOutputLfEol</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1100' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='op'>{</span><span class='str'>'infile'</span><span class='op'>:</span> <span class='str'>'\n'</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines_in</span><span class='op'>)</span><span class='op'>}</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1101' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-U'</span><span class='op'>,</span> <span class='str'>'-o'</span><span class='op'>,</span> <span class='str'>'outfile'</span><span class='op'>,</span> <span class='str'>'infile'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1102' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFileContent</span><span class='op'>(</span><span class='str'>'outfile'</span><span class='op'>,</span> <span class='str'>'\n'</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines_out</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1103' class='pln'><span class='strut'> </span></p>
+<p id='t1104' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testReplaceNativeEol</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1105' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='op'>{</span><span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>'\n'</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines_in</span><span class='op'>)</span><span class='op'>}</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1106' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1107' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFileContent</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>linesep</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines_out</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1108' class='pln'><span class='strut'> </span></p>
+<p id='t1109' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testReplaceLfEol</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1110' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='op'>{</span><span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>'\n'</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines_in</span><span class='op'>)</span><span class='op'>}</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1111' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-U'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1112' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFileContent</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'\n'</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines_out</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1113' class='pln'><span class='strut'> </span></p>
+<p id='t1114' class='pln'><span class='strut'> </span></p>
+<p id='t1115' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>TestCaseWithImports</span><span class='op'>(</span><span class='nam'>TestCaseWithTempDir</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1116' class='pln'> <span class='str'>""" When running tests which import modules, the sys.modules list</span><span class='strut'> </span></p>
+<p id='t1117' class='pln'><span class='str'> leaks from one test to the next. This test case class scrubs</span><span class='strut'> </span></p>
+<p id='t1118' class='pln'><span class='str'> the list after each run to keep the tests isolated from each other.</span><span class='strut'> </span></p>
+<p id='t1119' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t1120' class='pln'><span class='strut'> </span></p>
+<p id='t1121' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>setUp</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1122' class='stm mis'> <span class='nam'>TestCaseWithTempDir</span><span class='op'>.</span><span class='nam'>setUp</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1123' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sysmodulekeys</span> <span class='op'>=</span> <span class='nam'>list</span><span class='op'>(</span><span class='nam'>sys</span><span class='op'>.</span><span class='nam'>modules</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1124' class='pln'><span class='strut'> </span></p>
+<p id='t1125' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>tearDown</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1126' class='stm mis'> <span class='nam'>modstoscrub</span> <span class='op'>=</span> <span class='op'>[</span><span class='strut'> </span></p>
+<p id='t1127' class='pln'> <span class='nam'>modname</span><span class='strut'> </span></p>
+<p id='t1128' class='pln'> <span class='key'>for</span> <span class='nam'>modname</span> <span class='key'>in</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>modules</span><span class='strut'> </span></p>
+<p id='t1129' class='pln'> <span class='key'>if</span> <span class='nam'>modname</span> <span class='key'>not</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sysmodulekeys</span><span class='strut'> </span></p>
+<p id='t1130' class='pln'> <span class='op'>]</span><span class='strut'> </span></p>
+<p id='t1131' class='stm mis'> <span class='key'>for</span> <span class='nam'>modname</span> <span class='key'>in</span> <span class='nam'>modstoscrub</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1132' class='stm mis'> <span class='key'>del</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>modules</span><span class='op'>[</span><span class='nam'>modname</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t1133' class='stm mis'> <span class='nam'>TestCaseWithTempDir</span><span class='op'>.</span><span class='nam'>tearDown</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1134' class='pln'><span class='strut'> </span></p>
+<p id='t1135' class='pln'><span class='strut'> </span></p>
+<p id='t1136' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>CogIncludeTests</span><span class='op'>(</span><span class='nam'>TestCaseWithImports</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1137' class='stm run hide_run'> <span class='nam'>dincludes</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1138' class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1139' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1140' class='pln'><span class='str'> import mymodule</span><span class='strut'> </span></p>
+<p id='t1141' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1142' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1143' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1144' class='pln'><span class='strut'> </span></p>
+<p id='t1145' class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1146' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1147' class='pln'><span class='str'> import mymodule</span><span class='strut'> </span></p>
+<p id='t1148' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1149' class='pln'><span class='str'> Hello from mymodule</span><span class='strut'> </span></p>
+<p id='t1150' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1151' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1152' class='pln'><span class='strut'> </span></p>
+<p id='t1153' class='pln'> <span class='str'>'test2.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1154' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1155' class='pln'><span class='str'> import mymodule</span><span class='strut'> </span></p>
+<p id='t1156' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1157' class='pln'><span class='str'> Hello from mymodule in inc2</span><span class='strut'> </span></p>
+<p id='t1158' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1159' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1160' class='pln'><span class='strut'> </span></p>
+<p id='t1161' class='pln'> <span class='str'>'include'</span><span class='op'>:</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1162' class='pln'> <span class='str'>'mymodule.py'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1163' class='pln'><span class='str'> import cog</span><span class='strut'> </span></p>
+<p id='t1164' class='pln'><span class='str'> cog.outl("Hello from mymodule")</span><span class='strut'> </span></p>
+<p id='t1165' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t1166' class='pln'> <span class='op'>}</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1167' class='pln'><span class='strut'> </span></p>
+<p id='t1168' class='pln'> <span class='str'>'inc2'</span><span class='op'>:</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1169' class='pln'> <span class='str'>'mymodule.py'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1170' class='pln'><span class='str'> import cog</span><span class='strut'> </span></p>
+<p id='t1171' class='pln'><span class='str'> cog.outl("Hello from mymodule in inc2")</span><span class='strut'> </span></p>
+<p id='t1172' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t1173' class='pln'> <span class='op'>}</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1174' class='pln'><span class='strut'> </span></p>
+<p id='t1175' class='pln'> <span class='str'>'inc3'</span><span class='op'>:</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1176' class='pln'> <span class='str'>'someothermodule.py'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1177' class='pln'><span class='str'> import cog</span><span class='strut'> </span></p>
+<p id='t1178' class='pln'><span class='str'> cog.outl("This is some other module.")</span><span class='strut'> </span></p>
+<p id='t1179' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t1180' class='pln'> <span class='op'>}</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1181' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t1182' class='pln'><span class='strut'> </span></p>
+<p id='t1183' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testNeedIncludePath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1184' class='pln'> <span class='com'># Try it without the -I, to see that an ImportError happens.</span><span class='strut'> </span></p>
+<p id='t1185' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>dincludes</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1186' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaises</span><span class='op'>(</span><span class='nam'>ImportError</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1187' class='pln'><span class='strut'> </span></p>
+<p id='t1188' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testIncludePath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1189' class='pln'> <span class='com'># Test that -I adds include directories properly.</span><span class='strut'> </span></p>
+<p id='t1190' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>dincludes</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1191' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'include'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1192' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1193' class='pln'><span class='strut'> </span></p>
+<p id='t1194' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testTwoIncludePaths</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1195' class='pln'> <span class='com'># Test that two -I's add include directories properly.</span><span class='strut'> </span></p>
+<p id='t1196' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>dincludes</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1197' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'include'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'inc2'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1198' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1199' class='pln'><span class='strut'> </span></p>
+<p id='t1200' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testTwoIncludePaths2</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1201' class='pln'> <span class='com'># Test that two -I's add include directories properly.</span><span class='strut'> </span></p>
+<p id='t1202' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>dincludes</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1203' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'inc2'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'include'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1204' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test2.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1205' class='pln'><span class='strut'> </span></p>
+<p id='t1206' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testUselessIncludePath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1207' class='pln'> <span class='com'># Test that the search will continue past the first directory.</span><span class='strut'> </span></p>
+<p id='t1208' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>dincludes</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1209' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'inc3'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'include'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1210' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1211' class='pln'><span class='strut'> </span></p>
+<p id='t1212' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testSysPathIsUnchanged</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1213' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1214' class='pln'> <span class='str'>'bad.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1215' class='pln'><span class='str'> //[[[cog cog.error("Oh no!") ]]]</span><span class='strut'> </span></p>
+<p id='t1216' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1217' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1218' class='pln'> <span class='str'>'good.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1219' class='pln'><span class='str'> //[[[cog cog.outl("Oh yes!") ]]]</span><span class='strut'> </span></p>
+<p id='t1220' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1221' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1222' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t1223' class='pln'><span class='strut'> </span></p>
+<p id='t1224' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1225' class='pln'> <span class='com'># Is it unchanged just by creating a cog engine?</span><span class='strut'> </span></p>
+<p id='t1226' class='stm mis'> <span class='nam'>oldsyspath</span> <span class='op'>=</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>[</span><span class='op'>:</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t1227' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1228' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>oldsyspath</span><span class='op'>,</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1229' class='pln'> <span class='com'># Is it unchanged for a successful run?</span><span class='strut'> </span></p>
+<p id='t1230' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1231' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'good.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1232' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>oldsyspath</span><span class='op'>,</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1233' class='pln'> <span class='com'># Is it unchanged for a successful run with includes?</span><span class='strut'> </span></p>
+<p id='t1234' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1235' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'xyzzy'</span><span class='op'>,</span> <span class='str'>'good.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1236' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>oldsyspath</span><span class='op'>,</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1237' class='pln'> <span class='com'># Is it unchanged for a successful run with two includes?</span><span class='strut'> </span></p>
+<p id='t1238' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1239' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'xyzzy'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'quux'</span><span class='op'>,</span> <span class='str'>'good.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1240' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>oldsyspath</span><span class='op'>,</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1241' class='pln'> <span class='com'># Is it unchanged for a failed run?</span><span class='strut'> </span></p>
+<p id='t1242' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1243' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaises</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'bad.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1244' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>oldsyspath</span><span class='op'>,</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1245' class='pln'> <span class='com'># Is it unchanged for a failed run with includes?</span><span class='strut'> </span></p>
+<p id='t1246' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1247' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaises</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'xyzzy'</span><span class='op'>,</span> <span class='str'>'bad.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1248' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>oldsyspath</span><span class='op'>,</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1249' class='pln'> <span class='com'># Is it unchanged for a failed run with two includes?</span><span class='strut'> </span></p>
+<p id='t1250' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1251' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaises</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'xyzzy'</span><span class='op'>,</span> <span class='str'>'-I'</span><span class='op'>,</span> <span class='str'>'quux'</span><span class='op'>,</span> <span class='str'>'bad.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1252' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>oldsyspath</span><span class='op'>,</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1253' class='pln'><span class='strut'> </span></p>
+<p id='t1254' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testSubDirectories</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1255' class='pln'> <span class='com'># Test that relative paths on the command line work, with includes.</span><span class='strut'> </span></p>
+<p id='t1256' class='pln'><span class='strut'> </span></p>
+<p id='t1257' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1258' class='pln'> <span class='str'>'code'</span><span class='op'>:</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1259' class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1260' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1261' class='pln'><span class='str'> import mysubmodule</span><span class='strut'> </span></p>
+<p id='t1262' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1263' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1264' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1265' class='pln'><span class='strut'> </span></p>
+<p id='t1266' class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1267' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1268' class='pln'><span class='str'> import mysubmodule</span><span class='strut'> </span></p>
+<p id='t1269' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1270' class='pln'><span class='str'> Hello from mysubmodule</span><span class='strut'> </span></p>
+<p id='t1271' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1272' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1273' class='pln'><span class='strut'> </span></p>
+<p id='t1274' class='pln'> <span class='str'>'mysubmodule.py'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1275' class='pln'><span class='str'> import cog</span><span class='strut'> </span></p>
+<p id='t1276' class='pln'><span class='str'> cog.outl("Hello from mysubmodule")</span><span class='strut'> </span></p>
+<p id='t1277' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t1278' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t1279' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t1280' class='pln'><span class='strut'> </span></p>
+<p id='t1281' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1282' class='pln'> <span class='com'># We should be able to invoke cog without the -I switch, and it will</span><span class='strut'> </span></p>
+<p id='t1283' class='pln'> <span class='com'># auto-include the current directory</span><span class='strut'> </span></p>
+<p id='t1284' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'code/test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1285' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'code/test.cog'</span><span class='op'>,</span> <span class='str'>'code/test.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1286' class='pln'><span class='strut'> </span></p>
+<p id='t1287' class='pln'><span class='strut'> </span></p>
+<p id='t1288' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>CogTestsInFiles</span><span class='op'>(</span><span class='nam'>TestCaseWithTempDir</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1289' class='pln'><span class='strut'> </span></p>
+<p id='t1290' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testWarnIfNoCogCode</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1291' class='pln'> <span class='com'># Test that the -e switch warns if there is no Cog code.</span><span class='strut'> </span></p>
+<p id='t1292' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1293' class='pln'> <span class='str'>'with.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1294' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1295' class='pln'><span class='str'> cog.outl("hello world")</span><span class='strut'> </span></p>
+<p id='t1296' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1297' class='pln'><span class='str'> hello world</span><span class='strut'> </span></p>
+<p id='t1298' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1299' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1300' class='pln'><span class='strut'> </span></p>
+<p id='t1301' class='pln'> <span class='str'>'without.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1302' class='pln'><span class='str'> There's no cog</span><span class='strut'> </span></p>
+<p id='t1303' class='pln'><span class='str'> code in this file.</span><span class='strut'> </span></p>
+<p id='t1304' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1305' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t1306' class='pln'><span class='strut'> </span></p>
+<p id='t1307' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1308' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-e'</span><span class='op'>,</span> <span class='str'>'with.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1309' class='stm mis'> <span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1310' class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='str'>"Warning"</span><span class='op'>)</span> <span class='op'><</span> <span class='num'>0</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1311' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1312' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-e'</span><span class='op'>,</span> <span class='str'>'without.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1313' class='stm mis'> <span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1314' class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='str'>"Warning: no cog code found in without.cog"</span><span class='op'>)</span> <span class='op'>>=</span> <span class='num'>0</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1315' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1316' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'without.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1317' class='stm mis'> <span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1318' class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='str'>"Warning"</span><span class='op'>)</span> <span class='op'><</span> <span class='num'>0</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1319' class='pln'><span class='strut'> </span></p>
+<p id='t1320' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testFileNameProps</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1321' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1322' class='pln'> <span class='str'>'cog1.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1323' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1324' class='pln'><span class='str'> cog.outl("This is %s in, %s out" % (cog.inFile, cog.outFile))</span><span class='strut'> </span></p>
+<p id='t1325' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1326' class='pln'><span class='str'> this is cog1.txt in, cog1.txt out</span><span class='strut'> </span></p>
+<p id='t1327' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p>
+<p id='t1328' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1329' class='pln'><span class='strut'> </span></p>
+<p id='t1330' class='pln'> <span class='str'>'cog1.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1331' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1332' class='pln'><span class='str'> cog.outl("This is %s in, %s out" % (cog.inFile, cog.outFile))</span><span class='strut'> </span></p>
+<p id='t1333' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1334' class='pln'><span class='str'> This is cog1.txt in, cog1.txt out</span><span class='strut'> </span></p>
+<p id='t1335' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p>
+<p id='t1336' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1337' class='pln'><span class='strut'> </span></p>
+<p id='t1338' class='pln'> <span class='str'>'cog1out.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1339' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1340' class='pln'><span class='str'> cog.outl("This is %s in, %s out" % (cog.inFile, cog.outFile))</span><span class='strut'> </span></p>
+<p id='t1341' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1342' class='pln'><span class='str'> This is cog1.txt in, cog1out.txt out</span><span class='strut'> </span></p>
+<p id='t1343' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p>
+<p id='t1344' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1345' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t1346' class='pln'><span class='strut'> </span></p>
+<p id='t1347' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1348' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'cog1.txt'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1349' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'cog1.txt'</span><span class='op'>,</span> <span class='str'>'cog1.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1350' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1351' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-o'</span><span class='op'>,</span> <span class='str'>'cog1out.txt'</span><span class='op'>,</span> <span class='str'>'cog1.txt'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1352' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'cog1out.txt'</span><span class='op'>,</span> <span class='str'>'cog1out.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1353' class='pln'><span class='strut'> </span></p>
+<p id='t1354' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testGlobalsDontCrossFiles</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1355' class='pln'> <span class='com'># Make sure that global values don't get shared between files.</span><span class='strut'> </span></p>
+<p id='t1356' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1357' class='pln'> <span class='str'>'one.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1358' class='pln'><span class='str'> //[[[cog s = "This was set in one.cog" ]]]</span><span class='strut'> </span></p>
+<p id='t1359' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1360' class='pln'><span class='str'> //[[[cog cog.outl(s) ]]]</span><span class='strut'> </span></p>
+<p id='t1361' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1362' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1363' class='pln'><span class='strut'> </span></p>
+<p id='t1364' class='pln'> <span class='str'>'one.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1365' class='pln'><span class='str'> //[[[cog s = "This was set in one.cog" ]]]</span><span class='strut'> </span></p>
+<p id='t1366' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1367' class='pln'><span class='str'> //[[[cog cog.outl(s) ]]]</span><span class='strut'> </span></p>
+<p id='t1368' class='pln'><span class='str'> This was set in one.cog</span><span class='strut'> </span></p>
+<p id='t1369' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1370' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1371' class='pln'><span class='strut'> </span></p>
+<p id='t1372' class='pln'> <span class='str'>'two.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1373' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1374' class='pln'><span class='str'> try:</span><span class='strut'> </span></p>
+<p id='t1375' class='pln'><span class='str'> cog.outl(s)</span><span class='strut'> </span></p>
+<p id='t1376' class='pln'><span class='str'> except NameError:</span><span class='strut'> </span></p>
+<p id='t1377' class='pln'><span class='str'> cog.outl("s isn't set!")</span><span class='strut'> </span></p>
+<p id='t1378' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1379' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1380' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1381' class='pln'><span class='strut'> </span></p>
+<p id='t1382' class='pln'> <span class='str'>'two.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1383' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1384' class='pln'><span class='str'> try:</span><span class='strut'> </span></p>
+<p id='t1385' class='pln'><span class='str'> cog.outl(s)</span><span class='strut'> </span></p>
+<p id='t1386' class='pln'><span class='str'> except NameError:</span><span class='strut'> </span></p>
+<p id='t1387' class='pln'><span class='str'> cog.outl("s isn't set!")</span><span class='strut'> </span></p>
+<p id='t1388' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1389' class='pln'><span class='str'> s isn't set!</span><span class='strut'> </span></p>
+<p id='t1390' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1391' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1392' class='pln'><span class='strut'> </span></p>
+<p id='t1393' class='pln'> <span class='str'>'cogfiles.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1394' class='pln'><span class='str'> # Please run cog</span><span class='strut'> </span></p>
+<p id='t1395' class='pln'><span class='str'> one.cog</span><span class='strut'> </span></p>
+<p id='t1396' class='pln'><span class='str'> </span><span class='strut'> </span></p>
+<p id='t1397' class='pln'><span class='str'> two.cog</span><span class='strut'> </span></p>
+<p id='t1398' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t1399' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t1400' class='pln'><span class='strut'> </span></p>
+<p id='t1401' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1402' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'@cogfiles.txt'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1403' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'one.cog'</span><span class='op'>,</span> <span class='str'>'one.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1404' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'two.cog'</span><span class='op'>,</span> <span class='str'>'two.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1405' class='stm mis'> <span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1406' class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='str'>"(changed)"</span><span class='op'>)</span> <span class='op'>>=</span> <span class='num'>0</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1407' class='pln'><span class='strut'> </span></p>
+<p id='t1408' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testRemoveGeneratedOutput</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1409' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1410' class='pln'> <span class='str'>'cog1.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1411' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1412' class='pln'><span class='str'> cog.outl("This line was generated.")</span><span class='strut'> </span></p>
+<p id='t1413' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1414' class='pln'><span class='str'> This line was generated.</span><span class='strut'> </span></p>
+<p id='t1415' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1416' class='pln'><span class='str'> This line was not.</span><span class='strut'> </span></p>
+<p id='t1417' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1418' class='pln'><span class='strut'> </span></p>
+<p id='t1419' class='pln'> <span class='str'>'cog1.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1420' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1421' class='pln'><span class='str'> cog.outl("This line was generated.")</span><span class='strut'> </span></p>
+<p id='t1422' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1423' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1424' class='pln'><span class='str'> This line was not.</span><span class='strut'> </span></p>
+<p id='t1425' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1426' class='pln'><span class='strut'> </span></p>
+<p id='t1427' class='pln'> <span class='str'>'cog1.out2'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1428' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1429' class='pln'><span class='str'> cog.outl("This line was generated.")</span><span class='strut'> </span></p>
+<p id='t1430' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1431' class='pln'><span class='str'> This line was generated.</span><span class='strut'> </span></p>
+<p id='t1432' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1433' class='pln'><span class='str'> This line was not.</span><span class='strut'> </span></p>
+<p id='t1434' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1435' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t1436' class='pln'><span class='strut'> </span></p>
+<p id='t1437' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1438' class='pln'> <span class='com'># Remove generated output.</span><span class='strut'> </span></p>
+<p id='t1439' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-x'</span><span class='op'>,</span> <span class='str'>'cog1.txt'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1440' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'cog1.txt'</span><span class='op'>,</span> <span class='str'>'cog1.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1441' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1442' class='pln'> <span class='com'># Regenerate the generated output.</span><span class='strut'> </span></p>
+<p id='t1443' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'cog1.txt'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1444' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'cog1.txt'</span><span class='op'>,</span> <span class='str'>'cog1.out2'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1445' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>newCog</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1446' class='pln'> <span class='com'># Remove the generated output again.</span><span class='strut'> </span></p>
+<p id='t1447' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-x'</span><span class='op'>,</span> <span class='str'>'cog1.txt'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1448' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'cog1.txt'</span><span class='op'>,</span> <span class='str'>'cog1.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1449' class='pln'><span class='strut'> </span></p>
+<p id='t1450' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testMsgCall</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1451' class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1452' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p>
+<p id='t1453' class='pln'><span class='str'> cog.msg("Hello there!")</span><span class='strut'> </span></p>
+<p id='t1454' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p>
+<p id='t1455' class='pln'><span class='str'> #[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1456' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t1457' class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1458' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>infile</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>infile</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1459' class='stm mis'> <span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1460' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>output</span><span class='op'>,</span> <span class='str'>"Message: Hello there!\n"</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1461' class='pln'><span class='strut'> </span></p>
+<p id='t1462' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testErrorMessageHasNoTraceback</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1463' class='pln'> <span class='com'># Test that a Cog error is printed to stderr with no traceback.</span><span class='strut'> </span></p>
+<p id='t1464' class='pln'><span class='strut'> </span></p>
+<p id='t1465' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1466' class='pln'> <span class='str'>'cog1.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1467' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1468' class='pln'><span class='str'> cog.outl("This line was newly")</span><span class='strut'> </span></p>
+<p id='t1469' class='pln'><span class='str'> cog.outl("generated by cog")</span><span class='strut'> </span></p>
+<p id='t1470' class='pln'><span class='str'> cog.outl("blah blah.")</span><span class='strut'> </span></p>
+<p id='t1471' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1472' class='pln'><span class='str'> Xhis line was newly</span><span class='strut'> </span></p>
+<p id='t1473' class='pln'><span class='str'> generated by cog</span><span class='strut'> </span></p>
+<p id='t1474' class='pln'><span class='str'> blah blah.</span><span class='strut'> </span></p>
+<p id='t1475' class='pln'><span class='str'> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class='strut'> </span></p>
+<p id='t1476' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1477' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t1478' class='pln'><span class='strut'> </span></p>
+<p id='t1479' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1480' class='stm mis'> <span class='nam'>stderr</span> <span class='op'>=</span> <span class='nam'>StringIO</span><span class='op'>.</span><span class='nam'>StringIO</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1481' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>setOutput</span><span class='op'>(</span><span class='nam'>stderr</span><span class='op'>=</span><span class='nam'>stderr</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1482' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>main</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-c'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>"cog1.txt"</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1483' class='stm mis'> <span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1484' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>"Cogging cog1.txt\n"</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1485' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>stderr</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>"cog1.txt(9): Output has been edited! Delete old checksum to unprotect.\n"</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1486' class='pln'><span class='strut'> </span></p>
+<p id='t1487' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testDashD</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1488' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1489' class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1490' class='pln'><span class='str'> --[[[cog cog.outl("Defined fooey as " + fooey) ]]]</span><span class='strut'> </span></p>
+<p id='t1491' class='pln'><span class='str'> --[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1492' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1493' class='pln'><span class='strut'> </span></p>
+<p id='t1494' class='pln'> <span class='str'>'test.kablooey'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1495' class='pln'><span class='str'> --[[[cog cog.outl("Defined fooey as " + fooey) ]]]</span><span class='strut'> </span></p>
+<p id='t1496' class='pln'><span class='str'> Defined fooey as kablooey</span><span class='strut'> </span></p>
+<p id='t1497' class='pln'><span class='str'> --[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1498' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1499' class='pln'><span class='strut'> </span></p>
+<p id='t1500' class='pln'> <span class='str'>'test.einstein'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1501' class='pln'><span class='str'> --[[[cog cog.outl("Defined fooey as " + fooey) ]]]</span><span class='strut'> </span></p>
+<p id='t1502' class='pln'><span class='str'> Defined fooey as e=mc2</span><span class='strut'> </span></p>
+<p id='t1503' class='pln'><span class='str'> --[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1504' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1505' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t1506' class='pln'><span class='strut'> </span></p>
+<p id='t1507' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1508' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-D'</span><span class='op'>,</span> <span class='str'>'fooey=kablooey'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1509' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.kablooey'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1510' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1511' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-Dfooey=kablooey'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1512' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.kablooey'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1513' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1514' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-Dfooey=e=mc2'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1515' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.einstein'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1516' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1517' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-Dbar=quux'</span><span class='op'>,</span> <span class='str'>'-Dfooey=kablooey'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1518' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.kablooey'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1519' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1520' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-Dfooey=kablooey'</span><span class='op'>,</span> <span class='str'>'-Dbar=quux'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1521' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.kablooey'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1522' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1523' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-Dfooey=gooey'</span><span class='op'>,</span> <span class='str'>'-Dfooey=kablooey'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1524' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.kablooey'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1525' class='pln'><span class='strut'> </span></p>
+<p id='t1526' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testOutputToStdout</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1527' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1528' class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1529' class='pln'><span class='str'> --[[[cog cog.outl('Hey there!') ]]]</span><span class='strut'> </span></p>
+<p id='t1530' class='pln'><span class='str'> --[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1531' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t1532' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t1533' class='pln'><span class='strut'> </span></p>
+<p id='t1534' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1535' class='stm mis'> <span class='nam'>stderr</span> <span class='op'>=</span> <span class='nam'>StringIO</span><span class='op'>.</span><span class='nam'>StringIO</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1536' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>setOutput</span><span class='op'>(</span><span class='nam'>stderr</span><span class='op'>=</span><span class='nam'>stderr</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1537' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1538' class='stm mis'> <span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1539' class='stm mis'> <span class='nam'>outerr</span> <span class='op'>=</span> <span class='nam'>stderr</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1540' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>output</span><span class='op'>,</span> <span class='str'>"--[[[cog cog.outl('Hey there!') ]]]\nHey there!\n--[[[end]]]\n"</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1541' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>outerr</span><span class='op'>,</span> <span class='str'>""</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1542' class='pln'><span class='strut'> </span></p>
+<p id='t1543' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testSuffixOutputLines</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1544' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1545' class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1546' class='pln'><span class='str'> Hey there.</span><span class='strut'> </span></p>
+<p id='t1547' class='pln'><span class='str'> ;[[[cog cog.outl('a\\nb\\n \\nc') ]]]</span><span class='strut'> </span></p>
+<p id='t1548' class='pln'><span class='str'> ;[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1549' class='pln'><span class='str'> Good bye.</span><span class='strut'> </span></p>
+<p id='t1550' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1551' class='pln'><span class='strut'> </span></p>
+<p id='t1552' class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1553' class='pln'><span class='str'> Hey there.</span><span class='strut'> </span></p>
+<p id='t1554' class='pln'><span class='str'> ;[[[cog cog.outl('a\\nb\\n \\nc') ]]]</span><span class='strut'> </span></p>
+<p id='t1555' class='pln'><span class='str'> a (foo)</span><span class='strut'> </span></p>
+<p id='t1556' class='pln'><span class='str'> b (foo)</span><span class='strut'> </span></p>
+<p id='t1557' class='pln'><span class='str'> </span><span class='strut'> </span></p>
+<p id='t1558' class='pln'><span class='str'> c (foo)</span><span class='strut'> </span></p>
+<p id='t1559' class='pln'><span class='str'> ;[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1560' class='pln'><span class='str'> Good bye.</span><span class='strut'> </span></p>
+<p id='t1561' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1562' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t1563' class='pln'><span class='strut'> </span></p>
+<p id='t1564' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1565' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-s'</span><span class='op'>,</span> <span class='str'>' (foo)'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1566' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1567' class='pln'><span class='strut'> </span></p>
+<p id='t1568' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testEmptySuffix</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1569' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1570' class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1571' class='pln'><span class='str'> ;[[[cog cog.outl('a\\nb\\nc') ]]]</span><span class='strut'> </span></p>
+<p id='t1572' class='pln'><span class='str'> ;[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1573' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1574' class='pln'><span class='strut'> </span></p>
+<p id='t1575' class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1576' class='pln'><span class='str'> ;[[[cog cog.outl('a\\nb\\nc') ]]]</span><span class='strut'> </span></p>
+<p id='t1577' class='pln'><span class='str'> a</span><span class='strut'> </span></p>
+<p id='t1578' class='pln'><span class='str'> b</span><span class='strut'> </span></p>
+<p id='t1579' class='pln'><span class='str'> c</span><span class='strut'> </span></p>
+<p id='t1580' class='pln'><span class='str'> ;[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1581' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1582' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t1583' class='pln'><span class='strut'> </span></p>
+<p id='t1584' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1585' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-s'</span><span class='op'>,</span> <span class='str'>''</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1586' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1587' class='pln'><span class='strut'> </span></p>
+<p id='t1588' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testHellishSuffix</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1589' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1590' class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1591' class='pln'><span class='str'> ;[[[cog cog.outl('a\\n\\nb') ]]]</span><span class='strut'> </span></p>
+<p id='t1592' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1593' class='pln'><span class='strut'> </span></p>
+<p id='t1594' class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1595' class='pln'><span class='str'> ;[[[cog cog.outl('a\\n\\nb') ]]]</span><span class='strut'> </span></p>
+<p id='t1596' class='pln'><span class='str'> a /\\n*+([)]><</span><span class='strut'> </span></p>
+<p id='t1597' class='pln'><span class='str'> </span><span class='strut'> </span></p>
+<p id='t1598' class='pln'><span class='str'> b /\\n*+([)]><</span><span class='strut'> </span></p>
+<p id='t1599' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1600' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t1601' class='pln'><span class='strut'> </span></p>
+<p id='t1602' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1603' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-z'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-s'</span><span class='op'>,</span> <span class='str'>r' /\n*+([)]><'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1604' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1605' class='pln'><span class='strut'> </span></p>
+<p id='t1606' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>WritabilityTests</span><span class='op'>(</span><span class='nam'>TestCaseWithTempDir</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1607' class='pln'><span class='strut'> </span></p>
+<p id='t1608' class='stm run hide_run'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1609' class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1610' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1611' class='pln'><span class='str'> for fn in ['DoSomething', 'DoAnotherThing', 'DoLastThing']:</span><span class='strut'> </span></p>
+<p id='t1612' class='pln'><span class='str'> cog.outl("void %s();" % fn)</span><span class='strut'> </span></p>
+<p id='t1613' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1614' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1615' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1616' class='pln'><span class='strut'> </span></p>
+<p id='t1617' class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1618' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1619' class='pln'><span class='str'> for fn in ['DoSomething', 'DoAnotherThing', 'DoLastThing']:</span><span class='strut'> </span></p>
+<p id='t1620' class='pln'><span class='str'> cog.outl("void %s();" % fn)</span><span class='strut'> </span></p>
+<p id='t1621' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1622' class='pln'><span class='str'> void DoSomething();</span><span class='strut'> </span></p>
+<p id='t1623' class='pln'><span class='str'> void DoAnotherThing();</span><span class='strut'> </span></p>
+<p id='t1624' class='pln'><span class='str'> void DoLastThing();</span><span class='strut'> </span></p>
+<p id='t1625' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1626' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1627' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t1628' class='pln'><span class='strut'> </span></p>
+<p id='t1629' class='exc'> <span class='key'>if</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>name</span> <span class='op'>==</span> <span class='str'>'nt'</span><span class='op'>:</span> <span class='com'># pragma: no cover</span><span class='strut'> </span></p>
+<p id='t1630' class='pln'> <span class='com'># for Windows</span><span class='strut'> </span></p>
+<p id='t1631' class='exc'> <span class='nam'>cmd_w_args</span> <span class='op'>=</span> <span class='str'>'attrib -R %s'</span><span class='strut'> </span></p>
+<p id='t1632' class='exc'> <span class='nam'>cmd_w_asterisk</span> <span class='op'>=</span> <span class='str'>'attrib -R *'</span><span class='strut'> </span></p>
+<p id='t1633' class='exc'> <span class='key'>else</span><span class='op'>:</span> <span class='com'># pragma: no cover</span><span class='strut'> </span></p>
+<p id='t1634' class='pln'> <span class='com'># for unix-like</span><span class='strut'> </span></p>
+<p id='t1635' class='exc'> <span class='nam'>cmd_w_args</span> <span class='op'>=</span> <span class='str'>'chmod +w %s'</span><span class='strut'> </span></p>
+<p id='t1636' class='exc'> <span class='nam'>cmd_w_asterisk</span> <span class='op'>=</span> <span class='str'>'chmod +w *'</span><span class='strut'> </span></p>
+<p id='t1637' class='pln'><span class='strut'> </span></p>
+<p id='t1638' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>setUp</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1639' class='stm mis'> <span class='nam'>TestCaseWithTempDir</span><span class='op'>.</span><span class='nam'>setUp</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1640' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1641' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>testcog</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>tempdir</span> <span class='op'>/</span> <span class='str'>'test.cog'</span><span class='strut'> </span></p>
+<p id='t1642' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>testcog</span><span class='op'>.</span><span class='nam'>chmod</span><span class='op'>(</span><span class='nam'>stat</span><span class='op'>.</span><span class='nam'>S_IREAD</span><span class='op'>)</span> <span class='com'># Make the file readonly.</span><span class='strut'> </span></p>
+<p id='t1643' class='stm mis'> <span class='key'>assert</span> <span class='key'>not</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>access</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>testcog</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>W_OK</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1644' class='pln'><span class='strut'> </span></p>
+<p id='t1645' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>tearDown</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1646' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>testcog</span><span class='op'>.</span><span class='nam'>chmod</span><span class='op'>(</span><span class='nam'>stat</span><span class='op'>.</span><span class='nam'>S_IWRITE</span><span class='op'>)</span> <span class='com'># Make the file writable again.</span><span class='strut'> </span></p>
+<p id='t1647' class='stm mis'> <span class='nam'>TestCaseWithTempDir</span><span class='op'>.</span><span class='nam'>tearDown</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1648' class='pln'><span class='strut'> </span></p>
+<p id='t1649' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testReadonlyNoCommand</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1650' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaisesMsg</span><span class='op'>(</span><span class='strut'> </span></p>
+<p id='t1651' class='pln'> <span class='nam'>CogError</span><span class='op'>,</span> <span class='str'>"Can't overwrite test.cog"</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1652' class='pln'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1653' class='stm mis'> <span class='key'>assert</span> <span class='key'>not</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>access</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>testcog</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>W_OK</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1654' class='pln'><span class='strut'> </span></p>
+<p id='t1655' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testReadonlyWithCommand</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1656' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-w'</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cmd_w_args</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1657' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1658' class='stm mis'> <span class='key'>assert</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>access</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>testcog</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>W_OK</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1659' class='pln'><span class='strut'> </span></p>
+<p id='t1660' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testReadonlyWithCommandWithNoSlot</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1661' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-w'</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cmd_w_asterisk</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1662' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1663' class='stm mis'> <span class='key'>assert</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>access</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>testcog</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>W_OK</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1664' class='pln'><span class='strut'> </span></p>
+<p id='t1665' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testReadonlyWithIneffectualCommand</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1666' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaisesMsg</span><span class='op'>(</span><span class='strut'> </span></p>
+<p id='t1667' class='pln'> <span class='nam'>CogError</span><span class='op'>,</span> <span class='str'>"Couldn't make test.cog writable"</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1668' class='pln'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-w'</span><span class='op'>,</span> <span class='str'>'echo %s'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1669' class='stm mis'> <span class='key'>assert</span> <span class='key'>not</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>access</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>testcog</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>W_OK</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1670' class='pln'><span class='strut'> </span></p>
+<p id='t1671' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>ChecksumTests</span><span class='op'>(</span><span class='nam'>TestCaseWithTempDir</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1672' class='pln'><span class='strut'> </span></p>
+<p id='t1673' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testCreateChecksumOutput</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1674' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1675' class='pln'> <span class='str'>'cog1.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1676' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1677' class='pln'><span class='str'> cog.outl("This line was generated.")</span><span class='strut'> </span></p>
+<p id='t1678' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1679' class='pln'><span class='str'> This line was generated.</span><span class='strut'> </span></p>
+<p id='t1680' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1681' class='pln'><span class='str'> This line was not.</span><span class='strut'> </span></p>
+<p id='t1682' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1683' class='pln'><span class='strut'> </span></p>
+<p id='t1684' class='pln'> <span class='str'>'cog1.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1685' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1686' class='pln'><span class='str'> cog.outl("This line was generated.")</span><span class='strut'> </span></p>
+<p id='t1687' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1688' class='pln'><span class='str'> This line was generated.</span><span class='strut'> </span></p>
+<p id='t1689' class='pln'><span class='str'> //[[[end]]] (checksum: 8adb13fb59b996a1c7f0065ea9f3d893)</span><span class='strut'> </span></p>
+<p id='t1690' class='pln'><span class='str'> This line was not.</span><span class='strut'> </span></p>
+<p id='t1691' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1692' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t1693' class='pln'><span class='strut'> </span></p>
+<p id='t1694' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1695' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-c'</span><span class='op'>,</span> <span class='str'>'cog1.txt'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1696' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'cog1.txt'</span><span class='op'>,</span> <span class='str'>'cog1.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1697' class='pln'><span class='strut'> </span></p>
+<p id='t1698' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testCheckChecksumOutput</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1699' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1700' class='pln'> <span class='str'>'cog1.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1701' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1702' class='pln'><span class='str'> cog.outl("This line was newly")</span><span class='strut'> </span></p>
+<p id='t1703' class='pln'><span class='str'> cog.outl("generated by cog")</span><span class='strut'> </span></p>
+<p id='t1704' class='pln'><span class='str'> cog.outl("blah blah.")</span><span class='strut'> </span></p>
+<p id='t1705' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1706' class='pln'><span class='str'> This line was generated.</span><span class='strut'> </span></p>
+<p id='t1707' class='pln'><span class='str'> //[[[end]]] (checksum: 8adb13fb59b996a1c7f0065ea9f3d893)</span><span class='strut'> </span></p>
+<p id='t1708' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1709' class='pln'><span class='strut'> </span></p>
+<p id='t1710' class='pln'> <span class='str'>'cog1.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1711' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1712' class='pln'><span class='str'> cog.outl("This line was newly")</span><span class='strut'> </span></p>
+<p id='t1713' class='pln'><span class='str'> cog.outl("generated by cog")</span><span class='strut'> </span></p>
+<p id='t1714' class='pln'><span class='str'> cog.outl("blah blah.")</span><span class='strut'> </span></p>
+<p id='t1715' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1716' class='pln'><span class='str'> This line was newly</span><span class='strut'> </span></p>
+<p id='t1717' class='pln'><span class='str'> generated by cog</span><span class='strut'> </span></p>
+<p id='t1718' class='pln'><span class='str'> blah blah.</span><span class='strut'> </span></p>
+<p id='t1719' class='pln'><span class='str'> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class='strut'> </span></p>
+<p id='t1720' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1721' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t1722' class='pln'><span class='strut'> </span></p>
+<p id='t1723' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1724' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-c'</span><span class='op'>,</span> <span class='str'>'cog1.txt'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1725' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'cog1.txt'</span><span class='op'>,</span> <span class='str'>'cog1.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1726' class='pln'><span class='strut'> </span></p>
+<p id='t1727' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testRemoveChecksumOutput</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1728' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1729' class='pln'> <span class='str'>'cog1.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1730' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1731' class='pln'><span class='str'> cog.outl("This line was newly")</span><span class='strut'> </span></p>
+<p id='t1732' class='pln'><span class='str'> cog.outl("generated by cog")</span><span class='strut'> </span></p>
+<p id='t1733' class='pln'><span class='str'> cog.outl("blah blah.")</span><span class='strut'> </span></p>
+<p id='t1734' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1735' class='pln'><span class='str'> This line was generated.</span><span class='strut'> </span></p>
+<p id='t1736' class='pln'><span class='str'> //[[[end]]] (checksum: 8adb13fb59b996a1c7f0065ea9f3d893) fooey</span><span class='strut'> </span></p>
+<p id='t1737' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1738' class='pln'><span class='strut'> </span></p>
+<p id='t1739' class='pln'> <span class='str'>'cog1.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1740' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1741' class='pln'><span class='str'> cog.outl("This line was newly")</span><span class='strut'> </span></p>
+<p id='t1742' class='pln'><span class='str'> cog.outl("generated by cog")</span><span class='strut'> </span></p>
+<p id='t1743' class='pln'><span class='str'> cog.outl("blah blah.")</span><span class='strut'> </span></p>
+<p id='t1744' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1745' class='pln'><span class='str'> This line was newly</span><span class='strut'> </span></p>
+<p id='t1746' class='pln'><span class='str'> generated by cog</span><span class='strut'> </span></p>
+<p id='t1747' class='pln'><span class='str'> blah blah.</span><span class='strut'> </span></p>
+<p id='t1748' class='pln'><span class='str'> //[[[end]]] fooey</span><span class='strut'> </span></p>
+<p id='t1749' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1750' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t1751' class='pln'><span class='strut'> </span></p>
+<p id='t1752' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1753' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'cog1.txt'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1754' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'cog1.txt'</span><span class='op'>,</span> <span class='str'>'cog1.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1755' class='pln'><span class='strut'> </span></p>
+<p id='t1756' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testTamperedChecksumOutput</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1757' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1758' class='pln'> <span class='str'>'cog1.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1759' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1760' class='pln'><span class='str'> cog.outl("This line was newly")</span><span class='strut'> </span></p>
+<p id='t1761' class='pln'><span class='str'> cog.outl("generated by cog")</span><span class='strut'> </span></p>
+<p id='t1762' class='pln'><span class='str'> cog.outl("blah blah.")</span><span class='strut'> </span></p>
+<p id='t1763' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1764' class='pln'><span class='str'> Xhis line was newly</span><span class='strut'> </span></p>
+<p id='t1765' class='pln'><span class='str'> generated by cog</span><span class='strut'> </span></p>
+<p id='t1766' class='pln'><span class='str'> blah blah.</span><span class='strut'> </span></p>
+<p id='t1767' class='pln'><span class='str'> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class='strut'> </span></p>
+<p id='t1768' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1769' class='pln'><span class='strut'> </span></p>
+<p id='t1770' class='pln'> <span class='str'>'cog2.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1771' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1772' class='pln'><span class='str'> cog.outl("This line was newly")</span><span class='strut'> </span></p>
+<p id='t1773' class='pln'><span class='str'> cog.outl("generated by cog")</span><span class='strut'> </span></p>
+<p id='t1774' class='pln'><span class='str'> cog.outl("blah blah.")</span><span class='strut'> </span></p>
+<p id='t1775' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1776' class='pln'><span class='str'> This line was newly</span><span class='strut'> </span></p>
+<p id='t1777' class='pln'><span class='str'> generated by cog</span><span class='strut'> </span></p>
+<p id='t1778' class='pln'><span class='str'> blah blah!</span><span class='strut'> </span></p>
+<p id='t1779' class='pln'><span class='str'> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class='strut'> </span></p>
+<p id='t1780' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1781' class='pln'><span class='strut'> </span></p>
+<p id='t1782' class='pln'> <span class='str'>'cog3.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1783' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1784' class='pln'><span class='str'> cog.outl("This line was newly")</span><span class='strut'> </span></p>
+<p id='t1785' class='pln'><span class='str'> cog.outl("generated by cog")</span><span class='strut'> </span></p>
+<p id='t1786' class='pln'><span class='str'> cog.outl("blah blah.")</span><span class='strut'> </span></p>
+<p id='t1787' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1788' class='pln'><span class='str'> </span><span class='strut'> </span></p>
+<p id='t1789' class='pln'><span class='str'> This line was newly</span><span class='strut'> </span></p>
+<p id='t1790' class='pln'><span class='str'> generated by cog</span><span class='strut'> </span></p>
+<p id='t1791' class='pln'><span class='str'> blah blah.</span><span class='strut'> </span></p>
+<p id='t1792' class='pln'><span class='str'> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class='strut'> </span></p>
+<p id='t1793' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1794' class='pln'><span class='strut'> </span></p>
+<p id='t1795' class='pln'> <span class='str'>'cog4.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1796' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1797' class='pln'><span class='str'> cog.outl("This line was newly")</span><span class='strut'> </span></p>
+<p id='t1798' class='pln'><span class='str'> cog.outl("generated by cog")</span><span class='strut'> </span></p>
+<p id='t1799' class='pln'><span class='str'> cog.outl("blah blah.")</span><span class='strut'> </span></p>
+<p id='t1800' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1801' class='pln'><span class='str'> This line was newly</span><span class='strut'> </span></p>
+<p id='t1802' class='pln'><span class='str'> generated by cog</span><span class='strut'> </span></p>
+<p id='t1803' class='pln'><span class='str'> blah blah..</span><span class='strut'> </span></p>
+<p id='t1804' class='pln'><span class='str'> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class='strut'> </span></p>
+<p id='t1805' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1806' class='pln'><span class='strut'> </span></p>
+<p id='t1807' class='pln'> <span class='str'>'cog5.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1808' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1809' class='pln'><span class='str'> cog.outl("This line was newly")</span><span class='strut'> </span></p>
+<p id='t1810' class='pln'><span class='str'> cog.outl("generated by cog")</span><span class='strut'> </span></p>
+<p id='t1811' class='pln'><span class='str'> cog.outl("blah blah.")</span><span class='strut'> </span></p>
+<p id='t1812' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1813' class='pln'><span class='str'> This line was newly</span><span class='strut'> </span></p>
+<p id='t1814' class='pln'><span class='str'> generated by cog</span><span class='strut'> </span></p>
+<p id='t1815' class='pln'><span class='str'> blah blah.</span><span class='strut'> </span></p>
+<p id='t1816' class='pln'><span class='str'> extra</span><span class='strut'> </span></p>
+<p id='t1817' class='pln'><span class='str'> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class='strut'> </span></p>
+<p id='t1818' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1819' class='pln'><span class='strut'> </span></p>
+<p id='t1820' class='pln'> <span class='str'>'cog6.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1821' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1822' class='pln'><span class='str'> cog.outl("This line was newly")</span><span class='strut'> </span></p>
+<p id='t1823' class='pln'><span class='str'> cog.outl("generated by cog")</span><span class='strut'> </span></p>
+<p id='t1824' class='pln'><span class='str'> cog.outl("blah blah.")</span><span class='strut'> </span></p>
+<p id='t1825' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1826' class='pln'><span class='str'> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class='strut'> </span></p>
+<p id='t1827' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1828' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t1829' class='pln'><span class='strut'> </span></p>
+<p id='t1830' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1831' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaisesMsg</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1832' class='pln'> <span class='str'>"cog1.txt(9): Output has been edited! Delete old checksum to unprotect."</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1833' class='pln'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-c'</span><span class='op'>,</span> <span class='str'>"cog1.txt"</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1834' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaisesMsg</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1835' class='pln'> <span class='str'>"cog2.txt(9): Output has been edited! Delete old checksum to unprotect."</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1836' class='pln'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-c'</span><span class='op'>,</span> <span class='str'>"cog2.txt"</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1837' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaisesMsg</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1838' class='pln'> <span class='str'>"cog3.txt(10): Output has been edited! Delete old checksum to unprotect."</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1839' class='pln'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-c'</span><span class='op'>,</span> <span class='str'>"cog3.txt"</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1840' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaisesMsg</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1841' class='pln'> <span class='str'>"cog4.txt(9): Output has been edited! Delete old checksum to unprotect."</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1842' class='pln'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-c'</span><span class='op'>,</span> <span class='str'>"cog4.txt"</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1843' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaisesMsg</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1844' class='pln'> <span class='str'>"cog5.txt(10): Output has been edited! Delete old checksum to unprotect."</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1845' class='pln'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-c'</span><span class='op'>,</span> <span class='str'>"cog5.txt"</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1846' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaisesMsg</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1847' class='pln'> <span class='str'>"cog6.txt(6): Output has been edited! Delete old checksum to unprotect."</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1848' class='pln'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-c'</span><span class='op'>,</span> <span class='str'>"cog6.txt"</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1849' class='pln'><span class='strut'> </span></p>
+<p id='t1850' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>BlakeTests</span><span class='op'>(</span><span class='nam'>TestCaseWithTempDir</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1851' class='pln'><span class='strut'> </span></p>
+<p id='t1852' class='pln'> <span class='com'># Blake Winton's contributions. </span><span class='strut'> </span></p>
+<p id='t1853' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testDeleteCode</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1854' class='pln'> <span class='com'># -o sets the output file.</span><span class='strut'> </span></p>
+<p id='t1855' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1856' class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1857' class='pln'><span class='str'> // This is my C++ file.</span><span class='strut'> </span></p>
+<p id='t1858' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1859' class='pln'><span class='str'> fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing']</span><span class='strut'> </span></p>
+<p id='t1860' class='pln'><span class='str'> for fn in fnames:</span><span class='strut'> </span></p>
+<p id='t1861' class='pln'><span class='str'> cog.outl("void %s();" % fn)</span><span class='strut'> </span></p>
+<p id='t1862' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1863' class='pln'><span class='str'> Some Sample Code Here</span><span class='strut'> </span></p>
+<p id='t1864' class='pln'><span class='str'> //[[[end]]]Data Data</span><span class='strut'> </span></p>
+<p id='t1865' class='pln'><span class='str'> And Some More</span><span class='strut'> </span></p>
+<p id='t1866' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1867' class='pln'><span class='strut'> </span></p>
+<p id='t1868' class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1869' class='pln'><span class='str'> // This is my C++ file.</span><span class='strut'> </span></p>
+<p id='t1870' class='pln'><span class='str'> void DoSomething();</span><span class='strut'> </span></p>
+<p id='t1871' class='pln'><span class='str'> void DoAnotherThing();</span><span class='strut'> </span></p>
+<p id='t1872' class='pln'><span class='str'> void DoLastThing();</span><span class='strut'> </span></p>
+<p id='t1873' class='pln'><span class='str'> And Some More</span><span class='strut'> </span></p>
+<p id='t1874' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1875' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t1876' class='pln'><span class='strut'> </span></p>
+<p id='t1877' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1878' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-d'</span><span class='op'>,</span> <span class='str'>'-o'</span><span class='op'>,</span> <span class='str'>'test.cogged'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1879' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cogged'</span><span class='op'>,</span> <span class='str'>'test.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1880' class='pln'><span class='strut'> </span></p>
+<p id='t1881' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testDeleteCodeWithDashRFails</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1882' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1883' class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1884' class='pln'><span class='str'> // This is my C++ file.</span><span class='strut'> </span></p>
+<p id='t1885' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t1886' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t1887' class='pln'><span class='strut'> </span></p>
+<p id='t1888' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1889' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertRaises</span><span class='op'>(</span><span class='nam'>CogUsageError</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'-d'</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1890' class='pln'><span class='strut'> </span></p>
+<p id='t1891' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testSettingGlobals</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1892' class='pln'> <span class='com'># Blake Winton contributed a way to set the globals that will be used in</span><span class='strut'> </span></p>
+<p id='t1893' class='pln'> <span class='com'># processFile().</span><span class='strut'> </span></p>
+<p id='t1894' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1895' class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1896' class='pln'><span class='str'> // This is my C++ file.</span><span class='strut'> </span></p>
+<p id='t1897' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1898' class='pln'><span class='str'> for fn in fnames:</span><span class='strut'> </span></p>
+<p id='t1899' class='pln'><span class='str'> cog.outl("void %s();" % fn)</span><span class='strut'> </span></p>
+<p id='t1900' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1901' class='pln'><span class='str'> Some Sample Code Here</span><span class='strut'> </span></p>
+<p id='t1902' class='pln'><span class='str'> //[[[end]]]"""</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1903' class='pln'><span class='strut'> </span></p>
+<p id='t1904' class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1905' class='pln'><span class='str'> // This is my C++ file.</span><span class='strut'> </span></p>
+<p id='t1906' class='pln'><span class='str'> void DoBlake();</span><span class='strut'> </span></p>
+<p id='t1907' class='pln'><span class='str'> void DoWinton();</span><span class='strut'> </span></p>
+<p id='t1908' class='pln'><span class='str'> void DoContribution();</span><span class='strut'> </span></p>
+<p id='t1909' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1910' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t1911' class='pln'><span class='strut'> </span></p>
+<p id='t1912' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1913' class='stm mis'> <span class='nam'>globals</span> <span class='op'>=</span> <span class='op'>{</span><span class='op'>}</span><span class='strut'> </span></p>
+<p id='t1914' class='stm mis'> <span class='nam'>globals</span><span class='op'>[</span><span class='str'>'fnames'</span><span class='op'>]</span> <span class='op'>=</span> <span class='op'>[</span><span class='str'>'DoBlake'</span><span class='op'>,</span> <span class='str'>'DoWinton'</span><span class='op'>,</span> <span class='str'>'DoContribution'</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t1915' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bDeleteCode</span> <span class='op'>=</span> <span class='nam'>True</span><span class='strut'> </span></p>
+<p id='t1916' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>processFile</span><span class='op'>(</span><span class='str'>'test.cog'</span><span class='op'>,</span> <span class='str'>'test.cogged'</span><span class='op'>,</span> <span class='nam'>globals</span><span class='op'>=</span><span class='nam'>globals</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1917' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertFilesSame</span><span class='op'>(</span><span class='str'>'test.cogged'</span><span class='op'>,</span> <span class='str'>'test.out'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1918' class='pln'><span class='strut'> </span></p>
+<p id='t1919' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>ErrorCallTests</span><span class='op'>(</span><span class='nam'>TestCaseWithTempDir</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1920' class='pln'><span class='strut'> </span></p>
+<p id='t1921' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testErrorCallHasNoTraceback</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1922' class='pln'> <span class='com'># Test that cog.error() doesn't show a traceback.</span><span class='strut'> </span></p>
+<p id='t1923' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1924' class='pln'> <span class='str'>'error.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1925' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1926' class='pln'><span class='str'> cog.error("Something Bad!")</span><span class='strut'> </span></p>
+<p id='t1927' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1928' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1929' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1930' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t1931' class='pln'><span class='strut'> </span></p>
+<p id='t1932' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1933' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>main</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'error.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1934' class='stm mis'> <span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1935' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>output</span><span class='op'>,</span> <span class='str'>"Cogging error.cog\nError: Something Bad!\n"</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1936' class='pln'><span class='strut'> </span></p>
+<p id='t1937' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testRealErrorHasTraceback</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t1938' class='pln'> <span class='com'># Test that a genuine error does show a traceback.</span><span class='strut'> </span></p>
+<p id='t1939' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p>
+<p id='t1940' class='pln'> <span class='str'>'error.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p>
+<p id='t1941' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p>
+<p id='t1942' class='pln'><span class='str'> raise RuntimeError("Hey!")</span><span class='strut'> </span></p>
+<p id='t1943' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p>
+<p id='t1944' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p>
+<p id='t1945' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p>
+<p id='t1946' class='pln'> <span class='op'>}</span><span class='strut'> </span></p>
+<p id='t1947' class='pln'><span class='strut'> </span></p>
+<p id='t1948' class='stm mis'> <span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1949' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cog</span><span class='op'>.</span><span class='nam'>main</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'argv0'</span><span class='op'>,</span> <span class='str'>'-r'</span><span class='op'>,</span> <span class='str'>'error.cog'</span><span class='op'>]</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1950' class='stm mis'> <span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1951' class='stm mis'> <span class='nam'>msg</span> <span class='op'>=</span> <span class='str'>'Actual output:\n'</span> <span class='op'>+</span> <span class='nam'>output</span><span class='strut'> </span></p>
+<p id='t1952' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assert_</span><span class='op'>(</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>startswith</span><span class='op'>(</span><span class='str'>"Cogging error.cog\nTraceback (most recent"</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1953' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assert_</span><span class='op'>(</span><span class='nam'>output</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='str'>"RuntimeError: Hey!"</span><span class='op'>)</span> <span class='op'>></span> <span class='num'>0</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1954' class='pln'><span class='strut'> </span></p>
+<p id='t1955' class='pln'><span class='strut'> </span></p>
+<p id='t1956' class='exc'><span class='key'>if</span> <span class='nam'>__name__</span> <span class='op'>==</span> <span class='str'>'__main__'</span><span class='op'>:</span> <span class='com'>#pragma: no cover</span><span class='strut'> </span></p>
+<p id='t1957' class='exc'> <span class='nam'>unittest</span><span class='op'>.</span><span class='nam'>main</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t1958' class='pln'><span class='strut'> </span></p>
+<p id='t1959' class='pln'><span class='com'># Things not yet tested:</span><span class='strut'> </span></p>
+<p id='t1960' class='pln'><span class='com'># - A bad -w command (currently fails silently).</span><span class='strut'> </span></p>
+
+ </td>
+ </tr>
+ </table>
</div>
</body>
diff --git a/doc/sample_html/cogapp_whiteutils.html b/doc/sample_html/cogapp_whiteutils.html index b2aaf865..621c89b9 100644 --- a/doc/sample_html/cogapp_whiteutils.html +++ b/doc/sample_html/cogapp_whiteutils.html @@ -1,24 +1,14 @@ -<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
-<title>Coverage for cogapp\whiteutils</title>
-<link rel='stylesheet' href='style.css' type='text/css'>
-<script src='jquery-1.3.2.min.js'></script>
-<script>
-function toggle_lines(btn, cls) {
- var btn = $(btn);
- if (btn.hasClass("hide")) {
- $("#source ."+cls).removeClass("hide");
- btn.removeClass("hide");
- }
- else {
- $("#source ."+cls).addClass("hide");
- btn.addClass("hide");
- }
-}
-</script>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+ <title>Coverage for cogapp\whiteutils: 92%</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
</head>
<body>
+
<div id='header'>
<div class='content'>
<h1>Coverage for <b>cogapp\whiteutils</b> :
@@ -26,150 +16,153 @@ function toggle_lines(btn, cls) { </h1>
<h2 class='stats'>
37 statements
- <span class='run hide' onclick='toggle_lines(this, "run")'>34 run</span>
+ <span class='run hide_run' onclick='toggle_lines(this, "run")'>34 run</span>
<span class='exc' onclick='toggle_lines(this, "exc")'>0 excluded</span>
<span class='mis' onclick='toggle_lines(this, "mis")'>3 missing</span>
+
+ <span class='par run hide_run' onclick='toggle_lines(this, "par")'>2 partial</span>
+
</h2>
</div>
</div>
<div id='source'>
-<table cellspacing='0' cellpadding='0'>
-<tr>
-<td class='linenos' valign='top'>
-<p class='pln'>1</p>
-<p class='pln'>2</p>
-<p class='pln'>3</p>
-<p class='pln'>4</p>
-<p class='pln'>5</p>
-<p class='pln'>6</p>
-<p class='stm run hide'>7</p>
-<p class='pln'>8</p>
-<p class='stm run hide'>9</p>
-<p class='pln'>10</p>
-<p class='pln'>11</p>
-<p class='pln'>12</p>
-<p class='pln'>13</p>
-<p class='stm run hide'>14</p>
-<p class='pln'>15</p>
-<p class='stm run hide'>16</p>
-<p class='pln'>17</p>
-<p class='pln'>18</p>
-<p class='pln'>19</p>
-<p class='stm run hide'>20</p>
-<p class='pln'>21</p>
-<p class='pln'>22</p>
-<p class='pln'>23</p>
-<p class='stm run hide'>24</p>
-<p class='stm run hide'>25</p>
-<p class='stm run hide'>26</p>
-<p class='stm mis'>27</p>
-<p class='stm mis'>28</p>
-<p class='stm run hide'>29</p>
-<p class='pln'>30</p>
-<p class='stm run hide'>31</p>
-<p class='pln'>32</p>
-<p class='pln'>33</p>
-<p class='pln'>34</p>
-<p class='pln'>35</p>
-<p class='stm run hide'>36</p>
-<p class='stm run hide'>37</p>
-<p class='stm run hide'>38</p>
-<p class='stm run hide'>39</p>
-<p class='stm run hide'>40</p>
-<p class='stm run hide'>41</p>
-<p class='stm run hide'>42</p>
-<p class='stm run hide'>43</p>
-<p class='stm run hide'>44</p>
-<p class='stm run hide'>45</p>
-<p class='stm run hide'>46</p>
-<p class='pln'>47</p>
-<p class='stm run hide'>48</p>
-<p class='pln'>49</p>
-<p class='pln'>50</p>
-<p class='stm run hide'>51</p>
-<p class='stm mis'>52</p>
-<p class='stm run hide'>53</p>
-<p class='stm run hide'>54</p>
-<p class='stm run hide'>55</p>
-<p class='stm run hide'>56</p>
-<p class='stm run hide'>57</p>
-<p class='stm run hide'>58</p>
-<p class='stm run hide'>59</p>
-<p class='stm run hide'>60</p>
-<p class='stm run hide'>61</p>
-<p class='stm run hide'>62</p>
-<p class='stm run hide'>63</p>
-
-</td>
-<td class='text' valign='top'>
-<p class='pln'><span class='str'>""" Indentation utilities for Cog.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> http://nedbatchelder.com/code/cog</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> </span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Copyright 2004-2009, Ned Batchelder.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'>"""</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>import</span> <span class='nam'>re</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>def</span> <span class='nam'>whitePrefix</span><span class='op'>(</span><span class='nam'>strings</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Determine the whitespace prefix common to all non-blank lines</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> in the argument list.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Remove all blank lines from the list</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>strings</span> <span class='op'>=</span> <span class='op'>[</span><span class='nam'>s</span> <span class='key'>for</span> <span class='nam'>s</span> <span class='key'>in</span> <span class='nam'>strings</span> <span class='key'>if</span> <span class='nam'>s</span><span class='op'>.</span><span class='nam'>strip</span><span class='op'>(</span><span class='op'>)</span> <span class='op'>!=</span> <span class='str'>''</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>strings</span><span class='op'>:</span> <span class='key'>return</span> <span class='str'>''</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Find initial whitespace chunk in the first line.</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># This is the best prefix we can hope for.</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>prefix</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='str'>r'\s*'</span><span class='op'>,</span> <span class='nam'>strings</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>0</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Loop over the other strings, keeping only as much of</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># the prefix as matches each string.</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>for</span> <span class='nam'>s</span> <span class='key'>in</span> <span class='nam'>strings</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>for</span> <span class='nam'>i</span> <span class='key'>in</span> <span class='nam'>range</span><span class='op'>(</span><span class='nam'>len</span><span class='op'>(</span><span class='nam'>prefix</span><span class='op'>)</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>prefix</span><span class='op'>[</span><span class='nam'>i</span><span class='op'>]</span> <span class='op'>!=</span> <span class='nam'>s</span><span class='op'>[</span><span class='nam'>i</span><span class='op'>]</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>prefix</span> <span class='op'>=</span> <span class='nam'>prefix</span><span class='op'>[</span><span class='op'>:</span><span class='nam'>i</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>break</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>return</span> <span class='nam'>prefix</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>def</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>lines</span><span class='op'>,</span> <span class='nam'>newIndent</span><span class='op'>=</span><span class='str'>''</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Take a block of text as a string or list of lines.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Remove any common whitespace indentation.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> Re-indent using newIndent, and return it as a single string.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>lines</span><span class='op'>,</span> <span class='nam'>basestring</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>lines</span> <span class='op'>=</span> <span class='nam'>lines</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>'\n'</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>oldIndent</span> <span class='op'>=</span> <span class='nam'>whitePrefix</span><span class='op'>(</span><span class='nam'>lines</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>outLines</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>for</span> <span class='nam'>l</span> <span class='key'>in</span> <span class='nam'>lines</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>oldIndent</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>l</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='nam'>oldIndent</span><span class='op'>,</span> <span class='str'>''</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>l</span> <span class='key'>and</span> <span class='nam'>newIndent</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>newIndent</span> <span class='op'>+</span> <span class='nam'>l</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>outLines</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>return</span> <span class='str'>'\n'</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>outLines</span><span class='op'>)</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>def</span> <span class='nam'>commonPrefix</span><span class='op'>(</span><span class='nam'>strings</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='str'>""" Find the longest string that is a prefix of all the strings.</span><span class="strut"> </span></p>
-<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>strings</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='key'>return</span> <span class='str'>''</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>prefix</span> <span class='op'>=</span> <span class='nam'>strings</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>for</span> <span class='nam'>s</span> <span class='key'>in</span> <span class='nam'>strings</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>s</span><span class='op'>)</span> <span class='op'><</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>prefix</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>prefix</span> <span class='op'>=</span> <span class='nam'>prefix</span><span class='op'>[</span><span class='op'>:</span><span class='nam'>len</span><span class='op'>(</span><span class='nam'>s</span><span class='op'>)</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>prefix</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>return</span> <span class='str'>''</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>for</span> <span class='nam'>i</span> <span class='key'>in</span> <span class='nam'>range</span><span class='op'>(</span><span class='nam'>len</span><span class='op'>(</span><span class='nam'>prefix</span><span class='op'>)</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>prefix</span><span class='op'>[</span><span class='nam'>i</span><span class='op'>]</span> <span class='op'>!=</span> <span class='nam'>s</span><span class='op'>[</span><span class='nam'>i</span><span class='op'>]</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>prefix</span> <span class='op'>=</span> <span class='nam'>prefix</span><span class='op'>[</span><span class='op'>:</span><span class='nam'>i</span><span class='op'>]</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>break</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='key'>return</span> <span class='nam'>prefix</span><span class="strut"> </span></p>
-
-</td>
-</tr>
-</table>
+ <table cellspacing='0' cellpadding='0'>
+ <tr>
+ <td class='linenos' valign='top'>
+<p id='n1' class='pln'>1</p>
+<p id='n2' class='pln'>2</p>
+<p id='n3' class='pln'>3</p>
+<p id='n4' class='pln'>4</p>
+<p id='n5' class='pln'>5</p>
+<p id='n6' class='pln'>6</p>
+<p id='n7' class='stm run hide_run'>7</p>
+<p id='n8' class='pln'>8</p>
+<p id='n9' class='stm run hide_run'>9</p>
+<p id='n10' class='pln'>10</p>
+<p id='n11' class='pln'>11</p>
+<p id='n12' class='pln'>12</p>
+<p id='n13' class='pln'>13</p>
+<p id='n14' class='stm run hide_run'>14</p>
+<p id='n15' class='pln'>15</p>
+<p id='n16' class='stm run hide_run'>16</p>
+<p id='n17' class='pln'>17</p>
+<p id='n18' class='pln'>18</p>
+<p id='n19' class='pln'>19</p>
+<p id='n20' class='stm run hide_run'>20</p>
+<p id='n21' class='pln'>21</p>
+<p id='n22' class='pln'>22</p>
+<p id='n23' class='pln'>23</p>
+<p id='n24' class='stm run hide_run'>24</p>
+<p id='n25' class='stm run hide_run'>25</p>
+<p id='n26' class='stm par run hide_run'>26</p>
+<p id='n27' class='stm mis'>27</p>
+<p id='n28' class='stm mis'>28</p>
+<p id='n29' class='stm run hide_run'>29</p>
+<p id='n30' class='pln'>30</p>
+<p id='n31' class='stm run hide_run'>31</p>
+<p id='n32' class='pln'>32</p>
+<p id='n33' class='pln'>33</p>
+<p id='n34' class='pln'>34</p>
+<p id='n35' class='pln'>35</p>
+<p id='n36' class='stm run hide_run'>36</p>
+<p id='n37' class='stm run hide_run'>37</p>
+<p id='n38' class='stm run hide_run'>38</p>
+<p id='n39' class='stm run hide_run'>39</p>
+<p id='n40' class='stm run hide_run'>40</p>
+<p id='n41' class='stm run hide_run'>41</p>
+<p id='n42' class='stm run hide_run'>42</p>
+<p id='n43' class='stm run hide_run'>43</p>
+<p id='n44' class='stm run hide_run'>44</p>
+<p id='n45' class='stm run hide_run'>45</p>
+<p id='n46' class='stm run hide_run'>46</p>
+<p id='n47' class='pln'>47</p>
+<p id='n48' class='stm run hide_run'>48</p>
+<p id='n49' class='pln'>49</p>
+<p id='n50' class='pln'>50</p>
+<p id='n51' class='stm par run hide_run'>51</p>
+<p id='n52' class='stm mis'>52</p>
+<p id='n53' class='stm run hide_run'>53</p>
+<p id='n54' class='stm run hide_run'>54</p>
+<p id='n55' class='stm run hide_run'>55</p>
+<p id='n56' class='stm run hide_run'>56</p>
+<p id='n57' class='stm run hide_run'>57</p>
+<p id='n58' class='stm run hide_run'>58</p>
+<p id='n59' class='stm run hide_run'>59</p>
+<p id='n60' class='stm run hide_run'>60</p>
+<p id='n61' class='stm run hide_run'>61</p>
+<p id='n62' class='stm run hide_run'>62</p>
+<p id='n63' class='stm run hide_run'>63</p>
+
+ </td>
+ <td class='text' valign='top'>
+<p id='t1' class='pln'><span class='str'>""" Indentation utilities for Cog.</span><span class='strut'> </span></p>
+<p id='t2' class='pln'><span class='str'> http://nedbatchelder.com/code/cog</span><span class='strut'> </span></p>
+<p id='t3' class='pln'><span class='str'> </span><span class='strut'> </span></p>
+<p id='t4' class='pln'><span class='str'> Copyright 2004-2009, Ned Batchelder.</span><span class='strut'> </span></p>
+<p id='t5' class='pln'><span class='str'>"""</span><span class='strut'> </span></p>
+<p id='t6' class='pln'><span class='strut'> </span></p>
+<p id='t7' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>re</span><span class='strut'> </span></p>
+<p id='t8' class='pln'><span class='strut'> </span></p>
+<p id='t9' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>whitePrefix</span><span class='op'>(</span><span class='nam'>strings</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t10' class='pln'> <span class='str'>""" Determine the whitespace prefix common to all non-blank lines</span><span class='strut'> </span></p>
+<p id='t11' class='pln'><span class='str'> in the argument list.</span><span class='strut'> </span></p>
+<p id='t12' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t13' class='pln'> <span class='com'># Remove all blank lines from the list</span><span class='strut'> </span></p>
+<p id='t14' class='stm run hide_run'> <span class='nam'>strings</span> <span class='op'>=</span> <span class='op'>[</span><span class='nam'>s</span> <span class='key'>for</span> <span class='nam'>s</span> <span class='key'>in</span> <span class='nam'>strings</span> <span class='key'>if</span> <span class='nam'>s</span><span class='op'>.</span><span class='nam'>strip</span><span class='op'>(</span><span class='op'>)</span> <span class='op'>!=</span> <span class='str'>''</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t15' class='pln'><span class='strut'> </span></p>
+<p id='t16' class='stm run hide_run'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>strings</span><span class='op'>:</span> <span class='key'>return</span> <span class='str'>''</span><span class='strut'> </span></p>
+<p id='t17' class='pln'><span class='strut'> </span></p>
+<p id='t18' class='pln'> <span class='com'># Find initial whitespace chunk in the first line.</span><span class='strut'> </span></p>
+<p id='t19' class='pln'> <span class='com'># This is the best prefix we can hope for.</span><span class='strut'> </span></p>
+<p id='t20' class='stm run hide_run'> <span class='nam'>prefix</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='str'>r'\s*'</span><span class='op'>,</span> <span class='nam'>strings</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>0</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t21' class='pln'><span class='strut'> </span></p>
+<p id='t22' class='pln'> <span class='com'># Loop over the other strings, keeping only as much of</span><span class='strut'> </span></p>
+<p id='t23' class='pln'> <span class='com'># the prefix as matches each string.</span><span class='strut'> </span></p>
+<p id='t24' class='stm run hide_run'> <span class='key'>for</span> <span class='nam'>s</span> <span class='key'>in</span> <span class='nam'>strings</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t25' class='stm run hide_run'> <span class='key'>for</span> <span class='nam'>i</span> <span class='key'>in</span> <span class='nam'>range</span><span class='op'>(</span><span class='nam'>len</span><span class='op'>(</span><span class='nam'>prefix</span><span class='op'>)</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t26' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>27</span> <span class='key'>if</span> <span class='nam'>prefix</span><span class='op'>[</span><span class='nam'>i</span><span class='op'>]</span> <span class='op'>!=</span> <span class='nam'>s</span><span class='op'>[</span><span class='nam'>i</span><span class='op'>]</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t27' class='stm mis'> <span class='nam'>prefix</span> <span class='op'>=</span> <span class='nam'>prefix</span><span class='op'>[</span><span class='op'>:</span><span class='nam'>i</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t28' class='stm mis'> <span class='key'>break</span><span class='strut'> </span></p>
+<p id='t29' class='stm run hide_run'> <span class='key'>return</span> <span class='nam'>prefix</span><span class='strut'> </span></p>
+<p id='t30' class='pln'><span class='strut'> </span></p>
+<p id='t31' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>lines</span><span class='op'>,</span> <span class='nam'>newIndent</span><span class='op'>=</span><span class='str'>''</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t32' class='pln'> <span class='str'>""" Take a block of text as a string or list of lines.</span><span class='strut'> </span></p>
+<p id='t33' class='pln'><span class='str'> Remove any common whitespace indentation.</span><span class='strut'> </span></p>
+<p id='t34' class='pln'><span class='str'> Re-indent using newIndent, and return it as a single string.</span><span class='strut'> </span></p>
+<p id='t35' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t36' class='stm run hide_run'> <span class='key'>if</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>lines</span><span class='op'>,</span> <span class='nam'>basestring</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t37' class='stm run hide_run'> <span class='nam'>lines</span> <span class='op'>=</span> <span class='nam'>lines</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>'\n'</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t38' class='stm run hide_run'> <span class='nam'>oldIndent</span> <span class='op'>=</span> <span class='nam'>whitePrefix</span><span class='op'>(</span><span class='nam'>lines</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t39' class='stm run hide_run'> <span class='nam'>outLines</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t40' class='stm run hide_run'> <span class='key'>for</span> <span class='nam'>l</span> <span class='key'>in</span> <span class='nam'>lines</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t41' class='stm run hide_run'> <span class='key'>if</span> <span class='nam'>oldIndent</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t42' class='stm run hide_run'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>l</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='nam'>oldIndent</span><span class='op'>,</span> <span class='str'>''</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t43' class='stm run hide_run'> <span class='key'>if</span> <span class='nam'>l</span> <span class='key'>and</span> <span class='nam'>newIndent</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t44' class='stm run hide_run'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>newIndent</span> <span class='op'>+</span> <span class='nam'>l</span><span class='strut'> </span></p>
+<p id='t45' class='stm run hide_run'> <span class='nam'>outLines</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t46' class='stm run hide_run'> <span class='key'>return</span> <span class='str'>'\n'</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>outLines</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t47' class='pln'><span class='strut'> </span></p>
+<p id='t48' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>commonPrefix</span><span class='op'>(</span><span class='nam'>strings</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t49' class='pln'> <span class='str'>""" Find the longest string that is a prefix of all the strings.</span><span class='strut'> </span></p>
+<p id='t50' class='pln'><span class='str'> """</span><span class='strut'> </span></p>
+<p id='t51' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>52</span> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>strings</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t52' class='stm mis'> <span class='key'>return</span> <span class='str'>''</span><span class='strut'> </span></p>
+<p id='t53' class='stm run hide_run'> <span class='nam'>prefix</span> <span class='op'>=</span> <span class='nam'>strings</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t54' class='stm run hide_run'> <span class='key'>for</span> <span class='nam'>s</span> <span class='key'>in</span> <span class='nam'>strings</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t55' class='stm run hide_run'> <span class='key'>if</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>s</span><span class='op'>)</span> <span class='op'><</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>prefix</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t56' class='stm run hide_run'> <span class='nam'>prefix</span> <span class='op'>=</span> <span class='nam'>prefix</span><span class='op'>[</span><span class='op'>:</span><span class='nam'>len</span><span class='op'>(</span><span class='nam'>s</span><span class='op'>)</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t57' class='stm run hide_run'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>prefix</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t58' class='stm run hide_run'> <span class='key'>return</span> <span class='str'>''</span><span class='strut'> </span></p>
+<p id='t59' class='stm run hide_run'> <span class='key'>for</span> <span class='nam'>i</span> <span class='key'>in</span> <span class='nam'>range</span><span class='op'>(</span><span class='nam'>len</span><span class='op'>(</span><span class='nam'>prefix</span><span class='op'>)</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t60' class='stm run hide_run'> <span class='key'>if</span> <span class='nam'>prefix</span><span class='op'>[</span><span class='nam'>i</span><span class='op'>]</span> <span class='op'>!=</span> <span class='nam'>s</span><span class='op'>[</span><span class='nam'>i</span><span class='op'>]</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t61' class='stm run hide_run'> <span class='nam'>prefix</span> <span class='op'>=</span> <span class='nam'>prefix</span><span class='op'>[</span><span class='op'>:</span><span class='nam'>i</span><span class='op'>]</span><span class='strut'> </span></p>
+<p id='t62' class='stm run hide_run'> <span class='key'>break</span><span class='strut'> </span></p>
+<p id='t63' class='stm run hide_run'> <span class='key'>return</span> <span class='nam'>prefix</span><span class='strut'> </span></p>
+
+ </td>
+ </tr>
+ </table>
</div>
</body>
diff --git a/doc/sample_html/coverage_html.js b/doc/sample_html/coverage_html.js new file mode 100644 index 00000000..b70712c4 --- /dev/null +++ b/doc/sample_html/coverage_html.js @@ -0,0 +1,79 @@ +// Coverage.py HTML report browser code. + +// Loaded on index.html +function index_page_ready($) { + // Look for a cookie containing previous sort settings: + sort_list = []; + cookie_name = "COVERAGE_INDEX_SORT"; + + // This almost makes it worth installing the jQuery cookie plugin: + if (document.cookie.indexOf(cookie_name) > -1) { + cookies = document.cookie.split(";"); + for (var i=0; i < cookies.length; i++) { + parts = cookies[i].split("=") + + if ($.trim(parts[0]) == cookie_name && parts[1]) { + sort_list = eval("[[" + parts[1] + "]]"); + break; + } + } + } + + // Create a new widget which exists only to save and restore + // the sort order: + $.tablesorter.addWidget({ + id: "persistentSort", + + // Format is called by the widget before displaying: + format: function(table) { + if (table.config.sortList.length == 0 && sort_list.length > 0) { + // This table hasn't been sorted before - we'll use + // our stored settings: + jQuery(table).trigger('sorton', [sort_list]); + } + else { + // This is not the first load - something has + // already defined sorting so we'll just update + // our stored value to match: + sort_list = table.config.sortList; + } + } + }); + + // Configure our tablesorter to handle the variable number of + // columns produced depending on report options: + var headers = {}; + var col_count = jQuery("table.index > thead > tr > th").length; + + headers[0] = { sorter: 'text' }; + for (var i = 1; i < col_count-1; i++) { + headers[i] = { sorter: 'digit' }; + } + headers[col_count-1] = { sorter: 'percent' }; + + // Enable the table sorter: + $("table.index").tablesorter({ + widgets: ['persistentSort'], + headers: headers + }); + + // Watch for page unload events so we can save the final sort settings: + $(window).unload(function() { + document.cookie = cookie_name + "=" + sort_list.toString() + "; path=/" + }); +} + +// -- pyfile stuff -- + +function toggle_lines(btn, cls) { + var btn = $(btn); + var hide = "hide_"+cls; + if (btn.hasClass(hide)) { + $("#source ."+cls).removeClass(hide); + btn.removeClass(hide); + } + else { + $("#source ."+cls).addClass(hide); + btn.addClass(hide); + } +} diff --git a/doc/sample_html/index.html b/doc/sample_html/index.html index c44d3559..d2fe7f2e 100644 --- a/doc/sample_html/index.html +++ b/doc/sample_html/index.html @@ -1,83 +1,126 @@ -<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
-<title>Coverage report</title>
-<link rel='stylesheet' href='style.css' type='text/css'>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+ <title>Coverage report</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='jquery.tablesorter.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
+ <script type='text/javascript' charset='utf-8'>
+ jQuery(document).ready(index_page_ready);
+ </script>
</head>
<body>
<div id='header'>
<div class='content'>
- <h1>Coverage report:
- <span class='pc_cov'>43%</span>
+ <h1>Coverage report:
+ <span class='pc_cov'>41%</span>
</h1>
</div>
</div>
<div id='index'>
-<table class='index'>
-<tr>
- <th class='name'>Module</th>
- <th>statements</th>
- <th>run</th>
- <th>excluded</th>
- <th>coverage</th>
-</tr>
-
-<tr>
- <td class='name'><a href='_ned_py_path.html'>c:\ned\py\path</a></td>
- <td>286</td>
- <td>114</td>
- <td>0</td>
- <td>40%</td>
-</tr>
-
-<tr>
- <td class='name'><a href='cogapp_cogapp.html'>cogapp\cogapp</a></td>
- <td>387</td>
- <td>219</td>
- <td>3</td>
- <td>57%</td>
-</tr>
-
-<tr>
- <td class='name'><a href='cogapp_makefiles.html'>cogapp\makefiles</a></td>
- <td>29</td>
- <td>6</td>
- <td>3</td>
- <td>21%</td>
-</tr>
-
-<tr>
- <td class='name'><a href='cogapp_test_cogapp.html'>cogapp\test_cogapp</a></td>
- <td>587</td>
- <td>195</td>
- <td>17</td>
- <td>33%</td>
-</tr>
-
-<tr>
- <td class='name'><a href='cogapp_whiteutils.html'>cogapp\whiteutils</a></td>
- <td>37</td>
- <td>34</td>
- <td>0</td>
- <td>92%</td>
-</tr>
-
-<tr class='total'>
-<td class='name'>Total</td>
-<td>1326</td>
-<td>568</td>
-<td>23</td>
-<td>43%</td>
-</tr>
-</table>
+ <table class='index'>
+ <thead>
+
+ <tr class='tablehead' title='Click to sort'>
+ <th class='name left headerSortDown'>Module</th>
+ <th>statements</th>
+ <th>run</th>
+ <th>excluded</th>
+
+ <th>branches</th>
+ <th>br exec</th>
+
+ <th class='right'>coverage</th>
+ </tr>
+ </thead>
+
+ <tfoot>
+ <tr class='total'>
+ <td class='name left'>Total</td>
+ <td>1326</td>
+ <td>568</td>
+ <td>23</td>
+
+ <td>305</td>
+ <td>104</td>
+
+ <td class='right'>41%</td>
+ </tr>
+ </tfoot>
+ <tbody>
+
+ <tr class='file'>
+ <td class='name left'><a href='_ned_py_path.html'>c:\ned\py\path</a></td>
+ <td>286</td>
+ <td>114</td>
+ <td>0</td>
+
+ <td>104</td>
+ <td>22</td>
+
+ <td class='right'>35%</td>
+ </tr>
+
+ <tr class='file'>
+ <td class='name left'><a href='cogapp_cogapp.html'>cogapp\cogapp</a></td>
+ <td>387</td>
+ <td>219</td>
+ <td>3</td>
+
+ <td>153</td>
+ <td>54</td>
+
+ <td class='right'>51%</td>
+ </tr>
+
+ <tr class='file'>
+ <td class='name left'><a href='cogapp_makefiles.html'>cogapp\makefiles</a></td>
+ <td>29</td>
+ <td>6</td>
+ <td>3</td>
+
+ <td>16</td>
+ <td>0</td>
+
+ <td class='right'>13%</td>
+ </tr>
+
+ <tr class='file'>
+ <td class='name left'><a href='cogapp_test_cogapp.html'>cogapp\test_cogapp</a></td>
+ <td>587</td>
+ <td>195</td>
+ <td>17</td>
+
+ <td>4</td>
+ <td>2</td>
+
+ <td class='right'>33%</td>
+ </tr>
+
+ <tr class='file'>
+ <td class='name left'><a href='cogapp_whiteutils.html'>cogapp\whiteutils</a></td>
+ <td>37</td>
+ <td>34</td>
+ <td>0</td>
+
+ <td>28</td>
+ <td>26</td>
+
+ <td class='right'>92%</td>
+ </tr>
+
+ </tbody>
+ </table>
</div>
<div id='footer'>
<div class='content'>
<p>
- <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.1</a>
+ <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.3.1</a>
</p>
</div>
</div>
diff --git a/doc/sample_html/jquery.tablesorter.min.js b/doc/sample_html/jquery.tablesorter.min.js new file mode 100644 index 00000000..64c70071 --- /dev/null +++ b/doc/sample_html/jquery.tablesorter.min.js @@ -0,0 +1,2 @@ + +(function($){$.extend({tablesorter:new function(){var parsers=[],widgets=[];this.defaults={cssHeader:"header",cssAsc:"headerSortUp",cssDesc:"headerSortDown",sortInitialOrder:"asc",sortMultiSortKey:"shiftKey",sortForce:null,sortAppend:null,textExtraction:"simple",parsers:{},widgets:[],widgetZebra:{css:["even","odd"]},headers:{},widthFixed:false,cancelSelection:true,sortList:[],headerList:[],dateFormat:"us",decimal:'.',debug:false};function benchmark(s,d){log(s+","+(new Date().getTime()-d.getTime())+"ms");}this.benchmark=benchmark;function log(s){if(typeof console!="undefined"&&typeof console.debug!="undefined"){console.log(s);}else{alert(s);}}function buildParserCache(table,$headers){if(table.config.debug){var parsersDebug="";}var rows=table.tBodies[0].rows;if(table.tBodies[0].rows[0]){var list=[],cells=rows[0].cells,l=cells.length;for(var i=0;i<l;i++){var p=false;if($.metadata&&($($headers[i]).metadata()&&$($headers[i]).metadata().sorter)){p=getParserById($($headers[i]).metadata().sorter);}else if((table.config.headers[i]&&table.config.headers[i].sorter)){p=getParserById(table.config.headers[i].sorter);}if(!p){p=detectParserForColumn(table,cells[i]);}if(table.config.debug){parsersDebug+="column:"+i+" parser:"+p.id+"\n";}list.push(p);}}if(table.config.debug){log(parsersDebug);}return list;};function detectParserForColumn(table,node){var l=parsers.length;for(var i=1;i<l;i++){if(parsers[i].is($.trim(getElementText(table.config,node)),table,node)){return parsers[i];}}return parsers[0];}function getParserById(name){var l=parsers.length;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==name.toLowerCase()){return parsers[i];}}return false;}function buildCache(table){if(table.config.debug){var cacheTime=new Date();}var totalRows=(table.tBodies[0]&&table.tBodies[0].rows.length)||0,totalCells=(table.tBodies[0].rows[0]&&table.tBodies[0].rows[0].cells.length)||0,parsers=table.config.parsers,cache={row:[],normalized:[]};for(var i=0;i<totalRows;++i){var c=table.tBodies[0].rows[i],cols=[];cache.row.push($(c));for(var j=0;j<totalCells;++j){cols.push(parsers[j].format(getElementText(table.config,c.cells[j]),table,c.cells[j]));}cols.push(i);cache.normalized.push(cols);cols=null;};if(table.config.debug){benchmark("Building cache for "+totalRows+" rows:",cacheTime);}return cache;};function getElementText(config,node){if(!node)return"";var t="";if(config.textExtraction=="simple"){if(node.childNodes[0]&&node.childNodes[0].hasChildNodes()){t=node.childNodes[0].innerHTML;}else{t=node.innerHTML;}}else{if(typeof(config.textExtraction)=="function"){t=config.textExtraction(node);}else{t=$(node).text();}}return t;}function appendToTable(table,cache){if(table.config.debug){var appendTime=new Date()}var c=cache,r=c.row,n=c.normalized,totalRows=n.length,checkCell=(n[0].length-1),tableBody=$(table.tBodies[0]),rows=[];for(var i=0;i<totalRows;i++){rows.push(r[n[i][checkCell]]);if(!table.config.appender){var o=r[n[i][checkCell]];var l=o.length;for(var j=0;j<l;j++){tableBody[0].appendChild(o[j]);}}}if(table.config.appender){table.config.appender(table,rows);}rows=null;if(table.config.debug){benchmark("Rebuilt table:",appendTime);}applyWidget(table);setTimeout(function(){$(table).trigger("sortEnd");},0);};function buildHeaders(table){if(table.config.debug){var time=new Date();}var meta=($.metadata)?true:false,tableHeadersRows=[];for(var i=0;i<table.tHead.rows.length;i++){tableHeadersRows[i]=0;};$tableHeaders=$("thead th",table);$tableHeaders.each(function(index){this.count=0;this.column=index;this.order=formatSortingOrder(table.config.sortInitialOrder);if(checkHeaderMetadata(this)||checkHeaderOptions(table,index))this.sortDisabled=true;if(!this.sortDisabled){$(this).addClass(table.config.cssHeader);}table.config.headerList[index]=this;});if(table.config.debug){benchmark("Built headers:",time);log($tableHeaders);}return $tableHeaders;};function checkCellColSpan(table,rows,row){var arr=[],r=table.tHead.rows,c=r[row].cells;for(var i=0;i<c.length;i++){var cell=c[i];if(cell.colSpan>1){arr=arr.concat(checkCellColSpan(table,headerArr,row++));}else{if(table.tHead.length==1||(cell.rowSpan>1||!r[row+1])){arr.push(cell);}}}return arr;};function checkHeaderMetadata(cell){if(($.metadata)&&($(cell).metadata().sorter===false)){return true;};return false;}function checkHeaderOptions(table,i){if((table.config.headers[i])&&(table.config.headers[i].sorter===false)){return true;};return false;}function applyWidget(table){var c=table.config.widgets;var l=c.length;for(var i=0;i<l;i++){getWidgetById(c[i]).format(table);}}function getWidgetById(name){var l=widgets.length;for(var i=0;i<l;i++){if(widgets[i].id.toLowerCase()==name.toLowerCase()){return widgets[i];}}};function formatSortingOrder(v){if(typeof(v)!="Number"){i=(v.toLowerCase()=="desc")?1:0;}else{i=(v==(0||1))?v:0;}return i;}function isValueInArray(v,a){var l=a.length;for(var i=0;i<l;i++){if(a[i][0]==v){return true;}}return false;}function setHeadersCss(table,$headers,list,css){$headers.removeClass(css[0]).removeClass(css[1]);var h=[];$headers.each(function(offset){if(!this.sortDisabled){h[this.column]=$(this);}});var l=list.length;for(var i=0;i<l;i++){h[list[i][0]].addClass(css[list[i][1]]);}}function fixColumnWidth(table,$headers){var c=table.config;if(c.widthFixed){var colgroup=$('<colgroup>');$("tr:first td",table.tBodies[0]).each(function(){colgroup.append($('<col>').css('width',$(this).width()));});$(table).prepend(colgroup);};}function updateHeaderSortCount(table,sortList){var c=table.config,l=sortList.length;for(var i=0;i<l;i++){var s=sortList[i],o=c.headerList[s[0]];o.count=s[1];o.count++;}}function multisort(table,sortList,cache){if(table.config.debug){var sortTime=new Date();}var dynamicExp="var sortWrapper = function(a,b) {",l=sortList.length;for(var i=0;i<l;i++){var c=sortList[i][0];var order=sortList[i][1];var s=(getCachedSortType(table.config.parsers,c)=="text")?((order==0)?"sortText":"sortTextDesc"):((order==0)?"sortNumeric":"sortNumericDesc");var e="e"+i;dynamicExp+="var "+e+" = "+s+"(a["+c+"],b["+c+"]); ";dynamicExp+="if("+e+") { return "+e+"; } ";dynamicExp+="else { ";}var orgOrderCol=cache.normalized[0].length-1;dynamicExp+="return a["+orgOrderCol+"]-b["+orgOrderCol+"];";for(var i=0;i<l;i++){dynamicExp+="}; ";}dynamicExp+="return 0; ";dynamicExp+="}; ";eval(dynamicExp);cache.normalized.sort(sortWrapper);if(table.config.debug){benchmark("Sorting on "+sortList.toString()+" and dir "+order+" time:",sortTime);}return cache;};function sortText(a,b){return((a<b)?-1:((a>b)?1:0));};function sortTextDesc(a,b){return((b<a)?-1:((b>a)?1:0));};function sortNumeric(a,b){return a-b;};function sortNumericDesc(a,b){return b-a;};function getCachedSortType(parsers,i){return parsers[i].type;};this.construct=function(settings){return this.each(function(){if(!this.tHead||!this.tBodies)return;var $this,$document,$headers,cache,config,shiftDown=0,sortOrder;this.config={};config=$.extend(this.config,$.tablesorter.defaults,settings);$this=$(this);$headers=buildHeaders(this);this.config.parsers=buildParserCache(this,$headers);cache=buildCache(this);var sortCSS=[config.cssDesc,config.cssAsc];fixColumnWidth(this);$headers.click(function(e){$this.trigger("sortStart");var totalRows=($this[0].tBodies[0]&&$this[0].tBodies[0].rows.length)||0;if(!this.sortDisabled&&totalRows>0){var $cell=$(this);var i=this.column;this.order=this.count++%2;if(!e[config.sortMultiSortKey]){config.sortList=[];if(config.sortForce!=null){var a=config.sortForce;for(var j=0;j<a.length;j++){if(a[j][0]!=i){config.sortList.push(a[j]);}}}config.sortList.push([i,this.order]);}else{if(isValueInArray(i,config.sortList)){for(var j=0;j<config.sortList.length;j++){var s=config.sortList[j],o=config.headerList[s[0]];if(s[0]==i){o.count=s[1];o.count++;s[1]=o.count%2;}}}else{config.sortList.push([i,this.order]);}};setTimeout(function(){setHeadersCss($this[0],$headers,config.sortList,sortCSS);appendToTable($this[0],multisort($this[0],config.sortList,cache));},1);return false;}}).mousedown(function(){if(config.cancelSelection){this.onselectstart=function(){return false};return false;}});$this.bind("update",function(){this.config.parsers=buildParserCache(this,$headers);cache=buildCache(this);}).bind("sorton",function(e,list){$(this).trigger("sortStart");config.sortList=list;var sortList=config.sortList;updateHeaderSortCount(this,sortList);setHeadersCss(this,$headers,sortList,sortCSS);appendToTable(this,multisort(this,sortList,cache));}).bind("appendCache",function(){appendToTable(this,cache);}).bind("applyWidgetId",function(e,id){getWidgetById(id).format(this);}).bind("applyWidgets",function(){applyWidget(this);});if($.metadata&&($(this).metadata()&&$(this).metadata().sortlist)){config.sortList=$(this).metadata().sortlist;}if(config.sortList.length>0){$this.trigger("sorton",[config.sortList]);}applyWidget(this);});};this.addParser=function(parser){var l=parsers.length,a=true;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==parser.id.toLowerCase()){a=false;}}if(a){parsers.push(parser);};};this.addWidget=function(widget){widgets.push(widget);};this.formatFloat=function(s){var i=parseFloat(s);return(isNaN(i))?0:i;};this.formatInt=function(s){var i=parseInt(s);return(isNaN(i))?0:i;};this.isDigit=function(s,config){var DECIMAL='\\'+config.decimal;var exp='/(^[+]?0('+DECIMAL+'0+)?$)|(^([-+]?[1-9][0-9]*)$)|(^([-+]?((0?|[1-9][0-9]*)'+DECIMAL+'(0*[1-9][0-9]*)))$)|(^[-+]?[1-9]+[0-9]*'+DECIMAL+'0+$)/';return RegExp(exp).test($.trim(s));};this.clearTableBody=function(table){if($.browser.msie){function empty(){while(this.firstChild)this.removeChild(this.firstChild);}empty.apply(table.tBodies[0]);}else{table.tBodies[0].innerHTML="";}};}});$.fn.extend({tablesorter:$.tablesorter.construct});var ts=$.tablesorter;ts.addParser({id:"text",is:function(s){return true;},format:function(s){return $.trim(s.toLowerCase());},type:"text"});ts.addParser({id:"digit",is:function(s,table){var c=table.config;return $.tablesorter.isDigit(s,c);},format:function(s){return $.tablesorter.formatFloat(s);},type:"numeric"});ts.addParser({id:"currency",is:function(s){return/^[£$€?.]/.test(s);},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/[^0-9.]/g),""));},type:"numeric"});ts.addParser({id:"ipAddress",is:function(s){return/^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s);},format:function(s){var a=s.split("."),r="",l=a.length;for(var i=0;i<l;i++){var item=a[i];if(item.length==2){r+="0"+item;}else{r+=item;}}return $.tablesorter.formatFloat(r);},type:"numeric"});ts.addParser({id:"url",is:function(s){return/^(https?|ftp|file):\/\/$/.test(s);},format:function(s){return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//),''));},type:"text"});ts.addParser({id:"isoDate",is:function(s){return/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s);},format:function(s){return $.tablesorter.formatFloat((s!="")?new Date(s.replace(new RegExp(/-/g),"/")).getTime():"0");},type:"numeric"});ts.addParser({id:"percent",is:function(s){return/\%$/.test($.trim(s));},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g),""));},type:"numeric"});ts.addParser({id:"usLongDate",is:function(s){return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/));},format:function(s){return $.tablesorter.formatFloat(new Date(s).getTime());},type:"numeric"});ts.addParser({id:"shortDate",is:function(s){return/\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s);},format:function(s,table){var c=table.config;s=s.replace(/\-/g,"/");if(c.dateFormat=="us"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$1/$2");}else if(c.dateFormat=="uk"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$2/$1");}else if(c.dateFormat=="dd/mm/yy"||c.dateFormat=="dd-mm-yy"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/,"$1/$2/$3");}return $.tablesorter.formatFloat(new Date(s).getTime());},type:"numeric"});ts.addParser({id:"time",is:function(s){return/^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s);},format:function(s){return $.tablesorter.formatFloat(new Date("2000/01/01 "+s).getTime());},type:"numeric"});ts.addParser({id:"metadata",is:function(s){return false;},format:function(s,table,cell){var c=table.config,p=(!c.parserMetadataName)?'sortValue':c.parserMetadataName;return $(cell).metadata()[p];},type:"numeric"});ts.addWidget({id:"zebra",format:function(table){if(table.config.debug){var time=new Date();}$("tr:visible",table.tBodies[0]).filter(':even').removeClass(table.config.widgetZebra.css[1]).addClass(table.config.widgetZebra.css[0]).end().filter(':odd').removeClass(table.config.widgetZebra.css[0]).addClass(table.config.widgetZebra.css[1]);if(table.config.debug){$.tablesorter.benchmark("Applying Zebra widget",time);}}});})(jQuery);
\ No newline at end of file diff --git a/doc/sample_html/style.css b/doc/sample_html/style.css index 34ab10e3..25e7d115 100644 --- a/doc/sample_html/style.css +++ b/doc/sample_html/style.css @@ -2,14 +2,14 @@ /* Page-wide styles */ html, body, h1, h2, h3, p, td, th { margin: 0; - padding: 0; - border: 0; - outline: 0; - font-weight: inherit; - font-style: inherit; - font-size: 100%; - font-family: inherit; - vertical-align: baseline; + padding: 0; + border: 0; + outline: 0; + font-weight: inherit; + font-style: inherit; + font-size: 100%; + font-family: inherit; + vertical-align: baseline; } /* Set baseline grid to 16 pt. */ @@ -20,7 +20,7 @@ body { html>body { font-size: 16px; - } + } /* Set base font size to 12/16 */ p { @@ -89,9 +89,14 @@ h2.stats { cursor: pointer; border-color: #999 #ccc #ccc #999; } -.stats span.hide { +.stats span.hide_run, .stats span.hide_exc, +.stats span.hide_mis, .stats span.hide_par, +.stats span.par.hide_run.hide_par { border-color: #ccc #999 #999 #ccc; } +.stats span.par.hide_run { + border-color: #999 #ccc #ccc #999; +} /* Source file styles */ .linenos p { @@ -100,7 +105,7 @@ h2.stats { padding: 0 .5em; color: #999999; font-family: verdana, sans-serif; - font-size: .625em; /* 10/16 */ + font-size: .625em; /* 10/16 */ line-height: 1.6em; /* 16/10 */ } td.text { @@ -110,14 +115,14 @@ td.text { margin: 0; padding: 0 0 0 .5em; border-left: 2px solid #ffffff; - white-space: nowrap; + white-space: nowrap; } .text p.mis { background: #ffdddd; border-left: 2px solid #ff0000; } -.text p.run { +.text p.run, .text p.run.hide_par { background: #ddffdd; border-left: 2px solid #00ff00; } @@ -125,40 +130,69 @@ td.text { background: #eeeeee; border-left: 2px solid #808080; } -.text p.hide { +.text p.par, .text p.par.hide_run { + background: #ffffaa; + border-left: 2px solid #eeee99; + } +.text p.hide_run, .text p.hide_exc, .text p.hide_mis, .text p.hide_par, +.text p.hide_run.hide_par { background: inherit; } +.text span.annotate { + font-family: georgia; + font-style: italic; + color: #666; + float: right; + padding-right: .5em; + } +.text p.hide_par span.annotate { + display: none; + } + /* Syntax coloring */ .text .com { - color: green; - font-style: italic; - line-height: 1px; - } + color: green; + font-style: italic; + line-height: 1px; + } .text .key { - font-weight: bold; - line-height: 1px; - } + font-weight: bold; + line-height: 1px; + } .text .str { - color: #000080; - } + color: #000080; + } /* index styles */ #index td, #index th { text-align: right; - width: 6em; - padding: .25em 0; + width: 5em; + padding: .25em .5em; border-bottom: 1px solid #eee; } #index th { font-style: italic; color: #333; border-bottom: 1px solid #ccc; + cursor: pointer; + } +#index th:hover { + background: #eee; + border-bottom: 1px solid #999; + } +#index td.left, #index th.left { + padding-left: 0; + } +#index td.right, #index th.right { + padding-right: 0; + } +#index th.headerSortDown, #index th.headerSortUp { + border-bottom: 1px solid #000; } #index td.name, #index th.name { text-align: left; width: auto; - height: 1.5em; } #index td.name a { text-decoration: none; @@ -169,10 +203,12 @@ td.text { color: #000; } #index tr.total { - font-weight: bold; } #index tr.total td { - padding: .25em 0; + font-weight: bold; border-top: 1px solid #ccc; border-bottom: none; } +#index tr.file:hover { + background: #eeeeee; + } diff --git a/doc/subprocess.rst b/doc/subprocess.rst new file mode 100644 index 00000000..d976f692 --- /dev/null +++ b/doc/subprocess.rst @@ -0,0 +1,47 @@ +.. _subprocess: + +====================== +Measuring subprocesses +====================== + +:history: 20100224T201800, new for 3.3. + + +Complex test suites may spawn subprocesses to run tests, either to run them in +parallel, or because subprocess behavior is an important part of the code under +test. Measuring coverage in those subprocesses can be tricky because you have +to modify the code spawning the process to invoke coverage.py. + +There's an easier way to do it: coverage.py includes a function, +:func:`coverage.process_startup` designed to be invoked when Python starts. It +examines the ``COVERAGE_PROCESS_START`` environment variable, and if it is set, +begins coverage measurement. Its value will be used as the name of the +:ref:`configuration file <config>` to use. + +When using this technique, be sure to set the parallel option to true so that +multiple coverage.py runs will each write their data to a distinct file. + + +Configuring Python for subprocess coverage +------------------------------------------ + +You can configure your Python installation to invoke the ``process_startup`` +function in two ways: + +#. Create or append to sitecustomize.py to add these lines:: + + import coverage + coverage.process_startup() + +#. Create a .pth file in your Python installation containing:: + + import coverage; coverage.process_startup() + +The sitecustomize.py technique is cleaner, but may involve modifying an existing +sitecustomize.py, since there can be only one. If there is no sitecustomize.py +already, you can create it in any directory on the Python path. + +The .pth technique seems like a hack, but works, and is documented behavior. +On the plus side, you can create the file with any name you like so you don't +have to coordinate with other .pth files. On the minus side, you have to create +the file in a system-defined directory, so you may need privileges to write it. diff --git a/howto.txt b/howto.txt new file mode 100644 index 00000000..e2d75980 --- /dev/null +++ b/howto.txt @@ -0,0 +1,74 @@ +* Release checklist + +- Test on: + - Windows + - Ubuntu + - Mac + - Pythons 2.3, 2.4, 2.5, 2.6, 3.1 +- Version number in coverage/__init__.py + - 3.1a1, 3.1b1, 3.1c1, 3.1 +- Update CHANGES.txt, including release date. +- Update docstring in setup.py, including "New in x.y:" +- Update docs + - Version, date, and changes in doc/changes.rst + - Version and date in doc/index.rst + - Version and copyright date in doc/conf.py + - Generate new sample_html to get the latest, incl footer version number: + cd C:\ned\cog\trunk + rmdir/s/q htmlcov + coverage run --branch cogapp\test_cogapp.py CogTestsInMemory + coverage html -i + copy/y htmlcov\*.* C:\ned\coverage\trunk\doc\sample_html + - Build and publish docs: + $ make px publish +- Kits: + - source .tgz and windows .exe for each Python + - $ allkits.cmd +- Update PyPi: + - $ make pypi + - upload the kits: + - $ allkits.cmd upload + # note: this seems to try to upload each file twice, so you'll have a + # successful upload, then a failure, but the file gets there. + - Visit http://pypi.python.org/pypi?%3Aaction=pkg_edit&name=coverage : + - show/hide the proper versions. +- Tag the tree + - hg tag -m "Coverage 3.0.1" coverage-3.0.1 +- Update nedbatchelder.com + - Blog post? +- Update bitbucket: + - Issue tracker should get new version number in picker. + # Note: don't delete old version numbers: it marks changes on the tickets + # with that number. +- Announce on TIP. +- Ask Christophe Zwerschke (cito@online.de) to build win64 kits. + + +* Building + +- Create PythonXX\Lib\distutils\distutils.cfg:: + [build] + compiler = mingw32 + +* Testing + +(automate these someday) + +- On Py 2.x: need setuptools installed +- On Py 3.x: need Distribute installed +- Need nose installed +- Need to have coverage dev-installed +- In each Python installation to be used, create a "coverage_test_egg.pth" + containing:: + + c:\ned\coverage\trunk\test\eggsrc\dist\covtestegg1-0.0.0-py2.5.egg + + (or equivalent). + + These go in c:\python26\lib\site-packages or + /usr/local/lib/python2.6/dist-packages, for example. + +- For complete coverage testing, in each Python installation, create a + "zzz_coverage_process_start.pth" containing:: + + import coverage; coverage.process_startup() diff --git a/lab/cmd-opts.txt b/lab/cmd-opts.txt index 87fd1e23..3397d641 100644 --- a/lab/cmd-opts.txt +++ b/lab/cmd-opts.txt @@ -1,48 +1,75 @@ coverage -e -x foo.py coverage run foo.py coverage run --timid foo.py -coverage foo.py +coverage foo.py * -commands: +global args: - run -x - --timid bool - -p --parallel bool - -L --stdlib bool - --branch bool * - -a --append bool + -h --help + --rcfile string + --version + + +commands: - erase -e - - combine -c - - report -r - -m --missing bool - -i --ignore-errors bool - --omit list of string - annotate -a -d --output-directory string - -i --ignore-errors bool - --omit list of string - + -i --ignore-errors bool [report].ignore_errors + --omit list of string [report].omit + + combine -c + + debug + + erase -e + + help + html -b -d --output-directory string - -i --ignore-errors bool - --omit list of string + -i --ignore-errors bool [report].ignore_errors + --omit list of string [report].omit --red * --green * --style * - help + report -r + -m --missing bool + -i --ignore-errors bool [report].ignore_errors + --omit list of string [report].omit + + run -x + -a --append bool + --branch bool [run].branch + -L --pylib bool [run].cover_pylib + -p --parallel bool + --timid bool [run].timid + + + --include=directory * [run].include + --include=filename * + --include=module * + --exclude=directory * [run].exclude + + + + xml + -i --ignore-errors bool [report].ignore_errors + --omit list of string [report].omit + -o string + + byteprep * - - xml * - - - + + +Other config: + + [report].exclude_lines list of string + [run].data_file string + + Option scopes: - Cmd line diff --git a/lab/dataflow.txt b/lab/dataflow.txt index 9ae891db..57962064 100644 --- a/lab/dataflow.txt +++ b/lab/dataflow.txt @@ -1,7 +1,7 @@ PyTracer.data: { filename: { lineno: None, .. }, ... } OR: { filename: { (l1, l2): None, .. }, ... } - + CoverageData.lines: { filename: { lineno: None, ...}, ... } @@ -20,7 +20,7 @@ CoverageData.executed_files(): called by: Reporter.find_code_units() tests - + CoverageData.executed_lines(): returns { lineno: None, ... } called by: @@ -199,9 +199,16 @@ class _patch(object): patching.__exit__()
patched.patchings = [self]
- patched.__name__ = func.__name__
+ try:
+ patched.__name__ = func.__name__
+ except TypeError:
+ pass # older Pythons don't let you change __name__
+ try:
+ firstlineno = func.func_code.co_firstlineno
+ except AttributeError:
+ firstlineno = func.__code__.co_firstlineno
patched.compat_co_firstlineno = getattr(func, "compat_co_firstlineno",
- func.func_code.co_firstlineno)
+ firstlineno)
return patched
@@ -255,7 +262,10 @@ def patch_object(target, attribute, new=DEFAULT, spec=None, create=False): def patch(target, new=DEFAULT, spec=None, create=False):
try:
- target, attribute = target.rsplit('.', 1)
+ #target, attribute = target.rsplit('.', 1)
+ parts = target.split('.')
+ target = '.'.join(parts[:-1])
+ attribute = parts[-1]
except (TypeError, ValueError):
raise TypeError("Need a valid target to patch. You supplied: %r" % (target,))
target = _importer(target)
diff --git a/scripts/coverage b/scripts/coverage deleted file mode 100644 index e546cb7e..00000000 --- a/scripts/coverage +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/python -""" Coverage.py code coverage measurement. - http://nedbatchelder.com/code/coverage - - Copyright 2004-2009, Ned Batchelder. -""" - -import sys -from coverage import main # pylint: disable-msg=W0406 -sys.exit(main()) @@ -12,6 +12,8 @@ Documentation is at `nedbatchelder.com <%s>`_. Code repository and issue tracker are at `bitbucket.org <http://bitbucket.org/ned/coveragepy>`_. New in 3.2: Branch coverage! + +New in 3.3: .coveragerc files """ # This file is used unchanged under all versions of Python, 2.x and 3.x. @@ -21,7 +23,8 @@ Environment :: Console Intended Audience :: Developers License :: OSI Approved :: BSD License Operating System :: OS Independent -Programming Language :: Python +Programming Language :: Python :: 2 +Programming Language :: Python :: 3 Topic :: Software Development :: Quality Assurance Topic :: Software Development :: Testing """ @@ -29,40 +32,18 @@ Topic :: Software Development :: Testing # Pull in the tools we need. import sys -if sys.hexversion < 0x03000000: - # In Py 2.x, use setuptools. - from ez_setup import use_setuptools - use_setuptools() - - from setuptools import setup - from distutils.core import Extension - - more_setup_args = dict( - entry_points = { - 'console_scripts': [ - 'coverage = coverage:main', - ], - 'pytest11': [ - 'coverage = coverage.testplugin', - ], - 'nose.plugins.0.10': [ - 'coverage = coverage.noseplugin:Coverage', - ], - }, - - # We need to get HTML assets from our htmlfiles dir. - zip_safe = False, - ) +# Distribute is a new fork of setuptools. It's supported on Py3.x, so we use +# it there, but stick with classic setuptools on Py2.x until Distribute becomes +# more accepted. +if sys.version_info >= (3, 0): + from distribute_setup import use_setuptools else: - # No setuptools yet for Py 3.x, so do without. - from distutils.core import setup, Extension + from ez_setup import use_setuptools - more_setup_args = dict( - scripts = [ - 'scripts/coverage', - ], - ) +use_setuptools() +from setuptools import setup +from distutils.core import Extension # Get or massage our metadata. @@ -82,7 +63,7 @@ classifier_list.append("Development Status :: " + devstat) # Set it up! -setup( +setup_args = dict( name = 'coverage', version = __version__, @@ -96,11 +77,23 @@ setup( ] }, - ext_modules = [ - Extension("coverage.tracer", sources=["coverage/tracer.c"]) - ], - - author = 'Ned Batchelder', + entry_points = { + 'console_scripts': [ + 'coverage = coverage:main', + ], + 'pytest11': [ + 'coverage = coverage.testplugin', + ], + 'nose.plugins.0.10': [ + 'coverage = coverage.noseplugin:Coverage', + ], + }, + + + # We need to get HTML assets from our htmlfiles dir. + zip_safe = False, + + author = 'Ned Batchelder and others', author_email = 'ned@nedbatchelder.com', description = doclines[0], long_description = '\n'.join(doclines[2:]), @@ -108,6 +101,14 @@ setup( license = 'BSD', classifiers = classifier_list, url = __url__, - - **more_setup_args ) + +# Is there a duck-typing way to know we can't compile extensions? +if not sys.platform.startswith('java'): + setup_args.update(dict( + ext_modules = [ + Extension("coverage.tracer", sources=["coverage/tracer.c"]) + ], + )) + +setup(**setup_args) diff --git a/test/__init__.py b/test/__init__.py index e69de29b..5a0e30f4 100644 --- a/test/__init__.py +++ b/test/__init__.py @@ -0,0 +1 @@ +"""Automated tests. Run with nosetests.""" diff --git a/test/backtest.py b/test/backtest.py index 21a14d6d..05a1e142 100644 --- a/test/backtest.py +++ b/test/backtest.py @@ -4,46 +4,41 @@ # (Redefining built-in blah) # The whole point of this file is to redefine built-ins, so shut up about it. -import os, sys +import os # Py2k and 3k don't agree on how to run commands in a subprocess. try: import subprocess except ImportError: - def run_command(cmd): + def run_command(cmd, status=0): """Run a command in a subprocess. - - Returns the exit code and the combined stdout and stderr. - + + Returns the exit status code and the combined stdout and stderr. + """ _, stdouterr = os.popen4(cmd) - return 0, stdouterr.read() + return status, stdouterr.read() else: - def run_command(cmd): + def run_command(cmd, status=0): """Run a command in a subprocess. - - Returns the exit code and the combined stdout and stderr. - - """ - if sys.hexversion > 0x03000000 and cmd.startswith("coverage "): - # We don't have a coverage command on 3.x, so fix it up to call the - # script. Eventually we won't need this. - cmd = "python " + sys.prefix + os.sep + "Scripts" + os.sep + cmd + Returns the exit status code and the combined stdout and stderr. + + """ proc = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT ) - retcode = proc.wait() - + status = proc.wait() + # Get the output, and canonicalize it to strings with newlines. output = proc.stdout.read() if not isinstance(output, str): output = output.decode('utf-8') output = output.replace('\r', '') - - return retcode, output + + return status, output # No more execfile in Py3k try: diff --git a/test/backunittest.py b/test/backunittest.py new file mode 100644 index 00000000..f606185f --- /dev/null +++ b/test/backunittest.py @@ -0,0 +1,93 @@ +"""Implementations of unittest features from the future.""" + +import difflib, re, sys, unittest + +from coverage.backward import set # pylint: disable-msg=W0622 + + +def _need(method): + """Do we need to define our own `method` method?""" + return not hasattr(unittest.TestCase, method) + + +class TestCase(unittest.TestCase): + """Just like unittest.TestCase, but with assert methods added. + + Designed to be compatible with 3.1 unittest. Methods are only defined if + the builtin `unittest` doesn't have them. + + """ + if _need('assertTrue'): + def assertTrue(self, exp, msg=None): + """Assert that `exp` is true.""" + if not exp: + self.fail(msg) + + if _need('assertFalse'): + def assertFalse(self, exp, msg=None): + """Assert that `exp` is false.""" + if exp: + self.fail(msg) + + if _need('assertRaisesRegexp'): + def assertRaisesRegexp(self, excClass, regexp, callobj, *args, **kw): + """ Just like unittest.TestCase.assertRaises, + but checks that the message is right too. + """ + try: + callobj(*args, **kw) + except excClass: + _, exc, _ = sys.exc_info() + excMsg = str(exc) + if re.search(regexp, excMsg): + # Message provided, and we got the right one: it passes. + return + else: + # Message provided, and it didn't match: fail! + raise self.failureException( + "Right exception, wrong message: " + "'%s' doesn't match '%s'" % (excMsg, regexp) + ) + # No need to catch other exceptions: They'll fail the test all by + # themselves! + else: + if hasattr(excClass, '__name__'): + excName = excClass.__name__ + else: + excName = str(excClass) + raise self.failureException( + "Expected to raise %s, didn't get an exception at all" % + excName + ) + + if _need('assertSameElements'): + def assertSameElements(self, s1, s2): + """Assert that the two arguments are equal as sets.""" + self.assertEqual(set(s1), set(s2)) + + if _need('assertRegexpMatches'): + def assertRegexpMatches(self, s, regex): + """Assert that `s` matches `regex`.""" + m = re.search(regex, s) + if not m: + raise self.failureException("%r doesn't match %r" % (s, regex)) + + if _need('assertMultiLineEqual'): + def assertMultiLineEqual(self, first, second, msg=None): + """Assert that two multi-line strings are equal. + + If they aren't, show a nice diff. + + """ + # Adapted from Py3.1 unittest. + self.assertTrue(isinstance(first, str), + 'First argument is not a string') + self.assertTrue(isinstance(second, str), + 'Second argument is not a string') + + if first != second: + message = ''.join(difflib.ndiff(first.splitlines(True), + second.splitlines(True))) + if msg: + message += " : " + msg + self.fail("Multi-line strings are unequal:\n" + message) diff --git a/test/coverage_coverage.py b/test/coverage_coverage.py index 1a5cc9c4..1e1cba02 100644 --- a/test/coverage_coverage.py +++ b/test/coverage_coverage.py @@ -1,44 +1,85 @@ -"""Coverage-test Coverage itself.""" +"""Coverage-test Coverage.py itself. + +Run as: + + $ python test/coverage_coverage.py run [NOSE_ARGS] + +to run and collect coverage, then: + + $ python test/coverage_coverage.py report + +to put the HTML report into the htmlcov directory. + +""" -import coverage import os, shutil, sys +import nose HTML_DIR = "htmlcov" -if os.path.exists(HTML_DIR): - shutil.rmtree(HTML_DIR) - -cov = coverage.coverage() -# Cheap trick: the coverage code itself is excluded from measurement, but if -# we clobber the cover_prefix in the coverage object, we can defeat the -# self-detection. -cov.cover_prefix = "Please measure coverage.py!" -cov.erase() -cov.start() - -# Re-import coverage to get it coverage tested! I don't understand all the -# mechanics here, but if I don't carry over the imported modules (in covmods), -# then things go haywire (os == None eventually). -covmods = {} -covdir = os.path.split(coverage.__file__) -for name, mod in sys.modules.items(): - if name.startswith('coverage'): - if hasattr(mod, '__file__') and mod.__file__.startswith(covdir): - covmods[name] = mod - del sys.modules[name] -import coverage # don't warn about re-import: pylint: disable-msg=W0404 -sys.modules.update(covmods) - -# Run nosetests, with the arguments from our command line. -import nose -nose.run(sys.argv[1:]) +def run_tests_with_coverage(): + """Run the test suite with coverage measuring itself.""" + import coverage + + tracer = os.environ.get('COVERAGE_TEST_TRACER', 'c') + version = "%s%s" % sys.version_info[:2] + suffix = "%s_%s" % (version, tracer) + + cov = coverage.coverage(config_file="covcov.ini", data_suffix=suffix) + # Cheap trick: the coverage code itself is excluded from measurement, but + # if we clobber the cover_prefix in the coverage object, we can defeat the + # self-detection. + cov.cover_prefix = "Please measure coverage.py!" + cov.erase() + cov.start() + + # Re-import coverage to get it coverage tested! I don't understand all the + # mechanics here, but if I don't carry over the imported modules (in + # covmods), then things go haywire (os == None, eventually). + covmods = {} + covdir = os.path.split(coverage.__file__)[0] + # We have to make a list since we'll be deleting in the loop. + modules = list(sys.modules.items()) + for name, mod in modules: + if name.startswith('coverage'): + if hasattr(mod, '__file__') and mod.__file__.startswith(covdir): + covmods[name] = mod + del sys.modules[name] + import coverage # don't warn about re-import: pylint: disable-msg=W0404 + sys.modules.update(covmods) + + # Run nosetests, with the arguments from our command line. + print(":: Running nosetests %s" % " ".join(sys.argv[1:])) + nose.run() + + cov.stop() + print(":: Saving .coverage%s" % suffix) + cov.save() + +def report_on_combined_files(): + """Combine all the .coverage files and make an HTML report.""" + if os.path.exists(HTML_DIR): + shutil.rmtree(HTML_DIR) + + print(":: Writing HTML report to %s/index.html" % HTML_DIR) + import coverage + cov = coverage.coverage(config_file="covcov.ini") + cov.combine() + cov.save() + cov.html_report(directory=HTML_DIR) -cov.stop() -cov.save() -cov.clear_exclude() -cov.exclude("#pragma: no cover") -cov.exclude("def __repr__") -cov.exclude("if __name__ == .__main__.:") +try: + cmd = sys.argv[1] +except IndexError: + cmd = '' -cov.html_report(directory=HTML_DIR, ignore_errors=True) +if cmd == 'run': + # Ugly hack: nose.run reads sys.argv directly, so here I delete my command + # argument so that sys.argv is left as just nose arguments. + del sys.argv[1] + run_tests_with_coverage() +elif cmd == 'report': + report_on_combined_files() +else: + print("Need 'run' or 'report'") diff --git a/test/coveragetest.py b/test/coveragetest.py index d1631a3d..9b85b034 100644 --- a/test/coveragetest.py +++ b/test/coveragetest.py @@ -1,11 +1,11 @@ """Base test case class for coverage testing.""" -import imp, os, random, re, shutil, sys, tempfile, textwrap, unittest +import imp, os, random, shlex, shutil, sys, tempfile, textwrap import coverage -from coverage.backward import set, sorted, StringIO # pylint: disable-msg=W0622 +from coverage.backward import sorted, StringIO # pylint: disable-msg=W0622 from backtest import run_command - +from backunittest import TestCase class Tee(object): """A file-like that writes to all the file-likes it has.""" @@ -13,18 +13,21 @@ class Tee(object): def __init__(self, *files): """Make a Tee that writes to all the files in `files.`""" self.files = files - + def write(self, data): """Write `data` to all the files.""" for f in self.files: f.write(data) -class CoverageTest(unittest.TestCase): +# Status returns for the command line. +OK, ERR = 0, 1 + +class CoverageTest(TestCase): """A base class for Coverage test cases.""" run_in_temp_dir = True - + def setUp(self): if self.run_in_temp_dir: # Create a temporary directory. @@ -34,49 +37,106 @@ class CoverageTest(unittest.TestCase): os.makedirs(self.temp_dir) self.old_dir = os.getcwd() os.chdir(self.temp_dir) - - # Preserve changes to PYTHONPATH. - self.old_pypath = os.environ.get('PYTHONPATH', '') - + + # Modules should be importable from this temp directory. self.old_syspath = sys.path[:] sys.path.insert(0, '') - + # Keep a counter to make every call to check_coverage unique. self.n = 0 - # Use a Tee to capture stdout. + # Record environment variables that we changed with set_environ. + self.environ_undos = {} + + # Capture stdout and stderr so we can examine them in tests. + # nose keeps stdout from littering the screen, so we can safely Tee it, + # but it doesn't capture stderr, so we don't want to Tee stderr to the + # real stderr, since it will interfere with our nice field of dots. self.old_stdout = sys.stdout self.captured_stdout = StringIO() sys.stdout = Tee(sys.stdout, self.captured_stdout) - + self.old_stderr = sys.stderr + self.captured_stderr = StringIO() + sys.stderr = self.captured_stderr + + # Record sys.modules here so we can restore it in tearDown. + self.old_modules = dict(sys.modules) + def tearDown(self): if self.run_in_temp_dir: - # Restore the original sys.path and PYTHONPATH + # Restore the original sys.path. sys.path = self.old_syspath - os.environ['PYTHONPATH'] = self.old_pypath - + # Get rid of the temporary directory. os.chdir(self.old_dir) shutil.rmtree(self.temp_root) - - # Restore stdout. + + # Restore the environment. + self.undo_environ() + + # Restore stdout and stderr sys.stdout = self.old_stdout + sys.stderr = self.old_stderr + + # Remove any new modules imported during the test run. This lets us + # import the same source files for more than one test. + for m in [m for m in sys.modules if m not in self.old_modules]: + del sys.modules[m] + + def set_environ(self, name, value): + """Set an environment variable `name` to be `value`. + + The environment variable is set, and record is kept that it was set, + so that `tearDown` can restore its original value. + + """ + if name not in self.environ_undos: + self.environ_undos[name] = os.environ.get(name) + os.environ[name] = value + + def original_environ(self, name, if_missing=None): + """The environment variable `name` from when the test started.""" + if name in self.environ_undos: + ret = self.environ_undos[name] + else: + ret = os.environ.get(name) + if ret is None: + ret = if_missing + return ret + + def undo_environ(self): + """Undo all the changes made by `set_environ`.""" + for name, value in self.environ_undos.items(): + if value is None: + del os.environ[name] + else: + os.environ[name] = value def stdout(self): """Return the data written to stdout during the test.""" return self.captured_stdout.getvalue() + def stderr(self): + """Return the data written to stderr during the test.""" + return self.captured_stderr.getvalue() + def make_file(self, filename, text): """Create a temp file. - - `filename` is the file name, and `text` is the content. - + + `filename` is the path to the file, including directories if desired, + and `text` is the content. + """ # Tests that call `make_file` should be run in a temp environment. assert self.run_in_temp_dir text = textwrap.dedent(text) - + + # Make sure the directories are available. + dirs, _ = os.path.split(filename) + if dirs and not os.path.exists(dirs): + os.makedirs(dirs) + # Create the file. f = open(filename, 'w') f.write(text) @@ -86,7 +146,7 @@ class CoverageTest(unittest.TestCase): """Import the module named modname, and return the module object.""" modfile = modname + '.py' f = open(modfile, 'r') - + for suff in imp.get_suffixes(): if suff[0] == '.py': break @@ -107,49 +167,73 @@ class CoverageTest(unittest.TestCase): modname = 'coverage_test_' + self.noise + str(self.n) self.n += 1 return modname - + # Map chars to numbers for arcz_to_arcs _arcz_map = {'.': -1} _arcz_map.update(dict([(c, ord(c)-ord('0')) for c in '123456789'])) _arcz_map.update(dict( [(c, 10+ord(c)-ord('A')) for c in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'] )) - + def arcz_to_arcs(self, arcz): """Convert a compact textual representation of arcs to a list of pairs. - + The text has space-separated pairs of letters. Period is -1, 1-9 are 1-9, A-Z are 10 through 36. The resulting list is sorted regardless of the order of the input pairs. - + ".1 12 2." --> [(-1,1), (1,2), (2,-1)] - + + Minus signs can be included in the pairs: + + "-11, 12, 2-5" --> [(-1,1), (1,2), (2,-5)] + """ arcs = [] - for a,b in arcz.split(): - arcs.append((self._arcz_map[a], self._arcz_map[b])) + for pair in arcz.split(): + asgn = bsgn = 1 + if len(pair) == 2: + a,b = pair + else: + assert len(pair) == 3 + if pair[0] == '-': + _,a,b = pair + asgn = -1 + else: + assert pair[1] == '-' + a,_,b = pair + bsgn = -1 + arcs.append((asgn*self._arcz_map[a], bsgn*self._arcz_map[b])) return sorted(arcs) + def assertEqualArcs(self, a1, a2, msg=None): + """Assert that the arc lists `a1` and `a2` are equal.""" + # Make them into multi-line strings so we can see what's going wrong. + s1 = "\n".join([repr(a) for a in a1]) + "\n" + s2 = "\n".join([repr(a) for a in a2]) + "\n" + self.assertMultiLineEqual(s1, s2, msg) + def check_coverage(self, text, lines=None, missing="", excludes=None, report="", arcz=None, arcz_missing="", arcz_unpredicted=""): """Check the coverage measurement of `text`. - + The source `text` is run and measured. `lines` are the line numbers - that are executable, `missing` are the lines not executed, `excludes` - are regexes to match against for excluding lines, and `report` is - the text of the measurement report. - + that are executable, or a list of possible line numbers, any of which + could match. `missing` are the lines not executed, `excludes` are + regexes to match against for excluding lines, and `report` is the text + of the measurement report. + For arc measurement, `arcz` is a string that can be decoded into arcs in the code (see `arcz_to_arcs` for the encoding scheme), `arcz_missing` are the arcs that are not executed, and `arcs_unpredicted` are the arcs executed in the code, but not deducible from the code. - + """ # We write the code into a file so that we can import it. # Coverage wants to deal with things as modules with file names. modname = self.get_module_name() - + self.make_file(modname+".py", text) arcs = arcs_missing = arcs_unpredicted = None @@ -157,7 +241,7 @@ class CoverageTest(unittest.TestCase): arcs = self.arcz_to_arcs(arcz) arcs_missing = self.arcz_to_arcs(arcz_missing or "") arcs_unpredicted = self.arcz_to_arcs(arcz_unpredicted or "") - + # Start up Coverage. cov = coverage.coverage(branch=(arcs_missing is not None)) cov.erase() @@ -165,11 +249,12 @@ class CoverageTest(unittest.TestCase): cov.exclude(exc) cov.start() - # Import the python file, executing it. - mod = self.import_module(modname) - - # Stop Coverage. - cov.stop() + try: # pragma: recursive coverage + # Import the python file, executing it. + mod = self.import_module(modname) + finally: # pragma: recursive coverage + # Stop Coverage. + cov.stop() # Clean up our side effects del sys.modules[modname] @@ -178,8 +263,12 @@ class CoverageTest(unittest.TestCase): analysis = cov._analyze(mod) if lines is not None: if type(lines[0]) == type(1): + # lines is just a list of numbers, it must match the statements + # found in the code. self.assertEqual(analysis.statements, lines) else: + # lines is a list of possible line number lists, one of them + # must match. for line_list in lines: if analysis.statements == line_list: break @@ -188,26 +277,33 @@ class CoverageTest(unittest.TestCase): analysis.statements ) - if missing is not None: - if type(missing) == type(""): - self.assertEqual(analysis.missing_formatted(), missing) + if type(missing) == type(""): + self.assertEqual(analysis.missing_formatted(), missing) + else: + for missing_list in missing: + if analysis.missing_formatted() == missing_list: + break else: - for missing_list in missing: - if analysis.missing == missing_list: - break - else: - self.fail("None of the missing choices matched %r" % - analysis.missing_formatted() - ) + self.fail("None of the missing choices matched %r" % + analysis.missing_formatted() + ) if arcs is not None: - self.assertEqual(analysis.arc_possibilities(), arcs) + self.assertEqualArcs( + analysis.arc_possibilities(), arcs, "Possible arcs differ" + ) if arcs_missing is not None: - self.assertEqual(analysis.arcs_missing(), arcs_missing) + self.assertEqualArcs( + analysis.arcs_missing(), arcs_missing, + "Missing arcs differ" + ) if arcs_unpredicted is not None: - self.assertEqual(analysis.arcs_unpredicted(), arcs_unpredicted) + self.assertEqualArcs( + analysis.arcs_unpredicted(), arcs_unpredicted, + "Unpredicted arcs differ" + ) if report: frep = StringIO() @@ -215,68 +311,64 @@ class CoverageTest(unittest.TestCase): rep = " ".join(frep.getvalue().split("\n")[2].split()[1:]) self.assertEqual(report, rep) - def assert_raises_msg(self, excClass, msg, callableObj, *args, **kwargs): - """ Just like unittest.TestCase.assertRaises, - but checks that the message is right too. - """ - try: - callableObj(*args, **kwargs) - except excClass: - _, exc, _ = sys.exc_info() - excMsg = str(exc) - if not msg: - # No message provided: it passes. - return #pragma: no cover - elif excMsg == msg: - # Message provided, and we got the right message: it passes. - return - else: #pragma: no cover - # Message provided, and it didn't match: fail! - raise self.failureException( - "Right exception, wrong message: got '%s' expected '%s'" % - (excMsg, msg) - ) - # No need to catch other exceptions: They'll fail the test all by - # themselves! - else: #pragma: no cover - if hasattr(excClass,'__name__'): - excName = excClass.__name__ - else: - excName = str(excClass) - raise self.failureException( - "Expected to raise %s, didn't get an exception at all" % - excName - ) - def nice_file(self, *fparts): """Canonicalize the filename composed of the parts in `fparts`.""" fname = os.path.join(*fparts) return os.path.normcase(os.path.abspath(os.path.realpath(fname))) - + + def command_line(self, args, ret=OK, _covpkg=None): + """Run `args` through the command line. + + Use this when you want to run the full coverage machinery, but in the + current process. Exceptions may be thrown from deep in the code. + Asserts that `ret` is returned by `CoverageScript.command_line`. + + Compare with `run_command`. + + Returns None. + + """ + script = coverage.CoverageScript(_covpkg=_covpkg) + ret_actual = script.command_line(shlex.split(args)) + self.assertEqual(ret_actual, ret) + def run_command(self, cmd): - """ Run the command-line `cmd`, print its output. + """Run the command-line `cmd` in a subprocess, and print its output. + + Use this when you need to test the process behavior of coverage. + + Compare with `command_line`. + + Returns the process' stdout text. + + """ + _, output = self.run_command_status(cmd) + return output + + def run_command_status(self, cmd, status=0): + """Run the command-line `cmd` in a subprocess, and print its output. + + Use this when you need to test the process behavior of coverage. + + Compare with `command_line`. + + Returns a pair: the process' exit status and stdout text. + + The `status` argument is returned as the status on older Pythons where + we can't get the actual exit status of the process. + """ # Add our test modules directory to PYTHONPATH. I'm sure there's too # much path munging here, but... here = os.path.dirname(self.nice_file(coverage.__file__, "..")) testmods = self.nice_file(here, 'test/modules') zipfile = self.nice_file(here, 'test/zipmods.zip') - pypath = self.old_pypath + pypath = self.original_environ('PYTHONPATH', "") if pypath: pypath += os.pathsep pypath += testmods + os.pathsep + zipfile - os.environ['PYTHONPATH'] = pypath - - _, output = run_command(cmd) - print(output) - return output + self.set_environ('PYTHONPATH', pypath) - def assert_equal_sets(self, s1, s2): - """Assert that the two arguments are equal as sets.""" - self.assertEqual(set(s1), set(s2)) - - def assert_matches(self, s, regex): - """Assert that `s` matches `regex`.""" - m = re.search(regex, s) - if not m: - raise self.failureException("%r doesn't match %r" % (s, regex)) + status, output = run_command(cmd, status=status) + print(output) + return status, output diff --git a/test/farm/annotate/run_multi.py b/test/farm/annotate/run_multi.py index 872f0976..4e8252ed 100644 --- a/test/farm/annotate/run_multi.py +++ b/test/farm/annotate/run_multi.py @@ -1,7 +1,7 @@ copy("src", "out_multi") run(""" coverage -e -x multi.py - coverage -a + coverage -a """, rundir="out_multi") compare("out_multi", "gold_multi", "*,cover") clean("out_multi") diff --git a/test/farm/html/gold_a/a.html b/test/farm/html/gold_a/a.html index b29831b6..b3a28792 100644 --- a/test/farm/html/gold_a/a.html +++ b/test/farm/html/gold_a/a.html @@ -1,24 +1,20 @@ <!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
-<title>Coverage for a</title>
-<link rel='stylesheet' href='style.css' type='text/css'>
-<script src='jquery-1.3.2.min.js'></script>
-<script>
-function toggle_lines(btn, cls) {
- var btn = $(btn);
- if (btn.hasClass("hide")) {
- $("#source ."+cls).removeClass("hide");
- btn.removeClass("hide");
- }
- else {
- $("#source ."+cls).addClass("hide");
- btn.addClass("hide");
- }
-}
-</script>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+
+
+ <meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
+ <title>Coverage for a: 67%</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
+ <script type='text/javascript' charset='utf-8'>
+ jQuery(document).ready(pyfile_ready);
+ </script>
</head>
-<body>
+<body id='pyfile'>
+
<div id='header'>
<div class='content'>
<h1>Coverage for <b>a</b> :
@@ -26,38 +22,47 @@ function toggle_lines(btn, cls) { </h1>
<h2 class='stats'>
3 statements
- <span class='run hide' onclick='toggle_lines(this, "run")'>2 run</span>
- <span class='exc' onclick='toggle_lines(this, "exc")'>0 excluded</span>
+ <span class='run hide_run' onclick='toggle_lines(this, "run")'>2 run</span>
<span class='mis' onclick='toggle_lines(this, "mis")'>1 missing</span>
+ <span class='exc' onclick='toggle_lines(this, "exc")'>0 excluded</span>
+
</h2>
</div>
</div>
<div id='source'>
-<table cellspacing='0' cellpadding='0'>
-<tr>
-<td class='linenos' valign='top'>
-<p class='pln'>1</p>
-<p class='pln'>2</p>
-<p class='stm run hide'>3</p>
-<p class='pln'>4</p>
-<p class='stm run hide'>5</p>
-<p class='pln'>6</p>
-<p class='stm mis'>7</p>
-
-</td>
-<td class='text' valign='top'>
-<p class='pln'><span class='com'># A test file for HTML reporting by coverage.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>if</span> <span class='num'>1</span> <span class='op'><</span> <span class='num'>2</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='pln'> <span class='com'># Needed a < to look at HTML entities.</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>a</span> <span class='op'>=</span> <span class='num'>3</span><span class="strut"> </span></p>
-<p class='pln'><span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>a</span> <span class='op'>=</span> <span class='num'>4</span><span class="strut"> </span></p>
-
-</td>
-</tr>
-</table>
+ <table cellspacing='0' cellpadding='0'>
+ <tr>
+ <td class='linenos' valign='top'>
+<p id='n1' class='pln'><a href='#n1'>1</a></p>
+<p id='n2' class='pln'><a href='#n2'>2</a></p>
+<p id='n3' class='stm run hide_run'><a href='#n3'>3</a></p>
+<p id='n4' class='pln'><a href='#n4'>4</a></p>
+<p id='n5' class='stm run hide_run'><a href='#n5'>5</a></p>
+<p id='n6' class='pln'><a href='#n6'>6</a></p>
+<p id='n7' class='stm mis'><a href='#n7'>7</a></p>
+
+ </td>
+ <td class='text' valign='top'>
+<p id='t1' class='pln'><span class='com'># A test file for HTML reporting by coverage.</span><span class='strut'> </span></p>
+<p id='t2' class='pln'><span class='strut'> </span></p>
+<p id='t3' class='stm run hide_run'><span class='key'>if</span> <span class='num'>1</span> <span class='op'><</span> <span class='num'>2</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t4' class='pln'> <span class='com'># Needed a < to look at HTML entities.</span><span class='strut'> </span></p>
+<p id='t5' class='stm run hide_run'> <span class='nam'>a</span> <span class='op'>=</span> <span class='num'>3</span><span class='strut'> </span></p>
+<p id='t6' class='pln'><span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t7' class='stm mis'> <span class='nam'>a</span> <span class='op'>=</span> <span class='num'>4</span><span class='strut'> </span></p>
+
+ </td>
+ </tr>
+ </table>
+</div>
+
+<div id='footer'>
+ <div class='content'>
+ <p>
+ <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.3.2a1</a>
+ </p>
+ </div>
</div>
</body>
diff --git a/test/farm/html/gold_a/index.html b/test/farm/html/gold_a/index.html index 88103442..35224e6b 100644 --- a/test/farm/html/gold_a/index.html +++ b/test/farm/html/gold_a/index.html @@ -1,55 +1,69 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
-<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
-<title>Coverage report</title>
-<link rel='stylesheet' href='style.css' type='text/css'>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+ <title>Coverage report</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='jquery.tablesorter.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
+ <script type='text/javascript' charset='utf-8'>
+ jQuery(document).ready(index_ready);
+ </script>
</head>
-<body>
+<body id='indexfile'>
<div id='header'>
<div class='content'>
- <h1>Coverage report:
+ <h1>Coverage report:
<span class='pc_cov'>67%</span>
</h1>
</div>
</div>
<div id='index'>
-<table class='index'>
-<tr class='tablehead'>
- <th class='name'>Module</th>
- <th>statements</th>
- <th>run</th>
- <th>excluded</th>
-
- <th>coverage</th>
-</tr>
-
-<tr class='file'>
- <td class='name'><a href='a.html'>a</a></td>
- <td>3</td>
- <td>2</td>
- <td>0</td>
-
- <td>67%</td>
-</tr>
-
-<tr class='total'>
-<td class='name'>Total</td>
-<td>3</td>
-<td>2</td>
-<td>0</td>
-
-<td>67%</td>
-</tr>
-</table>
+ <table class='index'>
+ <thead>
+
+ <tr class='tablehead' title='Click to sort'>
+ <th class='name left headerSortDown'>Module</th>
+ <th>statements</th>
+ <th>missing</th>
+ <th>excluded</th>
+
+ <th class='right'>coverage</th>
+ </tr>
+ </thead>
+
+ <tfoot>
+ <tr class='total'>
+ <td class='name left'>Total</td>
+ <td>3</td>
+ <td>1</td>
+ <td>0</td>
+
+ <td class='right'>67%</td>
+ </tr>
+ </tfoot>
+ <tbody>
+
+ <tr class='file'>
+ <td class='name left'><a href='a.html'>a</a></td>
+ <td>3</td>
+ <td>1</td>
+ <td>0</td>
+
+ <td class='right'>67%</td>
+ </tr>
+
+ </tbody>
+ </table>
</div>
<div id='footer'>
<div class='content'>
<p>
- <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.2a1</a>
+ <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.3.2a1</a>
</p>
</div>
</div>
diff --git a/test/farm/html/gold_a/jquery-1.3.2.min.js b/test/farm/html/gold_a/jquery-1.3.2.min.js deleted file mode 100644 index b1ae21d8..00000000 --- a/test/farm/html/gold_a/jquery-1.3.2.min.js +++ /dev/null @@ -1,19 +0,0 @@ -/* - * jQuery JavaScript Library v1.3.2 - * http://jquery.com/ - * - * Copyright (c) 2009 John Resig - * Dual licensed under the MIT and GPL licenses. - * http://docs.jquery.com/License - * - * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) - * Revision: 6246 - */ -(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}}); -/* - * Sizzle CSS Selector Engine - v0.9.3 - * Copyright 2009, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * More information: http://sizzlejs.com/ - */ -(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML=' <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();
\ No newline at end of file diff --git a/test/farm/html/gold_a/style.css b/test/farm/html/gold_a/style.css deleted file mode 100644 index b55e4992..00000000 --- a/test/farm/html/gold_a/style.css +++ /dev/null @@ -1,182 +0,0 @@ -/* CSS styles for Coverage. */ -/* Page-wide styles */ -html, body, h1, h2, h3, p, td, th { - margin: 0; - padding: 0; - border: 0; - outline: 0; - font-weight: inherit; - font-style: inherit; - font-size: 100%; - font-family: inherit; - vertical-align: baseline; - } - -/* Set baseline grid to 16 pt. */ -body { - font-family: georgia, serif; - font-size: 1em; - } - -html>body { - font-size: 16px; - } - -/* Set base font size to 12/16 */ -p { - font-size: .75em; /* 12/16 */ - line-height: 1.3333em; /* 16/12 */ - } - -table { - border-collapse: collapse; - } - -a.nav { - text-decoration: none; - color: inherit; - } -a.nav:hover { - text-decoration: underline; - color: inherit; - } - -/* Page structure */ -#header { - background: #f8f8f8; - width: 100%; - border-bottom: 1px solid #eee; - } - -#source { - padding: 1em; - font-family: "courier new", monospace; - } - -#footer { - margin: 1em 3em; - } - -#footer .content { - padding: 0; - font-size: 85%; - font-family: verdana, sans-serif; - color: #666666; - font-style: italic; - } - -#index { - margin: 1em 0 0 3em; - } - -/* Header styles */ -#header .content { - padding: 1em 3em; - } - -h1 { - font-size: 1.25em; -} - -h2.stats { - margin-top: .5em; - font-size: 1em; -} -.stats span { - border: 1px solid; - padding: .1em .25em; - margin: 0 .1em; - cursor: pointer; - border-color: #999 #ccc #ccc #999; -} -.stats span.hide { - border-color: #ccc #999 #999 #ccc; -} - -/* Source file styles */ -.linenos p { - text-align: right; - margin: 0; - padding: 0 .5em; - color: #999999; - font-family: verdana, sans-serif; - font-size: .625em; /* 10/16 */ - line-height: 1.6em; /* 16/10 */ - } -td.text { - width: 100%; - } -.text p { - margin: 0; - padding: 0 0 0 .5em; - border-left: 2px solid #ffffff; - white-space: nowrap; - } - -.text p.mis { - background: #ffdddd; - border-left: 2px solid #ff0000; - } -.text p.run { - background: #ddffdd; - border-left: 2px solid #00ff00; - } -.text p.exc { - background: #eeeeee; - border-left: 2px solid #808080; - } -.text p.par { - background: #ffffdd; - border-left: 2px solid #ffff00; - } -.text p.hide { - background: inherit; - } - -/* Syntax coloring */ -.text .com { - color: green; - font-style: italic; - line-height: 1px; - } -.text .key { - font-weight: bold; - line-height: 1px; - } -.text .str { - color: #000080; - } - -/* index styles */ -#index td, #index th { - text-align: right; - width: 6em; - padding: .25em 0; - border-bottom: 1px solid #eee; - } -#index th { - font-style: italic; - color: #333; - border-bottom: 1px solid #ccc; - } -#index td.name, #index th.name { - text-align: left; - width: auto; - height: 1.5em; - } -#index td.name a { - text-decoration: none; - color: #000; - } -#index td.name a:hover { - text-decoration: underline; - color: #000; - } -#index tr.total { - font-weight: bold; - } -#index tr.total td { - padding: .25em 0; - border-top: 1px solid #ccc; - border-bottom: none; - } diff --git a/test/farm/html/gold_b_branch/b.html b/test/farm/html/gold_b_branch/b.html new file mode 100644 index 00000000..ba57e964 --- /dev/null +++ b/test/farm/html/gold_b_branch/b.html @@ -0,0 +1,113 @@ +<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+
+
+ <meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
+ <title>Coverage for b: 76%</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
+ <script type='text/javascript' charset='utf-8'>
+ jQuery(document).ready(pyfile_ready);
+ </script>
+</head>
+<body id='pyfile'>
+
+<div id='header'>
+ <div class='content'>
+ <h1>Coverage for <b>b</b> :
+ <span class='pc_cov'>76%</span>
+ </h1>
+ <h2 class='stats'>
+ 16 statements
+ <span class='run hide_run' onclick='toggle_lines(this, "run")'>14 run</span>
+ <span class='mis' onclick='toggle_lines(this, "mis")'>2 missing</span>
+ <span class='exc' onclick='toggle_lines(this, "exc")'>0 excluded</span>
+
+ <span class='par run hide_run' onclick='toggle_lines(this, "par")'>3 partial</span>
+
+ </h2>
+ </div>
+</div>
+
+<div id='source'>
+ <table cellspacing='0' cellpadding='0'>
+ <tr>
+ <td class='linenos' valign='top'>
+<p id='n1' class='pln'><a href='#n1'>1</a></p>
+<p id='n2' class='pln'><a href='#n2'>2</a></p>
+<p id='n3' class='stm run hide_run'><a href='#n3'>3</a></p>
+<p id='n4' class='pln'><a href='#n4'>4</a></p>
+<p id='n5' class='stm par run hide_run'><a href='#n5'>5</a></p>
+<p id='n6' class='stm run hide_run'><a href='#n6'>6</a></p>
+<p id='n7' class='pln'><a href='#n7'>7</a></p>
+<p id='n8' class='stm mis'><a href='#n8'>8</a></p>
+<p id='n9' class='pln'><a href='#n9'>9</a></p>
+<p id='n10' class='stm run hide_run'><a href='#n10'>10</a></p>
+<p id='n11' class='pln'><a href='#n11'>11</a></p>
+<p id='n12' class='stm run hide_run'><a href='#n12'>12</a></p>
+<p id='n13' class='pln'><a href='#n13'>13</a></p>
+<p id='n14' class='stm par run hide_run'><a href='#n14'>14</a></p>
+<p id='n15' class='stm run hide_run'><a href='#n15'>15</a></p>
+<p id='n16' class='pln'><a href='#n16'>16</a></p>
+<p id='n17' class='stm run hide_run'><a href='#n17'>17</a></p>
+<p id='n18' class='pln'><a href='#n18'>18</a></p>
+<p id='n19' class='stm run hide_run'><a href='#n19'>19</a></p>
+<p id='n20' class='pln'><a href='#n20'>20</a></p>
+<p id='n21' class='stm par run hide_run'><a href='#n21'>21</a></p>
+<p id='n22' class='stm run hide_run'><a href='#n22'>22</a></p>
+<p id='n23' class='stm run hide_run'><a href='#n23'>23</a></p>
+<p id='n24' class='pln'><a href='#n24'>24</a></p>
+<p id='n25' class='stm mis'><a href='#n25'>25</a></p>
+<p id='n26' class='stm run hide_run'><a href='#n26'>26</a></p>
+<p id='n27' class='pln'><a href='#n27'>27</a></p>
+<p id='n28' class='stm run hide_run'><a href='#n28'>28</a></p>
+
+ </td>
+ <td class='text' valign='top'>
+<p id='t1' class='pln'><span class='com'># A test file for HTML reporting by coverage.</span><span class='strut'> </span></p>
+<p id='t2' class='pln'><span class='strut'> </span></p>
+<p id='t3' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>one</span><span class='op'>(</span><span class='nam'>x</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t4' class='pln'> <span class='com'># This will be a branch that misses the else.</span><span class='strut'> </span></p>
+<p id='t5' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>8</span> <span class='key'>if</span> <span class='nam'>x</span> <span class='op'><</span> <span class='num'>2</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t6' class='stm run hide_run'> <span class='nam'>a</span> <span class='op'>=</span> <span class='num'>3</span><span class='strut'> </span></p>
+<p id='t7' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t8' class='stm mis'> <span class='nam'>a</span> <span class='op'>=</span> <span class='num'>4</span><span class='strut'> </span></p>
+<p id='t9' class='pln'><span class='strut'> </span></p>
+<p id='t10' class='stm run hide_run'><span class='nam'>one</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t11' class='pln'><span class='strut'> </span></p>
+<p id='t12' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>two</span><span class='op'>(</span><span class='nam'>x</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t13' class='pln'> <span class='com'># A missed else that branches to "exit"</span><span class='strut'> </span></p>
+<p id='t14' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>exit</span> <span class='key'>if</span> <span class='nam'>x</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t15' class='stm run hide_run'> <span class='nam'>a</span> <span class='op'>=</span> <span class='num'>5</span><span class='strut'> </span></p>
+<p id='t16' class='pln'><span class='strut'> </span></p>
+<p id='t17' class='stm run hide_run'><span class='nam'>two</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'> </span></p>
+<p id='t18' class='pln'><span class='strut'> </span></p>
+<p id='t19' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>three_way</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t20' class='pln'> <span class='com'># for-else can be a three-way branch.</span><span class='strut'> </span></p>
+<p id='t21' class='stm par run hide_run'><span class='annotate' title='no jumps to these line numbers'>25 26</span> <span class='key'>for</span> <span class='nam'>i</span> <span class='key'>in</span> <span class='nam'>range</span><span class='op'>(</span><span class='num'>10</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t22' class='stm run hide_run'> <span class='key'>if</span> <span class='nam'>i</span> <span class='op'>==</span> <span class='num'>3</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t23' class='stm run hide_run'> <span class='key'>break</span><span class='strut'> </span></p>
+<p id='t24' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t25' class='stm mis'> <span class='key'>return</span> <span class='num'>23</span><span class='strut'> </span></p>
+<p id='t26' class='stm run hide_run'> <span class='key'>return</span> <span class='num'>17</span><span class='strut'> </span></p>
+<p id='t27' class='pln'><span class='strut'> </span></p>
+<p id='t28' class='stm run hide_run'><span class='nam'>three_way</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p>
+
+ </td>
+ </tr>
+ </table>
+</div>
+
+<div id='footer'>
+ <div class='content'>
+ <p>
+ <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.3.2a1</a>
+ </p>
+ </div>
+</div>
+
+</body>
+</html>
diff --git a/test/farm/html/gold_b_branch/index.html b/test/farm/html/gold_b_branch/index.html new file mode 100644 index 00000000..a37f357a --- /dev/null +++ b/test/farm/html/gold_b_branch/index.html @@ -0,0 +1,81 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+ <title>Coverage report</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='jquery.tablesorter.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
+ <script type='text/javascript' charset='utf-8'>
+ jQuery(document).ready(index_ready);
+ </script>
+</head>
+<body id='indexfile'>
+
+<div id='header'>
+ <div class='content'>
+ <h1>Coverage report:
+ <span class='pc_cov'>76%</span>
+ </h1>
+ </div>
+</div>
+
+<div id='index'>
+ <table class='index'>
+ <thead>
+
+ <tr class='tablehead' title='Click to sort'>
+ <th class='name left headerSortDown'>Module</th>
+ <th>statements</th>
+ <th>missing</th>
+ <th>excluded</th>
+
+ <th>branches</th>
+ <th>partial</th>
+
+ <th class='right'>coverage</th>
+ </tr>
+ </thead>
+
+ <tfoot>
+ <tr class='total'>
+ <td class='name left'>Total</td>
+ <td>16</td>
+ <td>2</td>
+ <td>0</td>
+
+ <td>9</td>
+ <td>4</td>
+
+ <td class='right'>76%</td>
+ </tr>
+ </tfoot>
+ <tbody>
+
+ <tr class='file'>
+ <td class='name left'><a href='b.html'>b</a></td>
+ <td>16</td>
+ <td>2</td>
+ <td>0</td>
+
+ <td>9</td>
+ <td>4</td>
+
+ <td class='right'>76%</td>
+ </tr>
+
+ </tbody>
+ </table>
+</div>
+
+<div id='footer'>
+ <div class='content'>
+ <p>
+ <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.3.2a1</a>
+ </p>
+ </div>
+</div>
+
+</body>
+</html>
diff --git a/test/farm/html/gold_omit_1/index.html b/test/farm/html/gold_omit_1/index.html new file mode 100644 index 00000000..2612a88e --- /dev/null +++ b/test/farm/html/gold_omit_1/index.html @@ -0,0 +1,99 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+ <title>Coverage report</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='jquery.tablesorter.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
+ <script type='text/javascript' charset='utf-8'>
+ jQuery(document).ready(index_ready);
+ </script>
+</head>
+<body id='indexfile'>
+
+<div id='header'>
+ <div class='content'>
+ <h1>Coverage report:
+ <span class='pc_cov'>100%</span>
+ </h1>
+ </div>
+</div>
+
+<div id='index'>
+ <table class='index'>
+ <thead>
+
+ <tr class='tablehead' title='Click to sort'>
+ <th class='name left headerSortDown'>Module</th>
+ <th>statements</th>
+ <th>missing</th>
+ <th>excluded</th>
+
+ <th class='right'>coverage</th>
+ </tr>
+ </thead>
+
+ <tfoot>
+ <tr class='total'>
+ <td class='name left'>Total</td>
+ <td>14</td>
+ <td>0</td>
+ <td>0</td>
+
+ <td class='right'>100%</td>
+ </tr>
+ </tfoot>
+ <tbody>
+
+ <tr class='file'>
+ <td class='name left'><a href='m1.html'>m1</a></td>
+ <td>2</td>
+ <td>0</td>
+ <td>0</td>
+
+ <td class='right'>100%</td>
+ </tr>
+
+ <tr class='file'>
+ <td class='name left'><a href='m2.html'>m2</a></td>
+ <td>2</td>
+ <td>0</td>
+ <td>0</td>
+
+ <td class='right'>100%</td>
+ </tr>
+
+ <tr class='file'>
+ <td class='name left'><a href='m3.html'>m3</a></td>
+ <td>2</td>
+ <td>0</td>
+ <td>0</td>
+
+ <td class='right'>100%</td>
+ </tr>
+
+ <tr class='file'>
+ <td class='name left'><a href='main.html'>main</a></td>
+ <td>8</td>
+ <td>0</td>
+ <td>0</td>
+
+ <td class='right'>100%</td>
+ </tr>
+
+ </tbody>
+ </table>
+</div>
+
+<div id='footer'>
+ <div class='content'>
+ <p>
+ <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.3.2a1</a>
+ </p>
+ </div>
+</div>
+
+</body>
+</html>
diff --git a/test/farm/html/gold_omit_1/m1.html b/test/farm/html/gold_omit_1/m1.html new file mode 100644 index 00000000..20b86df7 --- /dev/null +++ b/test/farm/html/gold_omit_1/m1.html @@ -0,0 +1,59 @@ +<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+
+
+ <meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
+ <title>Coverage for m1: 100%</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
+ <script type='text/javascript' charset='utf-8'>
+ jQuery(document).ready(pyfile_ready);
+ </script>
+</head>
+<body id='pyfile'>
+
+<div id='header'>
+ <div class='content'>
+ <h1>Coverage for <b>m1</b> :
+ <span class='pc_cov'>100%</span>
+ </h1>
+ <h2 class='stats'>
+ 2 statements
+ <span class='run hide_run' onclick='toggle_lines(this, "run")'>2 run</span>
+ <span class='mis' onclick='toggle_lines(this, "mis")'>0 missing</span>
+ <span class='exc' onclick='toggle_lines(this, "exc")'>0 excluded</span>
+
+ </h2>
+ </div>
+</div>
+
+<div id='source'>
+ <table cellspacing='0' cellpadding='0'>
+ <tr>
+ <td class='linenos' valign='top'>
+<p id='n1' class='stm run hide_run'><a href='#n1'>1</a></p>
+<p id='n2' class='stm run hide_run'><a href='#n2'>2</a></p>
+
+ </td>
+ <td class='text' valign='top'>
+<p id='t1' class='stm run hide_run'><span class='nam'>m1a</span> <span class='op'>=</span> <span class='num'>1</span><span class='strut'> </span></p>
+<p id='t2' class='stm run hide_run'><span class='nam'>m1b</span> <span class='op'>=</span> <span class='num'>2</span><span class='strut'> </span></p>
+
+ </td>
+ </tr>
+ </table>
+</div>
+
+<div id='footer'>
+ <div class='content'>
+ <p>
+ <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.3.2a1</a>
+ </p>
+ </div>
+</div>
+
+</body>
+</html>
diff --git a/test/farm/html/gold_omit_1/m2.html b/test/farm/html/gold_omit_1/m2.html new file mode 100644 index 00000000..6cbf78ed --- /dev/null +++ b/test/farm/html/gold_omit_1/m2.html @@ -0,0 +1,59 @@ +<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+
+
+ <meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
+ <title>Coverage for m2: 100%</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
+ <script type='text/javascript' charset='utf-8'>
+ jQuery(document).ready(pyfile_ready);
+ </script>
+</head>
+<body id='pyfile'>
+
+<div id='header'>
+ <div class='content'>
+ <h1>Coverage for <b>m2</b> :
+ <span class='pc_cov'>100%</span>
+ </h1>
+ <h2 class='stats'>
+ 2 statements
+ <span class='run hide_run' onclick='toggle_lines(this, "run")'>2 run</span>
+ <span class='mis' onclick='toggle_lines(this, "mis")'>0 missing</span>
+ <span class='exc' onclick='toggle_lines(this, "exc")'>0 excluded</span>
+
+ </h2>
+ </div>
+</div>
+
+<div id='source'>
+ <table cellspacing='0' cellpadding='0'>
+ <tr>
+ <td class='linenos' valign='top'>
+<p id='n1' class='stm run hide_run'><a href='#n1'>1</a></p>
+<p id='n2' class='stm run hide_run'><a href='#n2'>2</a></p>
+
+ </td>
+ <td class='text' valign='top'>
+<p id='t1' class='stm run hide_run'><span class='nam'>m2a</span> <span class='op'>=</span> <span class='num'>1</span><span class='strut'> </span></p>
+<p id='t2' class='stm run hide_run'><span class='nam'>m2b</span> <span class='op'>=</span> <span class='num'>2</span><span class='strut'> </span></p>
+
+ </td>
+ </tr>
+ </table>
+</div>
+
+<div id='footer'>
+ <div class='content'>
+ <p>
+ <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.3.2a1</a>
+ </p>
+ </div>
+</div>
+
+</body>
+</html>
diff --git a/test/farm/html/gold_omit_1/m3.html b/test/farm/html/gold_omit_1/m3.html new file mode 100644 index 00000000..6e618619 --- /dev/null +++ b/test/farm/html/gold_omit_1/m3.html @@ -0,0 +1,59 @@ +<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+
+
+ <meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
+ <title>Coverage for m3: 100%</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
+ <script type='text/javascript' charset='utf-8'>
+ jQuery(document).ready(pyfile_ready);
+ </script>
+</head>
+<body id='pyfile'>
+
+<div id='header'>
+ <div class='content'>
+ <h1>Coverage for <b>m3</b> :
+ <span class='pc_cov'>100%</span>
+ </h1>
+ <h2 class='stats'>
+ 2 statements
+ <span class='run hide_run' onclick='toggle_lines(this, "run")'>2 run</span>
+ <span class='mis' onclick='toggle_lines(this, "mis")'>0 missing</span>
+ <span class='exc' onclick='toggle_lines(this, "exc")'>0 excluded</span>
+
+ </h2>
+ </div>
+</div>
+
+<div id='source'>
+ <table cellspacing='0' cellpadding='0'>
+ <tr>
+ <td class='linenos' valign='top'>
+<p id='n1' class='stm run hide_run'><a href='#n1'>1</a></p>
+<p id='n2' class='stm run hide_run'><a href='#n2'>2</a></p>
+
+ </td>
+ <td class='text' valign='top'>
+<p id='t1' class='stm run hide_run'><span class='nam'>m3a</span> <span class='op'>=</span> <span class='num'>1</span><span class='strut'> </span></p>
+<p id='t2' class='stm run hide_run'><span class='nam'>m3b</span> <span class='op'>=</span> <span class='num'>2</span><span class='strut'> </span></p>
+
+ </td>
+ </tr>
+ </table>
+</div>
+
+<div id='footer'>
+ <div class='content'>
+ <p>
+ <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.3.2a1</a>
+ </p>
+ </div>
+</div>
+
+</body>
+</html>
diff --git a/test/farm/html/gold_omit_1/main.html b/test/farm/html/gold_omit_1/main.html new file mode 100644 index 00000000..d7b84c45 --- /dev/null +++ b/test/farm/html/gold_omit_1/main.html @@ -0,0 +1,75 @@ +<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+
+
+ <meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
+ <title>Coverage for main: 100%</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
+ <script type='text/javascript' charset='utf-8'>
+ jQuery(document).ready(pyfile_ready);
+ </script>
+</head>
+<body id='pyfile'>
+
+<div id='header'>
+ <div class='content'>
+ <h1>Coverage for <b>main</b> :
+ <span class='pc_cov'>100%</span>
+ </h1>
+ <h2 class='stats'>
+ 8 statements
+ <span class='run hide_run' onclick='toggle_lines(this, "run")'>8 run</span>
+ <span class='mis' onclick='toggle_lines(this, "mis")'>0 missing</span>
+ <span class='exc' onclick='toggle_lines(this, "exc")'>0 excluded</span>
+
+ </h2>
+ </div>
+</div>
+
+<div id='source'>
+ <table cellspacing='0' cellpadding='0'>
+ <tr>
+ <td class='linenos' valign='top'>
+<p id='n1' class='stm run hide_run'><a href='#n1'>1</a></p>
+<p id='n2' class='stm run hide_run'><a href='#n2'>2</a></p>
+<p id='n3' class='stm run hide_run'><a href='#n3'>3</a></p>
+<p id='n4' class='pln'><a href='#n4'>4</a></p>
+<p id='n5' class='stm run hide_run'><a href='#n5'>5</a></p>
+<p id='n6' class='stm run hide_run'><a href='#n6'>6</a></p>
+<p id='n7' class='pln'><a href='#n7'>7</a></p>
+<p id='n8' class='stm run hide_run'><a href='#n8'>8</a></p>
+<p id='n9' class='stm run hide_run'><a href='#n9'>9</a></p>
+<p id='n10' class='stm run hide_run'><a href='#n10'>10</a></p>
+
+ </td>
+ <td class='text' valign='top'>
+<p id='t1' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>m1</span><span class='strut'> </span></p>
+<p id='t2' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>m2</span><span class='strut'> </span></p>
+<p id='t3' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>m3</span><span class='strut'> </span></p>
+<p id='t4' class='pln'><span class='strut'> </span></p>
+<p id='t5' class='stm run hide_run'><span class='nam'>a</span> <span class='op'>=</span> <span class='num'>5</span><span class='strut'> </span></p>
+<p id='t6' class='stm run hide_run'><span class='nam'>b</span> <span class='op'>=</span> <span class='num'>6</span><span class='strut'> </span></p>
+<p id='t7' class='pln'><span class='strut'> </span></p>
+<p id='t8' class='stm run hide_run'><span class='key'>assert</span> <span class='nam'>m1</span><span class='op'>.</span><span class='nam'>m1a</span> <span class='op'>==</span> <span class='num'>1</span><span class='strut'> </span></p>
+<p id='t9' class='stm run hide_run'><span class='key'>assert</span> <span class='nam'>m2</span><span class='op'>.</span><span class='nam'>m2a</span> <span class='op'>==</span> <span class='num'>1</span><span class='strut'> </span></p>
+<p id='t10' class='stm run hide_run'><span class='key'>assert</span> <span class='nam'>m3</span><span class='op'>.</span><span class='nam'>m3a</span> <span class='op'>==</span> <span class='num'>1</span><span class='strut'> </span></p>
+
+ </td>
+ </tr>
+ </table>
+</div>
+
+<div id='footer'>
+ <div class='content'>
+ <p>
+ <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.3.2a1</a>
+ </p>
+ </div>
+</div>
+
+</body>
+</html>
diff --git a/test/farm/html/gold_omit_2/index.html b/test/farm/html/gold_omit_2/index.html new file mode 100644 index 00000000..6fababf4 --- /dev/null +++ b/test/farm/html/gold_omit_2/index.html @@ -0,0 +1,90 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+ <title>Coverage report</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='jquery.tablesorter.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
+ <script type='text/javascript' charset='utf-8'>
+ jQuery(document).ready(index_ready);
+ </script>
+</head>
+<body id='indexfile'>
+
+<div id='header'>
+ <div class='content'>
+ <h1>Coverage report:
+ <span class='pc_cov'>100%</span>
+ </h1>
+ </div>
+</div>
+
+<div id='index'>
+ <table class='index'>
+ <thead>
+
+ <tr class='tablehead' title='Click to sort'>
+ <th class='name left headerSortDown'>Module</th>
+ <th>statements</th>
+ <th>missing</th>
+ <th>excluded</th>
+
+ <th class='right'>coverage</th>
+ </tr>
+ </thead>
+
+ <tfoot>
+ <tr class='total'>
+ <td class='name left'>Total</td>
+ <td>12</td>
+ <td>0</td>
+ <td>0</td>
+
+ <td class='right'>100%</td>
+ </tr>
+ </tfoot>
+ <tbody>
+
+ <tr class='file'>
+ <td class='name left'><a href='m2.html'>m2</a></td>
+ <td>2</td>
+ <td>0</td>
+ <td>0</td>
+
+ <td class='right'>100%</td>
+ </tr>
+
+ <tr class='file'>
+ <td class='name left'><a href='m3.html'>m3</a></td>
+ <td>2</td>
+ <td>0</td>
+ <td>0</td>
+
+ <td class='right'>100%</td>
+ </tr>
+
+ <tr class='file'>
+ <td class='name left'><a href='main.html'>main</a></td>
+ <td>8</td>
+ <td>0</td>
+ <td>0</td>
+
+ <td class='right'>100%</td>
+ </tr>
+
+ </tbody>
+ </table>
+</div>
+
+<div id='footer'>
+ <div class='content'>
+ <p>
+ <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.3.2a1</a>
+ </p>
+ </div>
+</div>
+
+</body>
+</html>
diff --git a/test/farm/html/gold_omit_2/m2.html b/test/farm/html/gold_omit_2/m2.html new file mode 100644 index 00000000..6cbf78ed --- /dev/null +++ b/test/farm/html/gold_omit_2/m2.html @@ -0,0 +1,59 @@ +<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+
+
+ <meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
+ <title>Coverage for m2: 100%</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
+ <script type='text/javascript' charset='utf-8'>
+ jQuery(document).ready(pyfile_ready);
+ </script>
+</head>
+<body id='pyfile'>
+
+<div id='header'>
+ <div class='content'>
+ <h1>Coverage for <b>m2</b> :
+ <span class='pc_cov'>100%</span>
+ </h1>
+ <h2 class='stats'>
+ 2 statements
+ <span class='run hide_run' onclick='toggle_lines(this, "run")'>2 run</span>
+ <span class='mis' onclick='toggle_lines(this, "mis")'>0 missing</span>
+ <span class='exc' onclick='toggle_lines(this, "exc")'>0 excluded</span>
+
+ </h2>
+ </div>
+</div>
+
+<div id='source'>
+ <table cellspacing='0' cellpadding='0'>
+ <tr>
+ <td class='linenos' valign='top'>
+<p id='n1' class='stm run hide_run'><a href='#n1'>1</a></p>
+<p id='n2' class='stm run hide_run'><a href='#n2'>2</a></p>
+
+ </td>
+ <td class='text' valign='top'>
+<p id='t1' class='stm run hide_run'><span class='nam'>m2a</span> <span class='op'>=</span> <span class='num'>1</span><span class='strut'> </span></p>
+<p id='t2' class='stm run hide_run'><span class='nam'>m2b</span> <span class='op'>=</span> <span class='num'>2</span><span class='strut'> </span></p>
+
+ </td>
+ </tr>
+ </table>
+</div>
+
+<div id='footer'>
+ <div class='content'>
+ <p>
+ <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.3.2a1</a>
+ </p>
+ </div>
+</div>
+
+</body>
+</html>
diff --git a/test/farm/html/gold_omit_2/m3.html b/test/farm/html/gold_omit_2/m3.html new file mode 100644 index 00000000..6e618619 --- /dev/null +++ b/test/farm/html/gold_omit_2/m3.html @@ -0,0 +1,59 @@ +<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+
+
+ <meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
+ <title>Coverage for m3: 100%</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
+ <script type='text/javascript' charset='utf-8'>
+ jQuery(document).ready(pyfile_ready);
+ </script>
+</head>
+<body id='pyfile'>
+
+<div id='header'>
+ <div class='content'>
+ <h1>Coverage for <b>m3</b> :
+ <span class='pc_cov'>100%</span>
+ </h1>
+ <h2 class='stats'>
+ 2 statements
+ <span class='run hide_run' onclick='toggle_lines(this, "run")'>2 run</span>
+ <span class='mis' onclick='toggle_lines(this, "mis")'>0 missing</span>
+ <span class='exc' onclick='toggle_lines(this, "exc")'>0 excluded</span>
+
+ </h2>
+ </div>
+</div>
+
+<div id='source'>
+ <table cellspacing='0' cellpadding='0'>
+ <tr>
+ <td class='linenos' valign='top'>
+<p id='n1' class='stm run hide_run'><a href='#n1'>1</a></p>
+<p id='n2' class='stm run hide_run'><a href='#n2'>2</a></p>
+
+ </td>
+ <td class='text' valign='top'>
+<p id='t1' class='stm run hide_run'><span class='nam'>m3a</span> <span class='op'>=</span> <span class='num'>1</span><span class='strut'> </span></p>
+<p id='t2' class='stm run hide_run'><span class='nam'>m3b</span> <span class='op'>=</span> <span class='num'>2</span><span class='strut'> </span></p>
+
+ </td>
+ </tr>
+ </table>
+</div>
+
+<div id='footer'>
+ <div class='content'>
+ <p>
+ <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.3.2a1</a>
+ </p>
+ </div>
+</div>
+
+</body>
+</html>
diff --git a/test/farm/html/gold_omit_2/main.html b/test/farm/html/gold_omit_2/main.html new file mode 100644 index 00000000..d7b84c45 --- /dev/null +++ b/test/farm/html/gold_omit_2/main.html @@ -0,0 +1,75 @@ +<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+
+
+ <meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
+ <title>Coverage for main: 100%</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
+ <script type='text/javascript' charset='utf-8'>
+ jQuery(document).ready(pyfile_ready);
+ </script>
+</head>
+<body id='pyfile'>
+
+<div id='header'>
+ <div class='content'>
+ <h1>Coverage for <b>main</b> :
+ <span class='pc_cov'>100%</span>
+ </h1>
+ <h2 class='stats'>
+ 8 statements
+ <span class='run hide_run' onclick='toggle_lines(this, "run")'>8 run</span>
+ <span class='mis' onclick='toggle_lines(this, "mis")'>0 missing</span>
+ <span class='exc' onclick='toggle_lines(this, "exc")'>0 excluded</span>
+
+ </h2>
+ </div>
+</div>
+
+<div id='source'>
+ <table cellspacing='0' cellpadding='0'>
+ <tr>
+ <td class='linenos' valign='top'>
+<p id='n1' class='stm run hide_run'><a href='#n1'>1</a></p>
+<p id='n2' class='stm run hide_run'><a href='#n2'>2</a></p>
+<p id='n3' class='stm run hide_run'><a href='#n3'>3</a></p>
+<p id='n4' class='pln'><a href='#n4'>4</a></p>
+<p id='n5' class='stm run hide_run'><a href='#n5'>5</a></p>
+<p id='n6' class='stm run hide_run'><a href='#n6'>6</a></p>
+<p id='n7' class='pln'><a href='#n7'>7</a></p>
+<p id='n8' class='stm run hide_run'><a href='#n8'>8</a></p>
+<p id='n9' class='stm run hide_run'><a href='#n9'>9</a></p>
+<p id='n10' class='stm run hide_run'><a href='#n10'>10</a></p>
+
+ </td>
+ <td class='text' valign='top'>
+<p id='t1' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>m1</span><span class='strut'> </span></p>
+<p id='t2' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>m2</span><span class='strut'> </span></p>
+<p id='t3' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>m3</span><span class='strut'> </span></p>
+<p id='t4' class='pln'><span class='strut'> </span></p>
+<p id='t5' class='stm run hide_run'><span class='nam'>a</span> <span class='op'>=</span> <span class='num'>5</span><span class='strut'> </span></p>
+<p id='t6' class='stm run hide_run'><span class='nam'>b</span> <span class='op'>=</span> <span class='num'>6</span><span class='strut'> </span></p>
+<p id='t7' class='pln'><span class='strut'> </span></p>
+<p id='t8' class='stm run hide_run'><span class='key'>assert</span> <span class='nam'>m1</span><span class='op'>.</span><span class='nam'>m1a</span> <span class='op'>==</span> <span class='num'>1</span><span class='strut'> </span></p>
+<p id='t9' class='stm run hide_run'><span class='key'>assert</span> <span class='nam'>m2</span><span class='op'>.</span><span class='nam'>m2a</span> <span class='op'>==</span> <span class='num'>1</span><span class='strut'> </span></p>
+<p id='t10' class='stm run hide_run'><span class='key'>assert</span> <span class='nam'>m3</span><span class='op'>.</span><span class='nam'>m3a</span> <span class='op'>==</span> <span class='num'>1</span><span class='strut'> </span></p>
+
+ </td>
+ </tr>
+ </table>
+</div>
+
+<div id='footer'>
+ <div class='content'>
+ <p>
+ <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.3.2a1</a>
+ </p>
+ </div>
+</div>
+
+</body>
+</html>
diff --git a/test/farm/html/gold_omit_3/index.html b/test/farm/html/gold_omit_3/index.html new file mode 100644 index 00000000..919fc965 --- /dev/null +++ b/test/farm/html/gold_omit_3/index.html @@ -0,0 +1,81 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+ <title>Coverage report</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='jquery.tablesorter.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
+ <script type='text/javascript' charset='utf-8'>
+ jQuery(document).ready(index_ready);
+ </script>
+</head>
+<body id='indexfile'>
+
+<div id='header'>
+ <div class='content'>
+ <h1>Coverage report:
+ <span class='pc_cov'>100%</span>
+ </h1>
+ </div>
+</div>
+
+<div id='index'>
+ <table class='index'>
+ <thead>
+
+ <tr class='tablehead' title='Click to sort'>
+ <th class='name left headerSortDown'>Module</th>
+ <th>statements</th>
+ <th>missing</th>
+ <th>excluded</th>
+
+ <th class='right'>coverage</th>
+ </tr>
+ </thead>
+
+ <tfoot>
+ <tr class='total'>
+ <td class='name left'>Total</td>
+ <td>10</td>
+ <td>0</td>
+ <td>0</td>
+
+ <td class='right'>100%</td>
+ </tr>
+ </tfoot>
+ <tbody>
+
+ <tr class='file'>
+ <td class='name left'><a href='m3.html'>m3</a></td>
+ <td>2</td>
+ <td>0</td>
+ <td>0</td>
+
+ <td class='right'>100%</td>
+ </tr>
+
+ <tr class='file'>
+ <td class='name left'><a href='main.html'>main</a></td>
+ <td>8</td>
+ <td>0</td>
+ <td>0</td>
+
+ <td class='right'>100%</td>
+ </tr>
+
+ </tbody>
+ </table>
+</div>
+
+<div id='footer'>
+ <div class='content'>
+ <p>
+ <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.3.2a1</a>
+ </p>
+ </div>
+</div>
+
+</body>
+</html>
diff --git a/test/farm/html/gold_omit_3/m3.html b/test/farm/html/gold_omit_3/m3.html new file mode 100644 index 00000000..6e618619 --- /dev/null +++ b/test/farm/html/gold_omit_3/m3.html @@ -0,0 +1,59 @@ +<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+
+
+ <meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
+ <title>Coverage for m3: 100%</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
+ <script type='text/javascript' charset='utf-8'>
+ jQuery(document).ready(pyfile_ready);
+ </script>
+</head>
+<body id='pyfile'>
+
+<div id='header'>
+ <div class='content'>
+ <h1>Coverage for <b>m3</b> :
+ <span class='pc_cov'>100%</span>
+ </h1>
+ <h2 class='stats'>
+ 2 statements
+ <span class='run hide_run' onclick='toggle_lines(this, "run")'>2 run</span>
+ <span class='mis' onclick='toggle_lines(this, "mis")'>0 missing</span>
+ <span class='exc' onclick='toggle_lines(this, "exc")'>0 excluded</span>
+
+ </h2>
+ </div>
+</div>
+
+<div id='source'>
+ <table cellspacing='0' cellpadding='0'>
+ <tr>
+ <td class='linenos' valign='top'>
+<p id='n1' class='stm run hide_run'><a href='#n1'>1</a></p>
+<p id='n2' class='stm run hide_run'><a href='#n2'>2</a></p>
+
+ </td>
+ <td class='text' valign='top'>
+<p id='t1' class='stm run hide_run'><span class='nam'>m3a</span> <span class='op'>=</span> <span class='num'>1</span><span class='strut'> </span></p>
+<p id='t2' class='stm run hide_run'><span class='nam'>m3b</span> <span class='op'>=</span> <span class='num'>2</span><span class='strut'> </span></p>
+
+ </td>
+ </tr>
+ </table>
+</div>
+
+<div id='footer'>
+ <div class='content'>
+ <p>
+ <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.3.2a1</a>
+ </p>
+ </div>
+</div>
+
+</body>
+</html>
diff --git a/test/farm/html/gold_omit_3/main.html b/test/farm/html/gold_omit_3/main.html new file mode 100644 index 00000000..d7b84c45 --- /dev/null +++ b/test/farm/html/gold_omit_3/main.html @@ -0,0 +1,75 @@ +<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+
+
+ <meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
+ <title>Coverage for main: 100%</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
+ <script type='text/javascript' charset='utf-8'>
+ jQuery(document).ready(pyfile_ready);
+ </script>
+</head>
+<body id='pyfile'>
+
+<div id='header'>
+ <div class='content'>
+ <h1>Coverage for <b>main</b> :
+ <span class='pc_cov'>100%</span>
+ </h1>
+ <h2 class='stats'>
+ 8 statements
+ <span class='run hide_run' onclick='toggle_lines(this, "run")'>8 run</span>
+ <span class='mis' onclick='toggle_lines(this, "mis")'>0 missing</span>
+ <span class='exc' onclick='toggle_lines(this, "exc")'>0 excluded</span>
+
+ </h2>
+ </div>
+</div>
+
+<div id='source'>
+ <table cellspacing='0' cellpadding='0'>
+ <tr>
+ <td class='linenos' valign='top'>
+<p id='n1' class='stm run hide_run'><a href='#n1'>1</a></p>
+<p id='n2' class='stm run hide_run'><a href='#n2'>2</a></p>
+<p id='n3' class='stm run hide_run'><a href='#n3'>3</a></p>
+<p id='n4' class='pln'><a href='#n4'>4</a></p>
+<p id='n5' class='stm run hide_run'><a href='#n5'>5</a></p>
+<p id='n6' class='stm run hide_run'><a href='#n6'>6</a></p>
+<p id='n7' class='pln'><a href='#n7'>7</a></p>
+<p id='n8' class='stm run hide_run'><a href='#n8'>8</a></p>
+<p id='n9' class='stm run hide_run'><a href='#n9'>9</a></p>
+<p id='n10' class='stm run hide_run'><a href='#n10'>10</a></p>
+
+ </td>
+ <td class='text' valign='top'>
+<p id='t1' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>m1</span><span class='strut'> </span></p>
+<p id='t2' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>m2</span><span class='strut'> </span></p>
+<p id='t3' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>m3</span><span class='strut'> </span></p>
+<p id='t4' class='pln'><span class='strut'> </span></p>
+<p id='t5' class='stm run hide_run'><span class='nam'>a</span> <span class='op'>=</span> <span class='num'>5</span><span class='strut'> </span></p>
+<p id='t6' class='stm run hide_run'><span class='nam'>b</span> <span class='op'>=</span> <span class='num'>6</span><span class='strut'> </span></p>
+<p id='t7' class='pln'><span class='strut'> </span></p>
+<p id='t8' class='stm run hide_run'><span class='key'>assert</span> <span class='nam'>m1</span><span class='op'>.</span><span class='nam'>m1a</span> <span class='op'>==</span> <span class='num'>1</span><span class='strut'> </span></p>
+<p id='t9' class='stm run hide_run'><span class='key'>assert</span> <span class='nam'>m2</span><span class='op'>.</span><span class='nam'>m2a</span> <span class='op'>==</span> <span class='num'>1</span><span class='strut'> </span></p>
+<p id='t10' class='stm run hide_run'><span class='key'>assert</span> <span class='nam'>m3</span><span class='op'>.</span><span class='nam'>m3a</span> <span class='op'>==</span> <span class='num'>1</span><span class='strut'> </span></p>
+
+ </td>
+ </tr>
+ </table>
+</div>
+
+<div id='footer'>
+ <div class='content'>
+ <p>
+ <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.3.2a1</a>
+ </p>
+ </div>
+</div>
+
+</body>
+</html>
diff --git a/test/farm/html/gold_omit_4/index.html b/test/farm/html/gold_omit_4/index.html new file mode 100644 index 00000000..1d528d39 --- /dev/null +++ b/test/farm/html/gold_omit_4/index.html @@ -0,0 +1,90 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+ <title>Coverage report</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='jquery.tablesorter.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
+ <script type='text/javascript' charset='utf-8'>
+ jQuery(document).ready(index_ready);
+ </script>
+</head>
+<body id='indexfile'>
+
+<div id='header'>
+ <div class='content'>
+ <h1>Coverage report:
+ <span class='pc_cov'>100%</span>
+ </h1>
+ </div>
+</div>
+
+<div id='index'>
+ <table class='index'>
+ <thead>
+
+ <tr class='tablehead' title='Click to sort'>
+ <th class='name left headerSortDown'>Module</th>
+ <th>statements</th>
+ <th>missing</th>
+ <th>excluded</th>
+
+ <th class='right'>coverage</th>
+ </tr>
+ </thead>
+
+ <tfoot>
+ <tr class='total'>
+ <td class='name left'>Total</td>
+ <td>12</td>
+ <td>0</td>
+ <td>0</td>
+
+ <td class='right'>100%</td>
+ </tr>
+ </tfoot>
+ <tbody>
+
+ <tr class='file'>
+ <td class='name left'><a href='m1.html'>m1</a></td>
+ <td>2</td>
+ <td>0</td>
+ <td>0</td>
+
+ <td class='right'>100%</td>
+ </tr>
+
+ <tr class='file'>
+ <td class='name left'><a href='m3.html'>m3</a></td>
+ <td>2</td>
+ <td>0</td>
+ <td>0</td>
+
+ <td class='right'>100%</td>
+ </tr>
+
+ <tr class='file'>
+ <td class='name left'><a href='main.html'>main</a></td>
+ <td>8</td>
+ <td>0</td>
+ <td>0</td>
+
+ <td class='right'>100%</td>
+ </tr>
+
+ </tbody>
+ </table>
+</div>
+
+<div id='footer'>
+ <div class='content'>
+ <p>
+ <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.3.2a1</a>
+ </p>
+ </div>
+</div>
+
+</body>
+</html>
diff --git a/test/farm/html/gold_omit_4/m1.html b/test/farm/html/gold_omit_4/m1.html new file mode 100644 index 00000000..20b86df7 --- /dev/null +++ b/test/farm/html/gold_omit_4/m1.html @@ -0,0 +1,59 @@ +<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+
+
+ <meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
+ <title>Coverage for m1: 100%</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
+ <script type='text/javascript' charset='utf-8'>
+ jQuery(document).ready(pyfile_ready);
+ </script>
+</head>
+<body id='pyfile'>
+
+<div id='header'>
+ <div class='content'>
+ <h1>Coverage for <b>m1</b> :
+ <span class='pc_cov'>100%</span>
+ </h1>
+ <h2 class='stats'>
+ 2 statements
+ <span class='run hide_run' onclick='toggle_lines(this, "run")'>2 run</span>
+ <span class='mis' onclick='toggle_lines(this, "mis")'>0 missing</span>
+ <span class='exc' onclick='toggle_lines(this, "exc")'>0 excluded</span>
+
+ </h2>
+ </div>
+</div>
+
+<div id='source'>
+ <table cellspacing='0' cellpadding='0'>
+ <tr>
+ <td class='linenos' valign='top'>
+<p id='n1' class='stm run hide_run'><a href='#n1'>1</a></p>
+<p id='n2' class='stm run hide_run'><a href='#n2'>2</a></p>
+
+ </td>
+ <td class='text' valign='top'>
+<p id='t1' class='stm run hide_run'><span class='nam'>m1a</span> <span class='op'>=</span> <span class='num'>1</span><span class='strut'> </span></p>
+<p id='t2' class='stm run hide_run'><span class='nam'>m1b</span> <span class='op'>=</span> <span class='num'>2</span><span class='strut'> </span></p>
+
+ </td>
+ </tr>
+ </table>
+</div>
+
+<div id='footer'>
+ <div class='content'>
+ <p>
+ <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.3.2a1</a>
+ </p>
+ </div>
+</div>
+
+</body>
+</html>
diff --git a/test/farm/html/gold_omit_4/m3.html b/test/farm/html/gold_omit_4/m3.html new file mode 100644 index 00000000..6e618619 --- /dev/null +++ b/test/farm/html/gold_omit_4/m3.html @@ -0,0 +1,59 @@ +<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+
+
+ <meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
+ <title>Coverage for m3: 100%</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
+ <script type='text/javascript' charset='utf-8'>
+ jQuery(document).ready(pyfile_ready);
+ </script>
+</head>
+<body id='pyfile'>
+
+<div id='header'>
+ <div class='content'>
+ <h1>Coverage for <b>m3</b> :
+ <span class='pc_cov'>100%</span>
+ </h1>
+ <h2 class='stats'>
+ 2 statements
+ <span class='run hide_run' onclick='toggle_lines(this, "run")'>2 run</span>
+ <span class='mis' onclick='toggle_lines(this, "mis")'>0 missing</span>
+ <span class='exc' onclick='toggle_lines(this, "exc")'>0 excluded</span>
+
+ </h2>
+ </div>
+</div>
+
+<div id='source'>
+ <table cellspacing='0' cellpadding='0'>
+ <tr>
+ <td class='linenos' valign='top'>
+<p id='n1' class='stm run hide_run'><a href='#n1'>1</a></p>
+<p id='n2' class='stm run hide_run'><a href='#n2'>2</a></p>
+
+ </td>
+ <td class='text' valign='top'>
+<p id='t1' class='stm run hide_run'><span class='nam'>m3a</span> <span class='op'>=</span> <span class='num'>1</span><span class='strut'> </span></p>
+<p id='t2' class='stm run hide_run'><span class='nam'>m3b</span> <span class='op'>=</span> <span class='num'>2</span><span class='strut'> </span></p>
+
+ </td>
+ </tr>
+ </table>
+</div>
+
+<div id='footer'>
+ <div class='content'>
+ <p>
+ <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.3.2a1</a>
+ </p>
+ </div>
+</div>
+
+</body>
+</html>
diff --git a/test/farm/html/gold_omit_4/main.html b/test/farm/html/gold_omit_4/main.html new file mode 100644 index 00000000..d7b84c45 --- /dev/null +++ b/test/farm/html/gold_omit_4/main.html @@ -0,0 +1,75 @@ +<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+
+
+ <meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
+ <title>Coverage for main: 100%</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
+ <script type='text/javascript' charset='utf-8'>
+ jQuery(document).ready(pyfile_ready);
+ </script>
+</head>
+<body id='pyfile'>
+
+<div id='header'>
+ <div class='content'>
+ <h1>Coverage for <b>main</b> :
+ <span class='pc_cov'>100%</span>
+ </h1>
+ <h2 class='stats'>
+ 8 statements
+ <span class='run hide_run' onclick='toggle_lines(this, "run")'>8 run</span>
+ <span class='mis' onclick='toggle_lines(this, "mis")'>0 missing</span>
+ <span class='exc' onclick='toggle_lines(this, "exc")'>0 excluded</span>
+
+ </h2>
+ </div>
+</div>
+
+<div id='source'>
+ <table cellspacing='0' cellpadding='0'>
+ <tr>
+ <td class='linenos' valign='top'>
+<p id='n1' class='stm run hide_run'><a href='#n1'>1</a></p>
+<p id='n2' class='stm run hide_run'><a href='#n2'>2</a></p>
+<p id='n3' class='stm run hide_run'><a href='#n3'>3</a></p>
+<p id='n4' class='pln'><a href='#n4'>4</a></p>
+<p id='n5' class='stm run hide_run'><a href='#n5'>5</a></p>
+<p id='n6' class='stm run hide_run'><a href='#n6'>6</a></p>
+<p id='n7' class='pln'><a href='#n7'>7</a></p>
+<p id='n8' class='stm run hide_run'><a href='#n8'>8</a></p>
+<p id='n9' class='stm run hide_run'><a href='#n9'>9</a></p>
+<p id='n10' class='stm run hide_run'><a href='#n10'>10</a></p>
+
+ </td>
+ <td class='text' valign='top'>
+<p id='t1' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>m1</span><span class='strut'> </span></p>
+<p id='t2' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>m2</span><span class='strut'> </span></p>
+<p id='t3' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>m3</span><span class='strut'> </span></p>
+<p id='t4' class='pln'><span class='strut'> </span></p>
+<p id='t5' class='stm run hide_run'><span class='nam'>a</span> <span class='op'>=</span> <span class='num'>5</span><span class='strut'> </span></p>
+<p id='t6' class='stm run hide_run'><span class='nam'>b</span> <span class='op'>=</span> <span class='num'>6</span><span class='strut'> </span></p>
+<p id='t7' class='pln'><span class='strut'> </span></p>
+<p id='t8' class='stm run hide_run'><span class='key'>assert</span> <span class='nam'>m1</span><span class='op'>.</span><span class='nam'>m1a</span> <span class='op'>==</span> <span class='num'>1</span><span class='strut'> </span></p>
+<p id='t9' class='stm run hide_run'><span class='key'>assert</span> <span class='nam'>m2</span><span class='op'>.</span><span class='nam'>m2a</span> <span class='op'>==</span> <span class='num'>1</span><span class='strut'> </span></p>
+<p id='t10' class='stm run hide_run'><span class='key'>assert</span> <span class='nam'>m3</span><span class='op'>.</span><span class='nam'>m3a</span> <span class='op'>==</span> <span class='num'>1</span><span class='strut'> </span></p>
+
+ </td>
+ </tr>
+ </table>
+</div>
+
+<div id='footer'>
+ <div class='content'>
+ <p>
+ <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.3.2a1</a>
+ </p>
+ </div>
+</div>
+
+</body>
+</html>
diff --git a/test/farm/html/gold_omit_5/index.html b/test/farm/html/gold_omit_5/index.html new file mode 100644 index 00000000..61eeceb8 --- /dev/null +++ b/test/farm/html/gold_omit_5/index.html @@ -0,0 +1,81 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+ <title>Coverage report</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='jquery.tablesorter.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
+ <script type='text/javascript' charset='utf-8'>
+ jQuery(document).ready(index_ready);
+ </script>
+</head>
+<body id='indexfile'>
+
+<div id='header'>
+ <div class='content'>
+ <h1>Coverage report:
+ <span class='pc_cov'>100%</span>
+ </h1>
+ </div>
+</div>
+
+<div id='index'>
+ <table class='index'>
+ <thead>
+
+ <tr class='tablehead' title='Click to sort'>
+ <th class='name left headerSortDown'>Module</th>
+ <th>statements</th>
+ <th>missing</th>
+ <th>excluded</th>
+
+ <th class='right'>coverage</th>
+ </tr>
+ </thead>
+
+ <tfoot>
+ <tr class='total'>
+ <td class='name left'>Total</td>
+ <td>10</td>
+ <td>0</td>
+ <td>0</td>
+
+ <td class='right'>100%</td>
+ </tr>
+ </tfoot>
+ <tbody>
+
+ <tr class='file'>
+ <td class='name left'><a href='m1.html'>m1</a></td>
+ <td>2</td>
+ <td>0</td>
+ <td>0</td>
+
+ <td class='right'>100%</td>
+ </tr>
+
+ <tr class='file'>
+ <td class='name left'><a href='main.html'>main</a></td>
+ <td>8</td>
+ <td>0</td>
+ <td>0</td>
+
+ <td class='right'>100%</td>
+ </tr>
+
+ </tbody>
+ </table>
+</div>
+
+<div id='footer'>
+ <div class='content'>
+ <p>
+ <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.3.2a1</a>
+ </p>
+ </div>
+</div>
+
+</body>
+</html>
diff --git a/test/farm/html/gold_omit_5/m1.html b/test/farm/html/gold_omit_5/m1.html new file mode 100644 index 00000000..20b86df7 --- /dev/null +++ b/test/farm/html/gold_omit_5/m1.html @@ -0,0 +1,59 @@ +<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+
+
+ <meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
+ <title>Coverage for m1: 100%</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
+ <script type='text/javascript' charset='utf-8'>
+ jQuery(document).ready(pyfile_ready);
+ </script>
+</head>
+<body id='pyfile'>
+
+<div id='header'>
+ <div class='content'>
+ <h1>Coverage for <b>m1</b> :
+ <span class='pc_cov'>100%</span>
+ </h1>
+ <h2 class='stats'>
+ 2 statements
+ <span class='run hide_run' onclick='toggle_lines(this, "run")'>2 run</span>
+ <span class='mis' onclick='toggle_lines(this, "mis")'>0 missing</span>
+ <span class='exc' onclick='toggle_lines(this, "exc")'>0 excluded</span>
+
+ </h2>
+ </div>
+</div>
+
+<div id='source'>
+ <table cellspacing='0' cellpadding='0'>
+ <tr>
+ <td class='linenos' valign='top'>
+<p id='n1' class='stm run hide_run'><a href='#n1'>1</a></p>
+<p id='n2' class='stm run hide_run'><a href='#n2'>2</a></p>
+
+ </td>
+ <td class='text' valign='top'>
+<p id='t1' class='stm run hide_run'><span class='nam'>m1a</span> <span class='op'>=</span> <span class='num'>1</span><span class='strut'> </span></p>
+<p id='t2' class='stm run hide_run'><span class='nam'>m1b</span> <span class='op'>=</span> <span class='num'>2</span><span class='strut'> </span></p>
+
+ </td>
+ </tr>
+ </table>
+</div>
+
+<div id='footer'>
+ <div class='content'>
+ <p>
+ <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.3.2a1</a>
+ </p>
+ </div>
+</div>
+
+</body>
+</html>
diff --git a/test/farm/html/gold_omit_5/main.html b/test/farm/html/gold_omit_5/main.html new file mode 100644 index 00000000..d7b84c45 --- /dev/null +++ b/test/farm/html/gold_omit_5/main.html @@ -0,0 +1,75 @@ +<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+
+
+ <meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
+ <title>Coverage for main: 100%</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
+ <script type='text/javascript' charset='utf-8'>
+ jQuery(document).ready(pyfile_ready);
+ </script>
+</head>
+<body id='pyfile'>
+
+<div id='header'>
+ <div class='content'>
+ <h1>Coverage for <b>main</b> :
+ <span class='pc_cov'>100%</span>
+ </h1>
+ <h2 class='stats'>
+ 8 statements
+ <span class='run hide_run' onclick='toggle_lines(this, "run")'>8 run</span>
+ <span class='mis' onclick='toggle_lines(this, "mis")'>0 missing</span>
+ <span class='exc' onclick='toggle_lines(this, "exc")'>0 excluded</span>
+
+ </h2>
+ </div>
+</div>
+
+<div id='source'>
+ <table cellspacing='0' cellpadding='0'>
+ <tr>
+ <td class='linenos' valign='top'>
+<p id='n1' class='stm run hide_run'><a href='#n1'>1</a></p>
+<p id='n2' class='stm run hide_run'><a href='#n2'>2</a></p>
+<p id='n3' class='stm run hide_run'><a href='#n3'>3</a></p>
+<p id='n4' class='pln'><a href='#n4'>4</a></p>
+<p id='n5' class='stm run hide_run'><a href='#n5'>5</a></p>
+<p id='n6' class='stm run hide_run'><a href='#n6'>6</a></p>
+<p id='n7' class='pln'><a href='#n7'>7</a></p>
+<p id='n8' class='stm run hide_run'><a href='#n8'>8</a></p>
+<p id='n9' class='stm run hide_run'><a href='#n9'>9</a></p>
+<p id='n10' class='stm run hide_run'><a href='#n10'>10</a></p>
+
+ </td>
+ <td class='text' valign='top'>
+<p id='t1' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>m1</span><span class='strut'> </span></p>
+<p id='t2' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>m2</span><span class='strut'> </span></p>
+<p id='t3' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>m3</span><span class='strut'> </span></p>
+<p id='t4' class='pln'><span class='strut'> </span></p>
+<p id='t5' class='stm run hide_run'><span class='nam'>a</span> <span class='op'>=</span> <span class='num'>5</span><span class='strut'> </span></p>
+<p id='t6' class='stm run hide_run'><span class='nam'>b</span> <span class='op'>=</span> <span class='num'>6</span><span class='strut'> </span></p>
+<p id='t7' class='pln'><span class='strut'> </span></p>
+<p id='t8' class='stm run hide_run'><span class='key'>assert</span> <span class='nam'>m1</span><span class='op'>.</span><span class='nam'>m1a</span> <span class='op'>==</span> <span class='num'>1</span><span class='strut'> </span></p>
+<p id='t9' class='stm run hide_run'><span class='key'>assert</span> <span class='nam'>m2</span><span class='op'>.</span><span class='nam'>m2a</span> <span class='op'>==</span> <span class='num'>1</span><span class='strut'> </span></p>
+<p id='t10' class='stm run hide_run'><span class='key'>assert</span> <span class='nam'>m3</span><span class='op'>.</span><span class='nam'>m3a</span> <span class='op'>==</span> <span class='num'>1</span><span class='strut'> </span></p>
+
+ </td>
+ </tr>
+ </table>
+</div>
+
+<div id='footer'>
+ <div class='content'>
+ <p>
+ <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.3.2a1</a>
+ </p>
+ </div>
+</div>
+
+</body>
+</html>
diff --git a/test/farm/html/gold_other/blah_blah_other.html b/test/farm/html/gold_other/blah_blah_other.html index 8f25d256..46e05aaf 100644 --- a/test/farm/html/gold_other/blah_blah_other.html +++ b/test/farm/html/gold_other/blah_blah_other.html @@ -1,57 +1,62 @@ <!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
-<title>Coverage for c:\ned\coverage\trunk\test\farm\html\othersrc\other</title>
-<link rel='stylesheet' href='style.css' type='text/css'>
-<script src='jquery-1.3.2.min.js'></script>
-<script>
-function toggle_lines(btn, cls) {
- var btn = $(btn);
- if (btn.hasClass("hide")) {
- $("#source ."+cls).removeClass("hide");
- btn.removeClass("hide");
- }
- else {
- $("#source ."+cls).addClass("hide");
- btn.addClass("hide");
- }
-}
-</script>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+
+
+ <meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
+ <title>Coverage for othersrc\other: 100%</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
+ <script type='text/javascript' charset='utf-8'>
+ jQuery(document).ready(pyfile_ready);
+ </script>
</head>
-<body>
+<body id='pyfile'>
+
<div id='header'>
<div class='content'>
- <h1>Coverage for <b>c:\ned\coverage\trunk\test\farm\html\othersrc\other</b> :
+ <h1>Coverage for <b>othersrc\other</b> :
<span class='pc_cov'>100%</span>
</h1>
<h2 class='stats'>
1 statements
- <span class='run hide' onclick='toggle_lines(this, "run")'>1 run</span>
- <span class='exc' onclick='toggle_lines(this, "exc")'>0 excluded</span>
+ <span class='run hide_run' onclick='toggle_lines(this, "run")'>1 run</span>
<span class='mis' onclick='toggle_lines(this, "mis")'>0 missing</span>
+ <span class='exc' onclick='toggle_lines(this, "exc")'>0 excluded</span>
+
</h2>
</div>
</div>
<div id='source'>
-<table cellspacing='0' cellpadding='0'>
-<tr>
-<td class='linenos' valign='top'>
-<p class='pln'>1</p>
-<p class='pln'>2</p>
-<p class='pln'>3</p>
-<p class='stm run hide'>4</p>
-
-</td>
-<td class='text' valign='top'>
-<p class='pln'><span class='com'># A file in another directory. We're checking that it ends up in the</span><span class="strut"> </span></p>
-<p class='pln'><span class='com'># HTML report.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>print</span><span class='op'>(</span><span class='str'>"This is the other src!"</span><span class='op'>)</span><span class="strut"> </span></p>
-
-</td>
-</tr>
-</table>
+ <table cellspacing='0' cellpadding='0'>
+ <tr>
+ <td class='linenos' valign='top'>
+<p id='n1' class='pln'><a href='#n1'>1</a></p>
+<p id='n2' class='pln'><a href='#n2'>2</a></p>
+<p id='n3' class='pln'><a href='#n3'>3</a></p>
+<p id='n4' class='stm run hide_run'><a href='#n4'>4</a></p>
+
+ </td>
+ <td class='text' valign='top'>
+<p id='t1' class='pln'><span class='com'># A file in another directory. We're checking that it ends up in the</span><span class='strut'> </span></p>
+<p id='t2' class='pln'><span class='com'># HTML report.</span><span class='strut'> </span></p>
+<p id='t3' class='pln'><span class='strut'> </span></p>
+<p id='t4' class='stm run hide_run'><span class='key'>print</span><span class='op'>(</span><span class='str'>"This is the other src!"</span><span class='op'>)</span><span class='strut'> </span></p>
+
+ </td>
+ </tr>
+ </table>
+</div>
+
+<div id='footer'>
+ <div class='content'>
+ <p>
+ <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.3.2a1</a>
+ </p>
+ </div>
</div>
</body>
diff --git a/test/farm/html/gold_other/here.html b/test/farm/html/gold_other/here.html index a6e70dff..1ae248f5 100644 --- a/test/farm/html/gold_other/here.html +++ b/test/farm/html/gold_other/here.html @@ -1,24 +1,20 @@ <!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
-<title>Coverage for here</title>
-<link rel='stylesheet' href='style.css' type='text/css'>
-<script src='jquery-1.3.2.min.js'></script>
-<script>
-function toggle_lines(btn, cls) {
- var btn = $(btn);
- if (btn.hasClass("hide")) {
- $("#source ."+cls).removeClass("hide");
- btn.removeClass("hide");
- }
- else {
- $("#source ."+cls).addClass("hide");
- btn.addClass("hide");
- }
-}
-</script>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+
+
+ <meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
+ <title>Coverage for here: 75%</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
+ <script type='text/javascript' charset='utf-8'>
+ jQuery(document).ready(pyfile_ready);
+ </script>
</head>
-<body>
+<body id='pyfile'>
+
<div id='header'>
<div class='content'>
<h1>Coverage for <b>here</b> :
@@ -26,40 +22,49 @@ function toggle_lines(btn, cls) { </h1>
<h2 class='stats'>
4 statements
- <span class='run hide' onclick='toggle_lines(this, "run")'>3 run</span>
- <span class='exc' onclick='toggle_lines(this, "exc")'>0 excluded</span>
+ <span class='run hide_run' onclick='toggle_lines(this, "run")'>3 run</span>
<span class='mis' onclick='toggle_lines(this, "mis")'>1 missing</span>
+ <span class='exc' onclick='toggle_lines(this, "exc")'>0 excluded</span>
+
</h2>
</div>
</div>
<div id='source'>
-<table cellspacing='0' cellpadding='0'>
-<tr>
-<td class='linenos' valign='top'>
-<p class='pln'>1</p>
-<p class='pln'>2</p>
-<p class='stm run hide'>3</p>
-<p class='pln'>4</p>
-<p class='stm run hide'>5</p>
-<p class='stm run hide'>6</p>
-<p class='pln'>7</p>
-<p class='stm mis'>8</p>
-
-</td>
-<td class='text' valign='top'>
-<p class='pln'><span class='com'># A test file for HTML reporting by coverage.</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>import</span> <span class='nam'>other</span><span class="strut"> </span></p>
-<p class='pln'><span class="strut"> </span></p>
-<p class='stm run hide'><span class='key'>if</span> <span class='num'>1</span> <span class='op'><</span> <span class='num'>2</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm run hide'> <span class='nam'>h</span> <span class='op'>=</span> <span class='num'>3</span><span class="strut"> </span></p>
-<p class='pln'><span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
-<p class='stm mis'> <span class='nam'>h</span> <span class='op'>=</span> <span class='num'>4</span><span class="strut"> </span></p>
-
-</td>
-</tr>
-</table>
+ <table cellspacing='0' cellpadding='0'>
+ <tr>
+ <td class='linenos' valign='top'>
+<p id='n1' class='pln'><a href='#n1'>1</a></p>
+<p id='n2' class='pln'><a href='#n2'>2</a></p>
+<p id='n3' class='stm run hide_run'><a href='#n3'>3</a></p>
+<p id='n4' class='pln'><a href='#n4'>4</a></p>
+<p id='n5' class='stm run hide_run'><a href='#n5'>5</a></p>
+<p id='n6' class='stm run hide_run'><a href='#n6'>6</a></p>
+<p id='n7' class='pln'><a href='#n7'>7</a></p>
+<p id='n8' class='stm mis'><a href='#n8'>8</a></p>
+
+ </td>
+ <td class='text' valign='top'>
+<p id='t1' class='pln'><span class='com'># A test file for HTML reporting by coverage.</span><span class='strut'> </span></p>
+<p id='t2' class='pln'><span class='strut'> </span></p>
+<p id='t3' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>other</span><span class='strut'> </span></p>
+<p id='t4' class='pln'><span class='strut'> </span></p>
+<p id='t5' class='stm run hide_run'><span class='key'>if</span> <span class='num'>1</span> <span class='op'><</span> <span class='num'>2</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t6' class='stm run hide_run'> <span class='nam'>h</span> <span class='op'>=</span> <span class='num'>3</span><span class='strut'> </span></p>
+<p id='t7' class='pln'><span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p>
+<p id='t8' class='stm mis'> <span class='nam'>h</span> <span class='op'>=</span> <span class='num'>4</span><span class='strut'> </span></p>
+
+ </td>
+ </tr>
+ </table>
+</div>
+
+<div id='footer'>
+ <div class='content'>
+ <p>
+ <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.3.2a1</a>
+ </p>
+ </div>
</div>
</body>
diff --git a/test/farm/html/gold_other/index.html b/test/farm/html/gold_other/index.html index 3e41afa3..9021036f 100644 --- a/test/farm/html/gold_other/index.html +++ b/test/farm/html/gold_other/index.html @@ -1,64 +1,78 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
-<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
-<title>Coverage report</title>
-<link rel='stylesheet' href='style.css' type='text/css'>
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+ <title>Coverage report</title>
+ <link rel='stylesheet' href='style.css' type='text/css'>
+ <script type='text/javascript' src='jquery-1.3.2.min.js'></script>
+ <script type='text/javascript' src='jquery.tablesorter.min.js'></script>
+ <script type='text/javascript' src='coverage_html.js'></script>
+ <script type='text/javascript' charset='utf-8'>
+ jQuery(document).ready(index_ready);
+ </script>
</head>
-<body>
+<body id='indexfile'>
<div id='header'>
<div class='content'>
- <h1>Coverage report:
+ <h1>Coverage report:
<span class='pc_cov'>80%</span>
</h1>
</div>
</div>
<div id='index'>
-<table class='index'>
-<tr class='tablehead'>
- <th class='name'>Module</th>
- <th>statements</th>
- <th>run</th>
- <th>excluded</th>
-
- <th>coverage</th>
-</tr>
-
-<tr class='file'>
- <td class='name'><a href='_ned_coverage_trunk_test_farm_html_othersrc_other.html'>c:\ned\coverage\trunk\test\farm\html\othersrc\other</a></td>
- <td>1</td>
- <td>1</td>
- <td>0</td>
-
- <td>100%</td>
-</tr>
-
-<tr class='file'>
- <td class='name'><a href='here.html'>here</a></td>
- <td>4</td>
- <td>3</td>
- <td>0</td>
-
- <td>75%</td>
-</tr>
-
-<tr class='total'>
-<td class='name'>Total</td>
-<td>5</td>
-<td>4</td>
-<td>0</td>
-
-<td>80%</td>
-</tr>
-</table>
+ <table class='index'>
+ <thead>
+
+ <tr class='tablehead' title='Click to sort'>
+ <th class='name left headerSortDown'>Module</th>
+ <th>statements</th>
+ <th>missing</th>
+ <th>excluded</th>
+
+ <th class='right'>coverage</th>
+ </tr>
+ </thead>
+
+ <tfoot>
+ <tr class='total'>
+ <td class='name left'>Total</td>
+ <td>5</td>
+ <td>1</td>
+ <td>0</td>
+
+ <td class='right'>80%</td>
+ </tr>
+ </tfoot>
+ <tbody>
+
+ <tr class='file'>
+ <td class='name left'><a href='here.html'>here</a></td>
+ <td>4</td>
+ <td>1</td>
+ <td>0</td>
+
+ <td class='right'>75%</td>
+ </tr>
+
+ <tr class='file'>
+ <td class='name left'><a href='othersrc_other.html'>othersrc\other</a></td>
+ <td>1</td>
+ <td>0</td>
+ <td>0</td>
+
+ <td class='right'>100%</td>
+ </tr>
+
+ </tbody>
+ </table>
</div>
<div id='footer'>
<div class='content'>
<p>
- <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.2a1</a>
+ <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.3.2a1</a>
</p>
</div>
</div>
diff --git a/test/farm/html/gold_other/jquery-1.3.2.min.js b/test/farm/html/gold_other/jquery-1.3.2.min.js deleted file mode 100644 index b1ae21d8..00000000 --- a/test/farm/html/gold_other/jquery-1.3.2.min.js +++ /dev/null @@ -1,19 +0,0 @@ -/* - * jQuery JavaScript Library v1.3.2 - * http://jquery.com/ - * - * Copyright (c) 2009 John Resig - * Dual licensed under the MIT and GPL licenses. - * http://docs.jquery.com/License - * - * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) - * Revision: 6246 - */ -(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}}); -/* - * Sizzle CSS Selector Engine - v0.9.3 - * Copyright 2009, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * More information: http://sizzlejs.com/ - */ -(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML=' <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();
\ No newline at end of file diff --git a/test/farm/html/gold_other/style.css b/test/farm/html/gold_other/style.css deleted file mode 100644 index 65a27905..00000000 --- a/test/farm/html/gold_other/style.css +++ /dev/null @@ -1,195 +0,0 @@ -/* CSS styles for Coverage. */ -/* Page-wide styles */ -html, body, h1, h2, h3, p, td, th { - margin: 0; - padding: 0; - border: 0; - outline: 0; - font-weight: inherit; - font-style: inherit; - font-size: 100%; - font-family: inherit; - vertical-align: baseline; - } - -/* Set baseline grid to 16 pt. */ -body { - font-family: georgia, serif; - font-size: 1em; - } - -html>body { - font-size: 16px; - } - -/* Set base font size to 12/16 */ -p { - font-size: .75em; /* 12/16 */ - line-height: 1.3333em; /* 16/12 */ - } - -table { - border-collapse: collapse; - } - -a.nav { - text-decoration: none; - color: inherit; - } -a.nav:hover { - text-decoration: underline; - color: inherit; - } - -/* Page structure */ -#header { - background: #f8f8f8; - width: 100%; - border-bottom: 1px solid #eee; - } - -#source { - padding: 1em; - font-family: "courier new", monospace; - } - -#footer { - margin: 1em 3em; - } - -#footer .content { - padding: 0; - font-size: 85%; - font-family: verdana, sans-serif; - color: #666666; - font-style: italic; - } - -#index { - margin: 1em 0 0 3em; - } - -/* Header styles */ -#header .content { - padding: 1em 3em; - } - -h1 { - font-size: 1.25em; -} - -h2.stats { - margin-top: .5em; - font-size: 1em; -} -.stats span { - border: 1px solid; - padding: .1em .25em; - margin: 0 .1em; - cursor: pointer; - border-color: #999 #ccc #ccc #999; -} -.stats span.hide { - border-color: #ccc #999 #999 #ccc; -} - -/* Source file styles */ -.linenos p { - text-align: right; - margin: 0; - padding: 0 .5em; - color: #999999; - font-family: verdana, sans-serif; - font-size: .625em; /* 10/16 */ - line-height: 1.6em; /* 16/10 */ - } -td.text { - width: 100%; - } -.text p { - margin: 0; - padding: 0 0 0 .5em; - border-left: 2px solid #ffffff; - white-space: nowrap; - } - -.text p.mis { - background: #ffdddd; - border-left: 2px solid #ff0000; - } -.text p.run { - background: #ddffdd; - border-left: 2px solid #00ff00; - } -.text p.exc { - background: #eeeeee; - border-left: 2px solid #808080; - } -.text p.par { - background: #ffffaa; - border-left: 2px solid #eeee99; - } -.text p.hide { - background: inherit; - } - -.text span.annotate { - font-family: georgia; - font-style: italic; - color: #666; - float: right; - padding-right: .5em; - } -.text p.hide span.annotate { - display: none; - } - -/* Syntax coloring */ -.text .com { - color: green; - font-style: italic; - line-height: 1px; - } -.text .key { - font-weight: bold; - line-height: 1px; - } -.text .str { - color: #000080; - } - -/* index styles */ -#index td, #index th { - text-align: right; - width: 6em; - padding: .25em 0; - border-bottom: 1px solid #eee; - } -#index th { - font-style: italic; - color: #333; - border-bottom: 1px solid #ccc; - } -#index td.name, #index th.name { - text-align: left; - width: auto; - } -#index td.name a { - text-decoration: none; - color: #000; - } -#index td.name a:hover { - text-decoration: underline; - color: #000; - } -#index tr.total { - font-weight: bold; - } -#index tr.total td { - padding: .25em 0; - border-top: 1px solid #ccc; - border-bottom: none; - } -#index tr.file:hover { - background: #eeeeee; - } diff --git a/test/farm/html/gold_x_xml/coverage.xml b/test/farm/html/gold_x_xml/coverage.xml index 8c009f5d..37027efb 100644 --- a/test/farm/html/gold_x_xml/coverage.xml +++ b/test/farm/html/gold_x_xml/coverage.xml @@ -6,7 +6,7 @@ <packages>
<package branch-rate="0.0" complexity="0.0" line-rate="0.666666666667" name=".">
<classes>
- <class branch-rate="0.0" complexity="0.0" filename="x.py" line-rate="0.666666666667" name="x">
+ <class branch-rate="0.0" complexity="0.0" filename="a.py" line-rate="0.666666666667" name="a">
<methods/>
<lines>
<line hits="1" number="3"/>
diff --git a/test/farm/html/gold_y_xml_branch/coverage.xml b/test/farm/html/gold_y_xml_branch/coverage.xml new file mode 100644 index 00000000..96459101 --- /dev/null +++ b/test/farm/html/gold_y_xml_branch/coverage.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" ?>
+<!DOCTYPE coverage
+ SYSTEM 'http://cobertura.sourceforge.net/xml/coverage-03.dtd'>
+<coverage branch-rate="0.5" line-rate="0.8" timestamp="1259288252325" version="3.2b4">
+ <!-- Generated by coverage.py: http://nedbatchelder.com/code/coverage -->
+ <packages>
+ <package branch-rate="0.5" complexity="0.0" line-rate="0.8" name=".">
+ <classes>
+ <class branch-rate="0.5" complexity="0.0" filename="y.py" line-rate="0.8" name="y">
+ <methods/>
+ <lines>
+ <line hits="1" number="3"/>
+ <line branch="true" hits="1" number="4"/>
+ <line hits="1" number="5"/>
+ <line hits="0" number="7"/>
+ <line hits="1" number="9"/>
+ </lines>
+ </class>
+ </classes>
+ </package>
+ </packages>
+</coverage>
diff --git a/test/farm/html/run_a.py b/test/farm/html/run_a.py index dc7719a2..047d8982 100644 --- a/test/farm/html/run_a.py +++ b/test/farm/html/run_a.py @@ -5,21 +5,21 @@ def html_it(): cov.start() import a cov.stop() - cov.html_report(a, directory="../html") + cov.html_report(a, directory="../html_a") runfunc(html_it, rundir="src") # HTML files will change often. Check that the sizes are reasonable, # and check that certain key strings are in the output. -compare("gold_a", "html", size_within=10) -contains("html/a.html", +compare("gold_a", "html_a", size_within=10, file_pattern="*.html") +contains("html_a/a.html", "<span class='key'>if</span> <span class='num'>1</span> <span class='op'><</span> <span class='num'>2</span>", " <span class='nam'>a</span> <span class='op'>=</span> <span class='num'>3</span>", "<span class='pc_cov'>67%</span>" ) -contains("html/index.html", +contains("html_a/index.html", "<a href='a.html'>a</a>", "<span class='pc_cov'>67%</span>" ) -clean("html") +clean("html_a") diff --git a/test/farm/html/run_x_xml.py b/test/farm/html/run_a_xml_1.py index fe9cefa7..7f4805ef 100644 --- a/test/farm/html/run_x_xml.py +++ b/test/farm/html/run_a_xml_1.py @@ -1,20 +1,20 @@ def html_it(): - """Run coverage and make an XML report for x.""" + """Run coverage and make an XML report for a.""" import coverage cov = coverage.coverage() cov.start() - import x + import a cov.stop() - cov.xml_report(x, outfile="../xml/coverage.xml") + cov.xml_report(a, outfile="../xml_1/coverage.xml") import os -if not os.path.exists("xml"): - os.makedirs("xml") +if not os.path.exists("xml_1"): + os.makedirs("xml_1") runfunc(html_it, rundir="src") -compare("gold_x_xml", "xml", scrubs=[ +compare("gold_x_xml", "xml_1", scrubs=[ (r' timestamp="\d+"', ' timestamp="TIMESTAMP"'), (r' version="[-.\w]+"', ' version="VERSION"'), ]) -clean("xml") +clean("xml_1") diff --git a/test/farm/html/run_a_xml_2.py b/test/farm/html/run_a_xml_2.py new file mode 100644 index 00000000..b08d7960 --- /dev/null +++ b/test/farm/html/run_a_xml_2.py @@ -0,0 +1,20 @@ +def html_it(): + """Run coverage and make an XML report for a.""" + import coverage + cov = coverage.coverage(config_file="run_a_xml_2.ini") + cov.start() + import a + cov.stop() + cov.xml_report(a) + +import os +if not os.path.exists("xml_2"): + os.makedirs("xml_2") + +runfunc(html_it, rundir="src") + +compare("gold_x_xml", "xml_2", scrubs=[ + (r' timestamp="\d+"', ' timestamp="TIMESTAMP"'), + (r' version="[-.\w]+"', ' version="VERSION"'), + ]) +clean("xml_2") diff --git a/test/farm/html/run_b_branch.py b/test/farm/html/run_b_branch.py new file mode 100644 index 00000000..f129e436 --- /dev/null +++ b/test/farm/html/run_b_branch.py @@ -0,0 +1,28 @@ +def html_it(): + """Run coverage with branches and make an HTML report for a.""" + import coverage + cov = coverage.coverage(branch=True) + cov.start() + import b + cov.stop() + cov.html_report(b, directory="../html_b_branch") + +runfunc(html_it, rundir="src") + +# HTML files will change often. Check that the sizes are reasonable, +# and check that certain key strings are in the output. +compare("gold_b_branch", "html_b_branch", size_within=10, file_pattern="*.html") +contains("html_b_branch/b.html", + "<span class='key'>if</span> <span class='nam'>x</span> <span class='op'><</span> <span class='num'>2</span>", + " <span class='nam'>a</span> <span class='op'>=</span> <span class='num'>3</span>", + "<span class='pc_cov'>76%</span>", + "<span class='annotate' title='no jump to this line number'>8</span>", + "<span class='annotate' title='no jump to this line number'>exit</span>", + "<span class='annotate' title='no jumps to these line numbers'>25 26</span>", + ) +contains("html_b_branch/index.html", + "<a href='b.html'>b</a>", + "<span class='pc_cov'>76%</span>" + ) + +clean("html_b_branch") diff --git a/test/farm/html/run_omit_1.py b/test/farm/html/run_omit_1.py new file mode 100644 index 00000000..a493a8aa --- /dev/null +++ b/test/farm/html/run_omit_1.py @@ -0,0 +1,12 @@ +def html_it(): + """Run coverage and make an HTML report for main.""" + import coverage + cov = coverage.coverage() + cov.start() + import main + cov.stop() + cov.html_report(directory="../html_omit_1") + +runfunc(html_it, rundir="src") +compare("gold_omit_1", "html_omit_1", size_within=10, file_pattern="*.html") +clean("html_omit_1") diff --git a/test/farm/html/run_omit_2.py b/test/farm/html/run_omit_2.py new file mode 100644 index 00000000..5d7e8329 --- /dev/null +++ b/test/farm/html/run_omit_2.py @@ -0,0 +1,12 @@ +def html_it(): + """Run coverage and make an HTML report for main.""" + import coverage + cov = coverage.coverage() + cov.start() + import main + cov.stop() + cov.html_report(directory="../html_omit_2", omit_prefixes=["m1"]) + +runfunc(html_it, rundir="src") +compare("gold_omit_2", "html_omit_2", size_within=10, file_pattern="*.html") +clean("html_omit_2") diff --git a/test/farm/html/run_omit_3.py b/test/farm/html/run_omit_3.py new file mode 100644 index 00000000..537ec2c7 --- /dev/null +++ b/test/farm/html/run_omit_3.py @@ -0,0 +1,12 @@ +def html_it(): + """Run coverage and make an HTML report for main.""" + import coverage + cov = coverage.coverage() + cov.start() + import main + cov.stop() + cov.html_report(directory="../html_omit_3", omit_prefixes=["m1", "m2"]) + +runfunc(html_it, rundir="src") +compare("gold_omit_3", "html_omit_3", size_within=10, file_pattern="*.html") +clean("html_omit_3") diff --git a/test/farm/html/run_omit_4.py b/test/farm/html/run_omit_4.py new file mode 100644 index 00000000..c62e9d57 --- /dev/null +++ b/test/farm/html/run_omit_4.py @@ -0,0 +1,12 @@ +def html_it(): + """Run coverage and make an HTML report for main.""" + import coverage + cov = coverage.coverage(config_file="omit4.ini") + cov.start() + import main + cov.stop() + cov.html_report(directory="../html_omit_4") + +runfunc(html_it, rundir="src") +compare("gold_omit_4", "html_omit_4", size_within=10, file_pattern="*.html") +clean("html_omit_4") diff --git a/test/farm/html/run_omit_5.py b/test/farm/html/run_omit_5.py new file mode 100644 index 00000000..bd0fc9e2 --- /dev/null +++ b/test/farm/html/run_omit_5.py @@ -0,0 +1,12 @@ +def html_it(): + """Run coverage and make an HTML report for main.""" + import coverage + cov = coverage.coverage(config_file="omit5.ini") + cov.start() + import main + cov.stop() + cov.html_report() + +runfunc(html_it, rundir="src") +compare("gold_omit_5", "html_omit_5", size_within=10, file_pattern="*.html") +clean("html_omit_5") diff --git a/test/farm/html/run_other.py b/test/farm/html/run_other.py index 22850326..e75500cf 100644 --- a/test/farm/html/run_other.py +++ b/test/farm/html/run_other.py @@ -5,22 +5,22 @@ def html_it(): cov.start() import here cov.stop() - cov.html_report(directory="../otherhtml") + cov.html_report(directory="../html_other") runfunc(html_it, rundir="src", addtopath="../othersrc") # Different platforms will name the "other" file differently. Rename it import os, glob -for p in glob.glob("otherhtml/*_other.html"): - os.rename(p, "otherhtml/blah_blah_other.html") +for p in glob.glob("html_other/*_other.html"): + os.rename(p, "html_other/blah_blah_other.html") # HTML files will change often. Check that the sizes are reasonable, # and check that certain key strings are in the output. -compare("gold_other", "otherhtml", size_within=10) -contains("otherhtml/index.html", +compare("gold_other", "html_other", size_within=10, file_pattern="*.html") +contains("html_other/index.html", "<a href='here.html'>here</a>", "other.html'>", "other</a>", ) -clean("otherhtml") +clean("html_other") diff --git a/test/farm/html/run_tabbed.py b/test/farm/html/run_tabbed.py index e7e60cec..3076b4e5 100644 --- a/test/farm/html/run_tabbed.py +++ b/test/farm/html/run_tabbed.py @@ -5,20 +5,20 @@ def html_it(): cov.start() import tabbed cov.stop() - cov.html_report(tabbed, directory="../html") + cov.html_report(tabbed, directory="../html_tabbed") runfunc(html_it, rundir="src") # Editors like to change things, make sure our source file still has tabs. contains("src/tabbed.py", "\tif x:\t\t\t\t\t# look nice") -contains("html/tabbed.html", +contains("html_tabbed/tabbed.html", "> <span class='key'>if</span> " "<span class='nam'>x</span><span class='op'>:</span>" " " " " - "<span class='com'># look nice</span>" + "<span class='com'># look nice</span>" ) -doesnt_contain("html/tabbed.html", "\t") -clean("html") +doesnt_contain("html_tabbed/tabbed.html", "\t") +clean("html_tabbed") diff --git a/test/farm/html/run_y_xml_branch.py b/test/farm/html/run_y_xml_branch.py new file mode 100644 index 00000000..46f426d3 --- /dev/null +++ b/test/farm/html/run_y_xml_branch.py @@ -0,0 +1,20 @@ +def xml_it(): + """Run coverage and make an XML report for y.""" + import coverage + cov = coverage.coverage(branch=True) + cov.start() + import y + cov.stop() + cov.xml_report(y, outfile="../xml_branch/coverage.xml") + +import os +if not os.path.exists("xml_branch"): + os.makedirs("xml_branch") + +runfunc(xml_it, rundir="src") + +compare("gold_y_xml_branch", "xml_branch", scrubs=[ + (r' timestamp="\d+"', ' timestamp="TIMESTAMP"'), + (r' version="[-.\w]+"', ' version="VERSION"'), + ]) +clean("xml_branch") diff --git a/test/farm/html/src/b.py b/test/farm/html/src/b.py new file mode 100644 index 00000000..dffdd50f --- /dev/null +++ b/test/farm/html/src/b.py @@ -0,0 +1,28 @@ +# A test file for HTML reporting by coverage. + +def one(x): + # This will be a branch that misses the else. + if x < 2: + a = 3 + else: + a = 4 + +one(1) + +def two(x): + # A missed else that branches to "exit" + if x: + a = 5 + +two(1) + +def three_way(): + # for-else can be a three-way branch. + for i in range(10): + if i == 3: + break + else: + return 23 + return 17 + +three_way() diff --git a/test/farm/html/src/coverage.xml b/test/farm/html/src/coverage.xml new file mode 100644 index 00000000..bc517328 --- /dev/null +++ b/test/farm/html/src/coverage.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" ?>
+<!DOCTYPE coverage
+ SYSTEM 'http://cobertura.sourceforge.net/xml/coverage-03.dtd'>
+<coverage branch-rate="0.0" line-rate="0.666666666667" timestamp="1263087779313" version="3.3a1">
+ <!-- Generated by coverage.py: http://nedbatchelder.com/code/coverage -->
+ <packages>
+ <package branch-rate="0.0" complexity="0.0" line-rate="0.666666666667" name=".">
+ <classes>
+ <class branch-rate="0.0" complexity="0.0" filename="a.py" line-rate="0.666666666667" name="a">
+ <methods/>
+ <lines>
+ <line hits="1" number="3"/>
+ <line hits="1" number="5"/>
+ <line hits="0" number="7"/>
+ </lines>
+ </class>
+ </classes>
+ </package>
+ </packages>
+</coverage>
diff --git a/test/farm/html/src/m1.py b/test/farm/html/src/m1.py new file mode 100644 index 00000000..927e1f6b --- /dev/null +++ b/test/farm/html/src/m1.py @@ -0,0 +1,2 @@ +m1a = 1 +m1b = 2 diff --git a/test/farm/html/src/m2.py b/test/farm/html/src/m2.py new file mode 100644 index 00000000..ffddf6cf --- /dev/null +++ b/test/farm/html/src/m2.py @@ -0,0 +1,2 @@ +m2a = 1 +m2b = 2 diff --git a/test/farm/html/src/m3.py b/test/farm/html/src/m3.py new file mode 100644 index 00000000..395d7d25 --- /dev/null +++ b/test/farm/html/src/m3.py @@ -0,0 +1,2 @@ +m3a = 1 +m3b = 2 diff --git a/test/farm/html/src/main.py b/test/farm/html/src/main.py new file mode 100644 index 00000000..ce894465 --- /dev/null +++ b/test/farm/html/src/main.py @@ -0,0 +1,10 @@ +import m1 +import m2 +import m3 + +a = 5 +b = 6 + +assert m1.m1a == 1 +assert m2.m2a == 1 +assert m3.m3a == 1 diff --git a/test/farm/html/src/omit4.ini b/test/farm/html/src/omit4.ini new file mode 100644 index 00000000..95f62a13 --- /dev/null +++ b/test/farm/html/src/omit4.ini @@ -0,0 +1,2 @@ +[report] +omit = m2 diff --git a/test/farm/html/src/omit5.ini b/test/farm/html/src/omit5.ini new file mode 100644 index 00000000..70ef4917 --- /dev/null +++ b/test/farm/html/src/omit5.ini @@ -0,0 +1,8 @@ +[report] +omit = + fooey + gooey, m2, kablooey + m3, helloworld + +[html] +directory = ../html_omit_5 diff --git a/test/farm/html/src/run_a_xml_2.ini b/test/farm/html/src/run_a_xml_2.ini new file mode 100644 index 00000000..8d28f97b --- /dev/null +++ b/test/farm/html/src/run_a_xml_2.ini @@ -0,0 +1,3 @@ +# Put all the XML output in xml_2 +[xml] +output = ../xml_2/coverage.xml diff --git a/test/farm/html/src/tabbed.py b/test/farm/html/src/tabbed.py index bc6bb456..4c39cafe 100644 --- a/test/farm/html/src/tabbed.py +++ b/test/farm/html/src/tabbed.py @@ -3,6 +3,6 @@ x = 1 if x: a = "Tabbed" # Aligned comments if x: # look nice - b = "No spaces" # when they + b = "No spaces" # when they c = "Done" # line up. diff --git a/test/farm/html/src/x.py b/test/farm/html/src/x.py deleted file mode 100644 index 9e71aebd..00000000 --- a/test/farm/html/src/x.py +++ /dev/null @@ -1,7 +0,0 @@ -# A test file for HTML reporting by coverage. - -if 1 < 2: - # Needed a < to look at HTML entities. - a = 3 -else: - a = 4 diff --git a/test/farm/html/src/y.py b/test/farm/html/src/y.py new file mode 100644 index 00000000..af7c9689 --- /dev/null +++ b/test/farm/html/src/y.py @@ -0,0 +1,9 @@ +# A test file for XML reporting by coverage. + +def choice(x): + if x < 2: + return 3 + else: + return 4 + +assert choice(1) == 3 diff --git a/test/farm/run/run_xxx.py b/test/farm/run/run_xxx.py index 3c39f0f7..27967a9f 100644 --- a/test/farm/run/run_xxx.py +++ b/test/farm/run/run_xxx.py @@ -6,7 +6,7 @@ run(""" contains("out/stdout.txt", "xxx: 3 4 0 7", "\nxxx ", # The reporting line for xxx - " 7 6 85%" # The reporting data for xxx + " 7 1 85%" # The reporting data for xxx ) doesnt_contain("out/stdout.txt", "No such file or directory") clean("out") diff --git a/test/modules/aa/afile.odd.py b/test/modules/aa/afile.odd.py new file mode 100644 index 00000000..c6f49e18 --- /dev/null +++ b/test/modules/aa/afile.odd.py @@ -0,0 +1 @@ +# afile.odd.py diff --git a/test/modules/aa/bb.odd/bfile.py b/test/modules/aa/bb.odd/bfile.py new file mode 100644 index 00000000..90875404 --- /dev/null +++ b/test/modules/aa/bb.odd/bfile.py @@ -0,0 +1 @@ +# bfile.py diff --git a/test/modules/aa/bb/bfile.odd.py b/test/modules/aa/bb/bfile.odd.py new file mode 100644 index 00000000..b45cba8c --- /dev/null +++ b/test/modules/aa/bb/bfile.odd.py @@ -0,0 +1 @@ +# bfile.odd.py diff --git a/test/osinfo.py b/test/osinfo.py new file mode 100644 index 00000000..04855fe6 --- /dev/null +++ b/test/osinfo.py @@ -0,0 +1,69 @@ +"""OS information for testing.""" + +import sys + +if sys.version_info >= (2, 5) and sys.platform == 'win32': + # Windows implementation + def process_ram(): + """How much RAM is this process using? (Windows)""" + import ctypes + # lifted from: + # lists.ubuntu.com/archives/bazaar-commits/2009-February/011990.html + class PROCESS_MEMORY_COUNTERS_EX(ctypes.Structure): + """Used by GetProcessMemoryInfo""" + _fields_ = [('cb', ctypes.c_ulong), + ('PageFaultCount', ctypes.c_ulong), + ('PeakWorkingSetSize', ctypes.c_size_t), + ('WorkingSetSize', ctypes.c_size_t), + ('QuotaPeakPagedPoolUsage', ctypes.c_size_t), + ('QuotaPagedPoolUsage', ctypes.c_size_t), + ('QuotaPeakNonPagedPoolUsage', ctypes.c_size_t), + ('QuotaNonPagedPoolUsage', ctypes.c_size_t), + ('PagefileUsage', ctypes.c_size_t), + ('PeakPagefileUsage', ctypes.c_size_t), + ('PrivateUsage', ctypes.c_size_t), + ] + + mem_struct = PROCESS_MEMORY_COUNTERS_EX() + ret = ctypes.windll.psapi.GetProcessMemoryInfo( + ctypes.windll.kernel32.GetCurrentProcess(), + ctypes.byref(mem_struct), + ctypes.sizeof(mem_struct) + ) + if not ret: + return 0 + return mem_struct.PrivateUsage + +elif sys.platform == 'linux2': + # Linux implementation + import os + + _scale = {'kb': 1024, 'mb': 1024*1024} + + def _VmB(key): + """Read the /proc/PID/status file to find memory use.""" + try: + # get pseudo file /proc/<pid>/status + t = open('/proc/%d/status' % os.getpid()) + v = t.read() + t.close() + except IOError: + return 0 # non-Linux? + # get VmKey line e.g. 'VmRSS: 9999 kB\n ...' + i = v.index(key) + v = v[i:].split(None, 3) + if len(v) < 3: + return 0 # invalid format? + # convert Vm value to bytes + return int(float(v[1]) * _scale[v[2].lower()]) + + def process_ram(): + """How much RAM is this process using? (Linux implementation)""" + return _VmB('VmRSS') + + +else: + # Don't have an implementation, at least satisfy the interface. + def process_ram(): + """How much RAM is this process using? (placebo implementation)""" + return 0 diff --git a/test/stress_phystoken.txt b/test/stress_phystoken.tok index bd6a453a..8d1b6bec 100644 --- a/test/stress_phystoken.txt +++ b/test/stress_phystoken.tok @@ -1,6 +1,6 @@ # Here's some random Python so that test_tokenize_myself will have some -# stressful stuff to try. This file is .txt instead of .py so pylint won't -# complain about it. +# stressful stuff to try. This file is .tok instead of .py so pylint won't +# complain about it, check_eol won't look at it, etc. first_back = """\ hey there! @@ -15,10 +15,22 @@ lots_of_back = """\ hey \ there """ +# This next line is supposed to have trailing whitespace: fake_back = """\ ouch """ +# Lots of difficulty happens with code like: +# +# fake_back = """\ +# ouch +# """ +# +# Ugh, the edge cases... + +# What about a comment like this\ +"what's this string doing here?" + class C(object): def there(): this = 5 + \ @@ -29,6 +41,11 @@ class C(object): cont1 = "one line of text" + \ "another line of text" +a_long_string = \ + "part 1" \ + "2" \ + "3 is longer" + def hello(): print("Hello world!") diff --git a/test/stress_phystoken_dos.tok b/test/stress_phystoken_dos.tok new file mode 100644 index 00000000..b08fd70e --- /dev/null +++ b/test/stress_phystoken_dos.tok @@ -0,0 +1,52 @@ +# Here's some random Python so that test_tokenize_myself will have some
+# stressful stuff to try. This file is .tok instead of .py so pylint won't
+# complain about it, check_eol won't look at it, etc.
+
+first_back = """\
+hey there!
+"""
+
+other_back = """
+hey \
+there
+"""
+
+lots_of_back = """\
+hey \
+there
+"""
+# This next line is supposed to have trailing whitespace:
+fake_back = """\
+ouch
+"""
+
+# Lots of difficulty happens with code like:
+#
+# fake_back = """\
+# ouch
+# """
+#
+# Ugh, the edge cases...
+
+# What about a comment like this\
+"what's this string doing here?"
+
+class C(object):
+ def there():
+ this = 5 + \
+ 7
+ that = \
+ "a continued line"
+
+cont1 = "one line of text" + \
+ "another line of text"
+
+a_long_string = \
+ "part 1" \
+ "2" \
+ "3 is longer"
+
+def hello():
+ print("Hello world!")
+
+hello()
diff --git a/test/test_api.py b/test/test_api.py index 1a1f5412..aaae89cb 100644 --- a/test/test_api.py +++ b/test/test_api.py @@ -8,6 +8,9 @@ from coverage.backward import StringIO sys.path.insert(0, os.path.split(__file__)[0]) # Force relative import for Py3k from coveragetest import CoverageTest +# This file uses the singleton module interface. Prevent it from writing +# .coverage files at exit. +coverage.use_cache(0) class ApiTest(CoverageTest): """Api-oriented tests for Coverage.""" @@ -22,17 +25,17 @@ class ApiTest(CoverageTest): c = 4 d = 5 """) - + # Import the python file, executing it. coverage.start() - self.import_module("mycode") - coverage.stop() - + self.import_module("mycode") # pragma: recursive coverage + coverage.stop() # pragma: recursive coverage + _, statements, missing, missingtext = coverage.analysis("mycode.py") self.assertEqual(statements, [1,2,3,4,5]) self.assertEqual(missing, [4]) self.assertEqual(missingtext, "4") - + def doReportWork(self, modname): """Create a module named `modname`, then measure it.""" coverage.erase() @@ -46,21 +49,21 @@ class ApiTest(CoverageTest): e = 6 f = 7 """) - + # Import the python file, executing it. coverage.start() - self.import_module(modname) - coverage.stop() - + self.import_module(modname) # pragma: recursive coverage + coverage.stop() # pragma: recursive coverage + def testReport(self): self.doReportWork("mycode2") coverage.report(["mycode2.py"]) self.assertEqual(self.stdout(), textwrap.dedent("""\ - Name Stmts Exec Cover Missing + Name Stmts Miss Cover Missing --------------------------------------- - mycode2 7 4 57% 4-6 + mycode2 7 3 57% 4-6 """)) - + def testReportFile(self): # The file= argument of coverage.report makes the report go there. self.doReportWork("mycode3") @@ -68,9 +71,9 @@ class ApiTest(CoverageTest): coverage.report(["mycode3.py"], file=fout) self.assertEqual(self.stdout(), "") self.assertEqual(fout.getvalue(), textwrap.dedent("""\ - Name Stmts Exec Cover Missing + Name Stmts Miss Cover Missing --------------------------------------- - mycode3 7 4 57% 4-6 + mycode3 7 3 57% 4-6 """)) def testReportDefault(self): @@ -78,7 +81,7 @@ class ApiTest(CoverageTest): self.doReportWork("mycode4") coverage.report() rpt = re.sub(r"\s+", " ", self.stdout()) - self.assert_("mycode4 7 4 57% 4-6" in rpt) + self.assertTrue("mycode4 7 3 57% 4-6" in rpt) def testUnexecutedFile(self): cov = coverage.coverage() @@ -90,16 +93,16 @@ class ApiTest(CoverageTest): c = 4 d = 5 """) - + self.make_file("not_run.py", """\ fooey = 17 """) - + # Import the python file, executing it. cov.start() - self.import_module("mycode") - cov.stop() - + self.import_module("mycode") # pragma: recursive coverage + cov.stop() # pragma: recursive coverage + _, statements, missing, _ = cov.analysis("not_run.py") self.assertEqual(statements, [1]) self.assertEqual(missing, [1]) @@ -110,22 +113,22 @@ class ApiTest(CoverageTest): import mymod a = 1 """) - + self.make_file("mymod.py", """\ fooey = 17 """) - + # Import the python file, executing it. cov = coverage.coverage() cov.start() - self.import_module("mymain") - cov.stop() - + self.import_module("mymain") # pragma: recursive coverage + cov.stop() # pragma: recursive coverage + filename, _, _, _ = cov.analysis("mymain.py") self.assertEqual(os.path.basename(filename), "mymain.py") filename, _, _, _ = cov.analysis("mymod.py") self.assertEqual(os.path.basename(filename), "mymod.py") - + filename, _, _, _ = cov.analysis(sys.modules["mymain"]) self.assertEqual(os.path.basename(filename), "mymain.py") filename, _, _, _ = cov.analysis(sys.modules["mymod"]) @@ -135,14 +138,14 @@ class ApiTest(CoverageTest): # already. cov = coverage.coverage() cov.start() - self.import_module("mymain") - cov.stop() - + self.import_module("mymain") # pragma: recursive coverage + cov.stop() # pragma: recursive coverage + filename, _, _, _ = cov.analysis("mymain.py") self.assertEqual(os.path.basename(filename), "mymain.py") filename, _, _, _ = cov.analysis("mymod.py") self.assertEqual(os.path.basename(filename), "mymod.py") - + filename, _, _, _ = cov.analysis(sys.modules["mymain"]) self.assertEqual(os.path.basename(filename), "mymain.py") filename, _, _, _ = cov.analysis(sys.modules["mymod"]) @@ -154,17 +157,17 @@ class ApiTest(CoverageTest): a = 1 hls = colorsys.rgb_to_hls(1.0, 0.5, 0.0) """) - + self.make_file("mymod.py", """\ fooey = 17 """) # Measure without the stdlib. cov1 = coverage.coverage() - self.assertEqual(cov1.cover_pylib, False) + self.assertEqual(cov1.config.cover_pylib, False) cov1.start() - self.import_module("mymain") - cov1.stop() + self.import_module("mymain") # pragma: recursive coverage + cov1.stop() # pragma: recursive coverage # some statements were marked executed in mymain.py _, statements, missing, _ = cov1.analysis("mymain.py") @@ -176,8 +179,8 @@ class ApiTest(CoverageTest): # Measure with the stdlib. cov2 = coverage.coverage(cover_pylib=True) cov2.start() - self.import_module("mymain") - cov2.stop() + self.import_module("mymain") # pragma: recursive coverage + cov2.stop() # pragma: recursive coverage # some statements were marked executed in mymain.py _, statements, missing, _ = cov2.analysis("mymain.py") @@ -204,13 +207,13 @@ class ApiTest(CoverageTest): fooey = 17 """) - self.assert_equal_sets(os.listdir("."), ["datatest1.py"]) + self.assertSameElements(os.listdir("."), ["datatest1.py"]) cov = coverage.coverage() cov.start() - self.import_module("datatest1") - cov.stop() + self.import_module("datatest1") # pragma: recursive coverage + cov.stop() # pragma: recursive coverage cov.save() - self.assert_equal_sets(os.listdir("."), + self.assertSameElements(os.listdir("."), ["datatest1.py", "datatest1.pyc", ".coverage"]) def testDatafileSpecified(self): @@ -219,13 +222,13 @@ class ApiTest(CoverageTest): fooey = 17 """) - self.assert_equal_sets(os.listdir("."), ["datatest2.py"]) + self.assertSameElements(os.listdir("."), ["datatest2.py"]) cov = coverage.coverage(data_file="cov.data") cov.start() - self.import_module("datatest2") - cov.stop() + self.import_module("datatest2") # pragma: recursive coverage + cov.stop() # pragma: recursive coverage cov.save() - self.assert_equal_sets(os.listdir("."), + self.assertSameElements(os.listdir("."), ["datatest2.py", "datatest2.pyc", "cov.data"]) def testDatafileAndSuffixSpecified(self): @@ -234,17 +237,108 @@ class ApiTest(CoverageTest): fooey = 17 """) - self.assert_equal_sets(os.listdir("."), ["datatest3.py"]) - cov = coverage.coverage(data_file="cov.data", data_suffix=".14") + self.assertSameElements(os.listdir("."), ["datatest3.py"]) + cov = coverage.coverage(data_file="cov.data", data_suffix="14") cov.start() - self.import_module("datatest3") - cov.stop() + self.import_module("datatest3") # pragma: recursive coverage + cov.stop() # pragma: recursive coverage cov.save() - self.assert_equal_sets(os.listdir("."), + self.assertSameElements(os.listdir("."), ["datatest3.py", "datatest3.pyc", "cov.data.14"]) + def testDatafileFromRcFile(self): + # You can specify the data file name in the .coveragerc file + self.make_file("datatest4.py", """\ + fooey = 17 + """) + self.make_file(".coveragerc", """\ + [run] + data_file = mydata.dat + """) + + self.assertSameElements(os.listdir("."), + ["datatest4.py", ".coveragerc"]) + cov = coverage.coverage() + cov.start() + self.import_module("datatest4") # pragma: recursive coverage + cov.stop() # pragma: recursive coverage + cov.save() + self.assertSameElements(os.listdir("."), + ["datatest4.py", "datatest4.pyc", ".coveragerc", "mydata.dat"]) + def testEmptyReporting(self): # Used to be you'd get an exception reporting on nothing... cov = coverage.coverage() cov.erase() cov.report() + +class OmitIncludeTest(CoverageTest): + """Test using omit_prefixes and include_prefixes when measuring code.""" + + def test_nothing_specified(self): + self.make_file("a.py", """\ + a = 1 + """) + self.make_file("b.py", """\ + import a + b = 1 + """) + + cov = coverage.coverage() + cov.start() + self.import_module("b") + cov.stop() + lines = cov.data.summary() + self.assertEqual(lines['a.py'], 1) + self.assertEqual(lines['b.py'], 2) + + def test_include(self): + self.make_file("a.py", """\ + a = 1 + """) + self.make_file("b.py", """\ + import a + b = 1 + """) + + cov = coverage.coverage(include_prefixes=["a"]) + cov.start() + self.import_module("b") + cov.stop() + lines = cov.data.summary() + self.assertEqual(lines['a.py'], 1) + self.assert_('b.py' not in lines) + + def test_omit(self): + self.make_file("a.py", """\ + a = 1 + """) + self.make_file("b.py", """\ + import a + b = 1 + """) + + cov = coverage.coverage(omit_prefixes=["a"]) + cov.start() + self.import_module("b") + cov.stop() + lines = cov.data.summary() + self.assert_('a.py' not in lines) + self.assertEqual(lines['b.py'], 2) + + def test_omit_and_include(self): + self.make_file("aa.py", """\ + a = 1 + """) + self.make_file("ab.py", """\ + import aa + b = 1 + """) + + cov = coverage.coverage(include_prefixes=["a"], omit_prefixes=["aa"]) + cov.start() + self.import_module("ab") + cov.stop() + lines = cov.data.summary() + self.assert_('aa.py' not in lines) + self.assertEqual(lines['ab.py'], 2) diff --git a/test/test_arcs.py b/test/test_arcs.py index dea3700f..41731dba 100644 --- a/test/test_arcs.py +++ b/test/test_arcs.py @@ -25,16 +25,16 @@ class SimpleArcTest(CoverageTest): a = 2 b = 3 - + c = 5 """, - arcz=".2 23 35 5.") + arcz=".2 23 35 5-2") def test_function_def(self): self.check_coverage("""\ def foo(): a = 2 - + foo() """, arcz=".1 .2 14 2. 4.") @@ -54,7 +54,7 @@ class SimpleArcTest(CoverageTest): assert a == 1 """, arcz=".1 12 23 24 34 4.", arcz_missing="23 34") - + def test_if_else(self): self.check_coverage("""\ if len([]) == 0: @@ -90,6 +90,12 @@ class SimpleArcTest(CoverageTest): arcz=".1 14 45 5. .2 2. 23 3.", arcz_missing="23 3.") def test_multiline(self): + # The firstlineno of the a assignment below differs among Python + # versions. + if sys.version_info >= (2, 5): + arcz = ".1 15 5-2" + else: + arcz = ".1 15 5-1" self.check_coverage("""\ a = ( 2 + @@ -98,7 +104,7 @@ class SimpleArcTest(CoverageTest): b = \\ 6 """, - arcz=".1 15 5.", arcz_missing="") + arcz=arcz, arcz_missing="") def test_if_return(self): self.check_coverage("""\ @@ -113,10 +119,33 @@ class SimpleArcTest(CoverageTest): arcz=".1 16 67 7. .2 23 24 3. 45 5.", arcz_missing="" ) + def test_dont_confuse_exit_and_else(self): + self.check_coverage("""\ + def foo(): + if foo: + a = 3 + else: + a = 5 + return a + assert foo() == 3 # 7 + """, + arcz=".1 17 7. .2 23 36 25 56 6.", arcz_missing="25 56" + ) + self.check_coverage("""\ + def foo(): + if foo: + a = 3 + else: + a = 5 + foo() # 6 + """, + arcz=".1 16 6. .2 23 3. 25 5.", arcz_missing="25 5." + ) + class LoopArcTest(CoverageTest): """Arc-measuring tests involving loops.""" - + def test_loop(self): self.check_coverage("""\ for i in range(10): @@ -189,7 +218,7 @@ class LoopArcTest(CoverageTest): ) # With "while True", 2.x thinks it's computation, 3.x thinks it's # constant. - if sys.hexversion >= 0x03000000: + if sys.version_info >= (3, 0): arcz = ".1 12 23 34 45 36 63 57 27 7." else: arcz = ".1 12 23 34 45 36 62 57 27 7." @@ -206,6 +235,33 @@ class LoopArcTest(CoverageTest): arcz_missing="27" # while loop never exits naturally. ) + def test_for_if_else_for(self): + self.check_coverage("""\ + def branches_2(l): + if l: + for e in l: + a = 4 + else: + a = 6 + + def branches_3(l): + for x in l: + if x: + for e in l: + a = 12 + else: + a = 14 + + branches_2([0,1]) + branches_3([0,1]) + """, + arcz= + ".1 18 8G GH H. " + ".2 23 34 43 26 3. 6. " + ".9 9A 9-8 AB BC CB B9 AE E9", + arcz_missing="26 6." + ) + class ExceptionArcTest(CoverageTest): """Arc-measuring tests involving exception handling.""" @@ -246,7 +302,7 @@ class ExceptionArcTest(CoverageTest): b = 9 assert a == 5 and b == 9 """, - arcz=".1 12 .3 3. 24 45 56 67 7A 89 9A A.", + arcz=".1 12 .3 3-2 24 45 56 67 7A 89 9A A.", arcz_missing="67 7A", arcz_unpredicted="68") def test_except_with_type(self): @@ -265,7 +321,7 @@ class ExceptionArcTest(CoverageTest): assert try_it(0) == 8 # C assert try_it(1) == 6 # D """, - arcz=".1 12 .3 3. 24 4C CD D. .5 56 67 78 8B 9A AB B.", + arcz=".1 12 .3 3-2 24 4C CD D. .5 56 67 78 8B 9A AB B-4", arcz_missing="", arcz_unpredicted="79") @@ -364,7 +420,7 @@ class ExceptionArcTest(CoverageTest): arcz=".1 12 23 34 3D 45 56 67 68 7A 8A A3 AB AD BC CD D.", arcz_missing="3D AB BC CD", arcz_unpredicted="") - if sys.hexversion >= 0x02050000: + if sys.version_info >= (2, 5): # Try-except-finally was new in 2.5 def test_except_finally(self): self.check_coverage("""\ @@ -392,7 +448,7 @@ class ExceptionArcTest(CoverageTest): c = 11 assert a == 5 and b == 9 and c == 11 """, - arcz=".1 12 .3 3. 24 45 56 67 7B 89 9B BC C.", + arcz=".1 12 .3 3-2 24 45 56 67 7B 89 9B BC C.", arcz_missing="67 7B", arcz_unpredicted="68") diff --git a/test/test_cmdline.py b/test/test_cmdline.py index cedcec1d..15fe1cec 100644 --- a/test/test_cmdline.py +++ b/test/test_cmdline.py @@ -1,33 +1,24 @@ """Test cmdline.py for coverage.""" -import os, re, shlex, sys, textwrap, unittest +import os, pprint, re, shlex, sys, textwrap import mock import coverage +import coverage.cmdline +from coverage.misc import ExceptionDuringRun sys.path.insert(0, os.path.split(__file__)[0]) # Force relative import for Py3k -from coveragetest import CoverageTest +from coveragetest import CoverageTest, OK, ERR -OK, ERR = 0, 1 - class CmdLineTest(CoverageTest): """Tests of execution paths through the command line interpreter.""" - + run_in_temp_dir = False INIT_LOAD = """\ - .coverage(cover_pylib=None, data_suffix=False, timid=None, branch=None) - .load()\n""" - - def command_line(self, args, ret=OK): - """Run `args` through the command line. - - Checks that `ret` is returned. - - """ - ret_actual = coverage.CoverageScript().command_line(shlex.split(args)) - self.assertEqual(ret_actual, ret) - + .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=None) + .load()\n""" + def model_object(self): """Return a Mock suitable for use in CoverageScript.""" mk = mock.Mock() @@ -36,16 +27,16 @@ class CmdLineTest(CoverageTest): def mock_command_line(self, args): """Run `args` through the command line, with a Mock. - + Returns the Mock it used and the status code returned. - + """ m = self.model_object() ret = coverage.CoverageScript( _covpkg=m, _run_python_file=m.run_python_file, _help_fn=m.help_fn ).command_line(shlex.split(args)) return m, ret - + def cmd_executes(self, args, code, ret=OK): """Assert that the `args` end up executing the sequence in `code`.""" m1, r1 = self.mock_command_line(args) @@ -53,26 +44,37 @@ class CmdLineTest(CoverageTest): "Wrong status: got %s, wanted %s" % (r1, ret) ) - code = textwrap.dedent(code) + # Remove all indentation, and change ".foo()" to "m2.foo()". + code = re.sub(r"(?m)^\s+", "", code) code = re.sub(r"(?m)^\.", "m2.", code) m2 = self.model_object() code_obj = compile(code, "<code>", "exec") eval(code_obj, globals(), { 'm2': m2 }) - self.assertEqual(m1.method_calls, m2.method_calls) - + self.assert_same_method_calls(m1, m2) + def cmd_executes_same(self, args1, args2): """Assert that the `args1` executes the same as `args2`.""" m1, r1 = self.mock_command_line(args1) m2, r2 = self.mock_command_line(args2) self.assertEqual(r1, r2) - self.assertEqual(m1.method_calls, m2.method_calls) + self.assert_same_method_calls(m1, m2) + + def assert_same_method_calls(self, m1, m2): + """Assert that `m1.method_calls` and `m2.method_calls` are the same.""" + # Use a real equality comparison, but if it fails, use a nicer assert + # so we can tell what's going on. We have to use the real == first due + # to CmdOptionParser.__eq__ + if m1.method_calls != m2.method_calls: + pp1 = pprint.pformat(m1.method_calls) + pp2 = pprint.pformat(m2.method_calls) + self.assertMultiLineEqual(pp1+'\n', pp2+'\n') def cmd_help(self, args, help_msg=None, topic=None, ret=ERR): """Run a command line, and check that it prints the right help. - + Only the last function call in the mock is checked, which should be the help message that we want to see. - + """ m, r = self.mock_command_line(args) self.assertEqual(r, ret, @@ -86,7 +88,7 @@ class CmdLineTest(CoverageTest): self.assertEqual(m.method_calls[-1], ('help_fn', (), {'topic':topic}) ) - + class ClassicCmdLineTest(CmdLineTest): """Tests of the classic coverage.py command line.""" @@ -94,17 +96,17 @@ class ClassicCmdLineTest(CmdLineTest): def testErase(self): # coverage -e self.cmd_executes("-e", """\ - .coverage(cover_pylib=None, data_suffix=False, timid=None, branch=None) + .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=None) .erase() """) self.cmd_executes_same("-e", "--erase") def testExecute(self): # coverage -x [-p] [-L] [--timid] MODULE.py [ARG1 ARG2 ...] - + # -x calls coverage.load first. self.cmd_executes("-x foo.py", """\ - .coverage(cover_pylib=None, data_suffix=False, timid=None, branch=None) + .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=None) .load() .start() .run_python_file('foo.py', ['foo.py']) @@ -113,7 +115,7 @@ class ClassicCmdLineTest(CmdLineTest): """) # -e -x calls coverage.erase first. self.cmd_executes("-e -x foo.py", """\ - .coverage(cover_pylib=None, data_suffix=False, timid=None, branch=None) + .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=None) .erase() .start() .run_python_file('foo.py', ['foo.py']) @@ -122,7 +124,7 @@ class ClassicCmdLineTest(CmdLineTest): """) # --timid sets a flag, and program arguments get passed through. self.cmd_executes("-x --timid foo.py abc 123", """\ - .coverage(cover_pylib=None, data_suffix=False, timid=True, branch=None) + .coverage(cover_pylib=None, data_suffix=None, timid=True, branch=None, config_file=True, include_prefixes=None, omit_prefixes=None) .load() .start() .run_python_file('foo.py', ['foo.py', 'abc', '123']) @@ -131,7 +133,7 @@ class ClassicCmdLineTest(CmdLineTest): """) # -L sets a flag, and flags for the program don't confuse us. self.cmd_executes("-x -p -L foo.py -a -b", """\ - .coverage(cover_pylib=True, data_suffix=True, timid=None, branch=None) + .coverage(cover_pylib=True, data_suffix=True, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=None) .load() .start() .run_python_file('foo.py', ['foo.py', '-a', '-b']) @@ -148,7 +150,7 @@ class ClassicCmdLineTest(CmdLineTest): def testCombine(self): # coverage -c self.cmd_executes("-c", """\ - .coverage(cover_pylib=None, data_suffix=False, timid=None, branch=None) + .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=None) .load() .combine() .save() @@ -158,31 +160,35 @@ class ClassicCmdLineTest(CmdLineTest): def testReport(self): # coverage -r [-m] [-i] [-o DIR,...] [FILE1 FILE2 ...] self.cmd_executes("-r", self.INIT_LOAD + """\ - .report(ignore_errors=None, omit_prefixes=None, morfs=[], + .report(ignore_errors=None, omit_prefixes=None, include_prefixes=None, morfs=[], show_missing=None) """) self.cmd_executes("-r -i", self.INIT_LOAD + """\ - .report(ignore_errors=True, omit_prefixes=None, morfs=[], + .report(ignore_errors=True, omit_prefixes=None, include_prefixes=None, morfs=[], show_missing=None) """) self.cmd_executes("-r -m", self.INIT_LOAD + """\ - .report(ignore_errors=None, omit_prefixes=None, morfs=[], + .report(ignore_errors=None, omit_prefixes=None, include_prefixes=None, morfs=[], show_missing=True) """) - self.cmd_executes("-r -o fooey", self.INIT_LOAD + """\ - .report(ignore_errors=None, omit_prefixes=["fooey"], + self.cmd_executes("-r -o fooey", """\ + .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=["fooey"]) + .load() + .report(ignore_errors=None, omit_prefixes=["fooey"], include_prefixes=None, morfs=[], show_missing=None) """) - self.cmd_executes("-r -o fooey,booey", self.INIT_LOAD + """\ - .report(ignore_errors=None, omit_prefixes=["fooey", "booey"], + self.cmd_executes("-r -o fooey,booey", """\ + .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=["fooey", "booey"]) + .load() + .report(ignore_errors=None, omit_prefixes=["fooey", "booey"], include_prefixes=None, morfs=[], show_missing=None) """) self.cmd_executes("-r mod1", self.INIT_LOAD + """\ - .report(ignore_errors=None, omit_prefixes=None, + .report(ignore_errors=None, omit_prefixes=None, include_prefixes=None, morfs=["mod1"], show_missing=None) """) self.cmd_executes("-r mod1 mod2 mod3", self.INIT_LOAD + """\ - .report(ignore_errors=None, omit_prefixes=None, + .report(ignore_errors=None, omit_prefixes=None, include_prefixes=None, morfs=["mod1", "mod2", "mod3"], show_missing=None) """) @@ -200,31 +206,35 @@ class ClassicCmdLineTest(CmdLineTest): # coverage -a [-d DIR] [-i] [-o DIR,...] [FILE1 FILE2 ...] self.cmd_executes("-a", self.INIT_LOAD + """\ .annotate(directory=None, ignore_errors=None, - omit_prefixes=None, morfs=[]) + omit_prefixes=None, include_prefixes=None, morfs=[]) """) self.cmd_executes("-a -d dir1", self.INIT_LOAD + """\ .annotate(directory="dir1", ignore_errors=None, - omit_prefixes=None, morfs=[]) + omit_prefixes=None, include_prefixes=None, morfs=[]) """) self.cmd_executes("-a -i", self.INIT_LOAD + """\ .annotate(directory=None, ignore_errors=True, - omit_prefixes=None, morfs=[]) + omit_prefixes=None, include_prefixes=None, morfs=[]) """) - self.cmd_executes("-a -o fooey", self.INIT_LOAD + """\ + self.cmd_executes("-a -o fooey", """\ + .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=["fooey"]) + .load() .annotate(directory=None, ignore_errors=None, - omit_prefixes=["fooey"], morfs=[]) + omit_prefixes=["fooey"], include_prefixes=None, morfs=[]) """) - self.cmd_executes("-a -o fooey,booey", self.INIT_LOAD + """\ + self.cmd_executes("-a -o fooey,booey", """\ + .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=["fooey", "booey"]) + .load() .annotate(directory=None, ignore_errors=None, - omit_prefixes=["fooey", "booey"], morfs=[]) + omit_prefixes=["fooey", "booey"], include_prefixes=None, morfs=[]) """) self.cmd_executes("-a mod1", self.INIT_LOAD + """\ .annotate(directory=None, ignore_errors=None, - omit_prefixes=None, morfs=["mod1"]) + omit_prefixes=None, include_prefixes=None, morfs=["mod1"]) """) self.cmd_executes("-a mod1 mod2 mod3", self.INIT_LOAD + """\ .annotate(directory=None, ignore_errors=None, - omit_prefixes=None, morfs=["mod1", "mod2", "mod3"]) + omit_prefixes=None, include_prefixes=None, morfs=["mod1", "mod2", "mod3"]) """) self.cmd_executes_same("-a", "--annotate") @@ -241,31 +251,35 @@ class ClassicCmdLineTest(CmdLineTest): # coverage -b -d DIR [-i] [-o DIR,...] [FILE1 FILE2 ...] self.cmd_executes("-b", self.INIT_LOAD + """\ .html_report(directory=None, ignore_errors=None, - omit_prefixes=None, morfs=[]) + omit_prefixes=None, include_prefixes=None, morfs=[]) """) self.cmd_executes("-b -d dir1", self.INIT_LOAD + """\ .html_report(directory="dir1", ignore_errors=None, - omit_prefixes=None, morfs=[]) + omit_prefixes=None, include_prefixes=None, morfs=[]) """) self.cmd_executes("-b -i", self.INIT_LOAD + """\ .html_report(directory=None, ignore_errors=True, - omit_prefixes=None, morfs=[]) + omit_prefixes=None, include_prefixes=None, morfs=[]) """) - self.cmd_executes("-b -o fooey", self.INIT_LOAD + """\ + self.cmd_executes("-b -o fooey", """\ + .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=["fooey"]) + .load() .html_report(directory=None, ignore_errors=None, - omit_prefixes=["fooey"], morfs=[]) + omit_prefixes=["fooey"], include_prefixes=None, morfs=[]) """) - self.cmd_executes("-b -o fooey,booey", self.INIT_LOAD + """\ + self.cmd_executes("-b -o fooey,booey", """\ + .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=["fooey", "booey"]) + .load() .html_report(directory=None, ignore_errors=None, - omit_prefixes=["fooey", "booey"], morfs=[]) + omit_prefixes=["fooey", "booey"], include_prefixes=None, morfs=[]) """) self.cmd_executes("-b mod1", self.INIT_LOAD + """\ .html_report(directory=None, ignore_errors=None, - omit_prefixes=None, morfs=["mod1"]) + omit_prefixes=None, include_prefixes=None, morfs=["mod1"]) """) self.cmd_executes("-b mod1 mod2 mod3", self.INIT_LOAD + """\ .html_report(directory=None, ignore_errors=None, - omit_prefixes=None, morfs=["mod1", "mod2", "mod3"]) + omit_prefixes=None, include_prefixes=None, morfs=["mod1", "mod2", "mod3"]) """) self.cmd_executes_same("-b", "--html") @@ -281,8 +295,12 @@ class ClassicCmdLineTest(CmdLineTest): self.cmd_help("-h", topic="help", ret=OK) self.cmd_help("--help", topic="help", ret=OK) + def testVersion(self): + # coverage --version + self.cmd_help("--version", topic="version", ret=OK) + ## Error cases - + def testArglessActions(self): self.cmd_help("-e foo bar", "Unexpected arguments: foo bar") self.cmd_help("-c baz quux", "Unexpected arguments: baz quux") @@ -332,6 +350,33 @@ class ClassicCmdLineTest(CmdLineTest): self.cmd_help("-z", "no such option: -z") +class FakeCoverageForDebugData(object): + """Just enough of a fake coverage package for the 'debug data' tests.""" + def __init__(self, summary): + self._summary = summary + self.filename = "FILENAME" + self.data = self + + # package members + def coverage(self, *unused_args, **unused_kwargs): + """The coverage class in the package.""" + return self + + # coverage methods + def load(self): + """Fake coverage().load()""" + pass + + # data methods + def has_arcs(self): + """Fake coverage().data.has_arcs()""" + return False + + def summary(self, fullpath): # pylint: disable-msg=W0613 + """Fake coverage().data.summary()""" + return self._summary + + class NewCmdLineTest(CmdLineTest): """Tests of the coverage.py command line.""" @@ -351,12 +396,37 @@ class NewCmdLineTest(CmdLineTest): self.cmd_help("debug", "What information would you like: data, sys?") self.cmd_help("debug foo", "Don't know what you mean by 'foo'") + def testDebugData(self): + fake = FakeCoverageForDebugData({ + 'file1.py': 17, 'file2.py': 23, + }) + self.command_line("debug data", _covpkg=fake) + self.assertMultiLineEqual(self.stdout(), textwrap.dedent("""\ + -- data --------------------------------------- + path: FILENAME + has_arcs: False + + 2 files: + file1.py: 17 lines + file2.py: 23 lines + """)) + + def testDebugDataWithNoData(self): + fake = FakeCoverageForDebugData({}) + self.command_line("debug data", _covpkg=fake) + self.assertMultiLineEqual(self.stdout(), textwrap.dedent("""\ + -- data --------------------------------------- + path: FILENAME + has_arcs: False + No data collected + """)) + def testDebugSys(self): self.command_line("debug sys") out = self.stdout() assert "version:" in out - assert "data_file:" in out - + assert "data_path:" in out + def testErase(self): self.cmd_executes_same("erase", "-e") @@ -394,39 +464,87 @@ class NewCmdLineTest(CmdLineTest): self.cmd_executes_same("run -L f.py", "-e -x -L f.py") self.cmd_executes_same("run --timid f.py", "-e -x --timid f.py") self.cmd_executes_same("run", "-x") - + self.cmd_executes("run --branch foo.py", """\ + .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=True, config_file=True, include_prefixes=None, omit_prefixes=None) + .erase() + .start() + .run_python_file('foo.py', ['foo.py']) + .stop() + .save() + """) + self.cmd_executes("run --rcfile=myrc.rc foo.py", """\ + .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file="myrc.rc", include_prefixes=None, omit_prefixes=None) + .erase() + .start() + .run_python_file('foo.py', ['foo.py']) + .stop() + .save() + """) + self.cmd_executes("run --include=pre1,pre2 foo.py", """\ + .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=["pre1", "pre2"], omit_prefixes=None) + .erase() + .start() + .run_python_file('foo.py', ['foo.py']) + .stop() + .save() + """) + self.cmd_executes("run --omit=opre1,opre2 foo.py", """\ + .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=["opre1", "opre2"]) + .erase() + .start() + .run_python_file('foo.py', ['foo.py']) + .stop() + .save() + """) + self.cmd_executes("run --include=pre1,pre2 --omit=opre1,opre2 foo.py", + """\ + .coverage(cover_pylib=None, data_suffix=None, timid=None, + branch=None, config_file=True, + include_prefixes=["pre1", "pre2"], + omit_prefixes=["opre1", "opre2"]) + .erase() + .start() + .run_python_file('foo.py', ['foo.py']) + .stop() + .save() + """) + def testXml(self): # coverage xml [-i] [--omit DIR,...] [FILE1 FILE2 ...] self.cmd_executes("xml", self.INIT_LOAD + """\ - .xml_report(ignore_errors=None, omit_prefixes=None, morfs=[], + .xml_report(ignore_errors=None, omit_prefixes=None, include_prefixes=None, morfs=[], outfile="coverage.xml") """) self.cmd_executes("xml -i", self.INIT_LOAD + """\ - .xml_report(ignore_errors=True, omit_prefixes=None, morfs=[], + .xml_report(ignore_errors=True, omit_prefixes=None, include_prefixes=None, morfs=[], outfile="coverage.xml") """) self.cmd_executes("xml -o myxml.foo", self.INIT_LOAD + """\ - .xml_report(ignore_errors=None, omit_prefixes=None, morfs=[], + .xml_report(ignore_errors=None, omit_prefixes=None, include_prefixes=None, morfs=[], outfile="myxml.foo") """) self.cmd_executes("xml -o -", self.INIT_LOAD + """\ - .xml_report(ignore_errors=None, omit_prefixes=None, morfs=[], - outfile=None) + .xml_report(ignore_errors=None, omit_prefixes=None, include_prefixes=None, morfs=[], + outfile="-") """) - self.cmd_executes("xml --omit fooey", self.INIT_LOAD + """\ - .xml_report(ignore_errors=None, omit_prefixes=["fooey"], morfs=[], + self.cmd_executes("xml --omit fooey", """\ + .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=["fooey"]) + .load() + .xml_report(ignore_errors=None, omit_prefixes=["fooey"], include_prefixes=None, morfs=[], outfile="coverage.xml") """) - self.cmd_executes("xml --omit fooey,booey", self.INIT_LOAD + """\ - .xml_report(ignore_errors=None, omit_prefixes=["fooey", "booey"], + self.cmd_executes("xml --omit fooey,booey", """\ + .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=["fooey", "booey"]) + .load() + .xml_report(ignore_errors=None, omit_prefixes=["fooey", "booey"], include_prefixes=None, morfs=[], outfile="coverage.xml") """) self.cmd_executes("xml mod1", self.INIT_LOAD + """\ - .xml_report(ignore_errors=None, omit_prefixes=None, morfs=["mod1"], + .xml_report(ignore_errors=None, omit_prefixes=None, include_prefixes=None, morfs=["mod1"], outfile="coverage.xml") """) self.cmd_executes("xml mod1 mod2 mod3", self.INIT_LOAD + """\ - .xml_report(ignore_errors=None, omit_prefixes=None, + .xml_report(ignore_errors=None, omit_prefixes=None, include_prefixes=None, morfs=["mod1", "mod2", "mod3"], outfile="coverage.xml") """) @@ -439,19 +557,19 @@ class NewCmdLineTest(CmdLineTest): class CmdLineStdoutTest(CmdLineTest): """Test the command line with real stdout output.""" - + def testMinimumHelp(self): self.command_line("") out = self.stdout() assert "Code coverage for Python." in out assert out.count("\n") < 4 - + def testHelp(self): self.command_line("help") out = self.stdout() assert "nedbatchelder.com" in out assert out.count("\n") > 10 - + def testCmdHelp(self): self.command_line("help run") out = self.stdout() @@ -466,5 +584,58 @@ class CmdLineStdoutTest(CmdLineTest): assert "help" in out -if __name__ == '__main__': - unittest.main() +class CmdMainTest(CoverageTest): + """Tests of coverage.cmdline.main(), using mocking for isolation.""" + + class CoverageScriptStub(object): + """A stub for coverage.cmdline.CoverageScript, used by CmdMainTest.""" + + def command_line(self, argv): + """Stub for command_line, the arg determines what it will do.""" + if argv[0] == 'hello': + print("Hello, world!") + elif argv[0] == 'raise': + try: + raise Exception("oh noes!") + except: + raise ExceptionDuringRun(*sys.exc_info()) + elif argv[0] == 'internalraise': + raise ValueError("coverage is broken") + elif argv[0] == 'exit': + sys.exit(23) + else: + raise AssertionError("Bad CoverageScriptStub: %r"% (argv,)) + return 0 + + def setUp(self): + super(CmdMainTest, self).setUp() + self.old_CoverageScript = coverage.cmdline.CoverageScript + coverage.cmdline.CoverageScript = self.CoverageScriptStub + + def tearDown(self): + coverage.cmdline.CoverageScript = self.old_CoverageScript + super(CmdMainTest, self).tearDown() + + def test_normal(self): + ret = coverage.cmdline.main(['hello']) + self.assertEqual(ret, 0) + self.assertEqual(self.stdout(), "Hello, world!\n") + + def test_raise(self): + ret = coverage.cmdline.main(['raise']) + self.assertEqual(ret, 1) + self.assertEqual(self.stdout(), "") + err = self.stderr().split('\n') + self.assertEqual(err[0], 'Traceback (most recent call last):') + self.assertEqual(err[-3], ' raise Exception("oh noes!")') + self.assertEqual(err[-2], 'Exception: oh noes!') + + def test_internalraise(self): + self.assertRaisesRegexp(ValueError, + "coverage is broken", + coverage.cmdline.main, ['internalraise'] + ) + + def test_exit(self): + ret = coverage.cmdline.main(['exit']) + self.assertEqual(ret, 23) diff --git a/test/test_codeunit.py b/test/test_codeunit.py index 96df9633..7903d153 100644 --- a/test/test_codeunit.py +++ b/test/test_codeunit.py @@ -21,7 +21,7 @@ class CodeUnitTest(CoverageTest): # Parent class saves and restores sys.path, we can just modify it. testmods = self.nice_file(os.path.dirname(__file__), 'modules') sys.path.append(testmods) - + def test_filenames(self): acu = code_unit_factory("aa/afile.py", FileLocator()) bcu = code_unit_factory("aa/bb/bfile.py", FileLocator()) @@ -36,6 +36,20 @@ class CodeUnitTest(CoverageTest): self.assertEqual(bcu[0].source_file().read(), "# bfile.py\n") self.assertEqual(ccu[0].source_file().read(), "# cfile.py\n") + def test_odd_filenames(self): + acu = code_unit_factory("aa/afile.odd.py", FileLocator()) + bcu = code_unit_factory("aa/bb/bfile.odd.py", FileLocator()) + b2cu = code_unit_factory("aa/bb.odd/bfile.py", FileLocator()) + self.assertEqual(acu[0].name, "aa/afile.odd") + self.assertEqual(bcu[0].name, "aa/bb/bfile.odd") + self.assertEqual(b2cu[0].name, "aa/bb.odd/bfile") + self.assertEqual(acu[0].flat_rootname(), "aa_afile_odd") + self.assertEqual(bcu[0].flat_rootname(), "aa_bb_bfile_odd") + self.assertEqual(b2cu[0].flat_rootname(), "aa_bb_odd_bfile") + self.assertEqual(acu[0].source_file().read(), "# afile.odd.py\n") + self.assertEqual(bcu[0].source_file().read(), "# bfile.odd.py\n") + self.assertEqual(b2cu[0].source_file().read(), "# bfile.py\n") + def test_modules(self): import aa, aa.bb, aa.bb.cc cu = code_unit_factory([aa, aa.bb, aa.bb.cc], FileLocator()) @@ -64,10 +78,10 @@ class CodeUnitTest(CoverageTest): self.assertEqual(cu[2].source_file().read(), "# cfile.py\n") def test_comparison(self): - acu = code_unit_factory("aa/afile.py", FileLocator()) - acu2 = code_unit_factory("aa/afile.py", FileLocator()) - zcu = code_unit_factory("aa/zfile.py", FileLocator()) - bcu = code_unit_factory("aa/bb/bfile.py", FileLocator()) + acu = code_unit_factory("aa/afile.py", FileLocator())[0] + acu2 = code_unit_factory("aa/afile.py", FileLocator())[0] + zcu = code_unit_factory("aa/zfile.py", FileLocator())[0] + bcu = code_unit_factory("aa/bb/bfile.py", FileLocator())[0] assert acu == acu2 and acu <= acu2 and acu >= acu2 assert acu < zcu and acu <= zcu and acu != zcu assert zcu > acu and zcu >= acu and zcu != acu @@ -81,4 +95,3 @@ class CodeUnitTest(CoverageTest): self.assertEqual(cu[1].source_file().read().split("\n")[0], "# My egg file!" ) -
\ No newline at end of file diff --git a/test/test_config.py b/test/test_config.py new file mode 100644 index 00000000..d29ab3d7 --- /dev/null +++ b/test/test_config.py @@ -0,0 +1,147 @@ +"""Test the config file handling for coverage.py""" + +import os, sys +import coverage + +sys.path.insert(0, os.path.split(__file__)[0]) # Force relative import for Py3k +from coveragetest import CoverageTest + + +class ConfigTest(CoverageTest): + """Tests of the different sources of configuration settings.""" + + def test_default_config(self): + # Just constructing a coverage() object gets the right defaults. + cov = coverage.coverage() + self.assertFalse(cov.config.timid) + self.assertFalse(cov.config.branch) + self.assertEqual(cov.config.data_file, ".coverage") + + def test_arguments(self): + # Arguments to the constructor are applied to the configuation. + cov = coverage.coverage(timid=True, data_file="fooey.dat") + self.assertTrue(cov.config.timid) + self.assertFalse(cov.config.branch) + self.assertEqual(cov.config.data_file, "fooey.dat") + + def test_config_file(self): + # A .coveragerc file will be read into the configuration. + self.make_file(".coveragerc", """\ + # This is just a bogus .rc file for testing. + [run] + timid = True + data_file = .hello_kitty.data + """) + cov = coverage.coverage() + self.assertTrue(cov.config.timid) + self.assertFalse(cov.config.branch) + self.assertEqual(cov.config.data_file, ".hello_kitty.data") + + def test_named_config_file(self): + # You can name the config file what you like. + self.make_file("my_cov.ini", """\ + [run] + timid = True + ; I wouldn't really use this as a data file... + data_file = delete.me + """) + cov = coverage.coverage(config_file="my_cov.ini") + self.assertTrue(cov.config.timid) + self.assertFalse(cov.config.branch) + self.assertEqual(cov.config.data_file, "delete.me") + + def test_ignored_config_file(self): + # You can disable reading the .coveragerc file. + self.make_file(".coveragerc", """\ + [run] + timid = True + data_file = delete.me + """) + cov = coverage.coverage(config_file=False) + self.assertFalse(cov.config.timid) + self.assertFalse(cov.config.branch) + self.assertEqual(cov.config.data_file, ".coverage") + + def test_config_file_then_args(self): + # The arguments override the .coveragerc file. + self.make_file(".coveragerc", """\ + [run] + timid = True + data_file = weirdo.file + """) + cov = coverage.coverage(timid=False, data_file=".mycov") + self.assertFalse(cov.config.timid) + self.assertFalse(cov.config.branch) + self.assertEqual(cov.config.data_file, ".mycov") + + def test_data_file_from_environment(self): + # There's an environment variable for the data_file. + self.make_file(".coveragerc", """\ + [run] + timid = True + data_file = weirdo.file + """) + self.set_environ("COVERAGE_FILE", "fromenv.dat") + cov = coverage.coverage() + self.assertEqual(cov.config.data_file, "fromenv.dat") + # But the constructor args override the env var. + cov = coverage.coverage(data_file="fromarg.dat") + self.assertEqual(cov.config.data_file, "fromarg.dat") + + +class ConfigFileTest(CoverageTest): + """Tests of the config file settings in particular.""" + + def test_config_file_settings(self): + # This sample file tries to use lots of variation of syntax... + self.make_file(".coveragerc", """\ + # This is a settings file for coverage.py + [run] + timid = yes + data_file = something_or_other.dat + branch = 1 + cover_pylib = TRUE + parallel = on + include = a/ , b/ + + [report] + ; these settings affect reporting. + exclude_lines = + if 0: + + pragma:?\\s+no cover + another_tab + + ignore_errors = TRUE + omit = + one, another, some_more, + yet_more + + [html] + + directory = c:\\tricky\\dir.somewhere + + [xml] + output=mycov.xml + + """) + cov = coverage.coverage() + + self.assertTrue(cov.config.timid) + self.assertEqual(cov.config.data_file, "something_or_other.dat") + self.assertTrue(cov.config.branch) + self.assertTrue(cov.config.cover_pylib) + self.assertTrue(cov.config.parallel) + + self.assertEqual(cov.get_exclude_list(), + ["if 0:", "pragma:?\s+no cover", "another_tab"] + ) + self.assertTrue(cov.config.ignore_errors) + self.assertEqual(cov.config.include_prefixes, ["a/", "b/"]) + self.assertEqual(cov.config.omit_prefixes, + ["one", "another", "some_more", "yet_more"] + ) + + self.assertEqual(cov.config.html_dir, r"c:\tricky\dir.somewhere") + + self.assertEqual(cov.config.xml_output, "mycov.xml") diff --git a/test/test_coverage.py b/test/test_coverage.py index 093065f8..27bfffca 100644 --- a/test/test_coverage.py +++ b/test/test_coverage.py @@ -1,30 +1,111 @@ """Tests for Coverage.""" -# Copyright 2004-2009, Ned Batchelder # http://nedbatchelder.com/code/coverage -import os, sys, unittest +import os, sys import coverage coverage.use_cache(0) +from coverage.misc import CoverageException + sys.path.insert(0, os.path.split(__file__)[0]) # Force relative import for Py3k from coveragetest import CoverageTest +class TestCoverageTest(CoverageTest): + """Make sure our complex self.check_coverage method works.""" + + def test_successful_coverage(self): + # The simplest run possible. + self.check_coverage("""\ + a = 1 + b = 2 + """, + [1,2] + ) + # You can provide a list of possible statement matches. + self.check_coverage("""\ + a = 1 + b = 2 + """, + ([100], [1,2], [1723,47]), + ) + # You can specify missing lines. + self.check_coverage("""\ + a = 1 + if a == 2: + a = 3 + """, + [1,2,3], + missing="3", + ) + # You can specify a list of possible missing lines. + self.check_coverage("""\ + a = 1 + if a == 2: + a = 3 + """, + [1,2,3], + missing=("47-49", "3", "100,102") + ) + + def test_failed_coverage(self): + # If the lines are wrong, the message shows right and wrong. + self.assertRaisesRegexp(AssertionError, + r"\[1, 2] != \[1]", + self.check_coverage, """\ + a = 1 + b = 2 + """, + [1] + ) + # If the list of lines possibilities is wrong, the msg shows right. + self.assertRaisesRegexp(AssertionError, + r"None of the lines choices matched \[1, 2]", + self.check_coverage, """\ + a = 1 + b = 2 + """, + ([1], [2]) + ) + # If the missing lines are wrong, the message shows right and wrong. + self.assertRaisesRegexp(AssertionError, + r"'3' != '37'", + self.check_coverage, """\ + a = 1 + if a == 2: + a = 3 + """, + [1,2,3], + missing="37", + ) + # If the missing lines possibilities are wrong, the msg shows right. + self.assertRaisesRegexp(AssertionError, + r"None of the missing choices matched '3'", + self.check_coverage, """\ + a = 1 + if a == 2: + a = 3 + """, + [1,2,3], + missing=("37", "4-10"), + ) + + class BasicCoverageTest(CoverageTest): """The simplest tests, for quick smoke testing of fundamental changes.""" - + def testSimple(self): self.check_coverage("""\ a = 1 b = 2 - + c = 4 # Nothing here d = 6 """, - [1,2,4,6], report="4 4 100%") - + [1,2,4,6], report="4 0 100%") + def testIndentationWackiness(self): # Partial final lines are OK. self.check_coverage("""\ @@ -55,11 +136,11 @@ class BasicCoverageTest(CoverageTest): assert l == [12, 14, 16, 18] """, [1,5], "") - + class SimpleStatementTest(CoverageTest): """Testing simple single-line statements.""" - + def testExpression(self): self.check_coverage("""\ 1 + 2 @@ -71,7 +152,7 @@ class SimpleStatementTest(CoverageTest): def testAssert(self): self.check_coverage("""\ assert (1 + 2) - assert (1 + + assert (1 + 2) assert (1 + 2), 'the universe is broken' assert (1 + @@ -98,7 +179,7 @@ class SimpleStatementTest(CoverageTest): assert a == 7 and b == 8 and c == 9 """, [1,2,3], "") - + def testAttributeAssignment(self): # Attribute assignment self.check_coverage("""\ @@ -111,7 +192,7 @@ class SimpleStatementTest(CoverageTest): 1 """, [1,2,3,4,6], "") - + def testListofAttributeAssignment(self): self.check_coverage("""\ class obj: pass @@ -125,7 +206,7 @@ class SimpleStatementTest(CoverageTest): 2 """, [1,2,3,4,7], "") - + def testAugmentedAssignment(self): self.check_coverage("""\ a = 1 @@ -151,7 +232,7 @@ class SimpleStatementTest(CoverageTest): ''' c = len(''' long expression - ''' + + ''' + ''' on many lines. @@ -195,7 +276,7 @@ class SimpleStatementTest(CoverageTest): Foo().foo() """, ([1,2,4,5], [1,2,5]), "") - + def testDel(self): self.check_coverage("""\ d = { 'a': 1, 'b': 1, 'c': 1, 'd': 1, 'e': 1 } @@ -210,7 +291,7 @@ class SimpleStatementTest(CoverageTest): """, [1,2,3,6,9], "") - if sys.hexversion < 0x03000000: # Print statement is gone in Py3k. + if sys.version_info < (3, 0): # Print statement is gone in Py3k. def testPrint(self): self.check_coverage("""\ print "hello, world!" @@ -223,7 +304,7 @@ class SimpleStatementTest(CoverageTest): print "goodbye", """, [1,2,4,5,6,8], "") - + def testRaise(self): self.check_coverage("""\ try: @@ -251,7 +332,7 @@ class SimpleStatementTest(CoverageTest): return ( a + 1) - + x = fn() assert(x == 2) """, @@ -262,7 +343,7 @@ class SimpleStatementTest(CoverageTest): return (a, a + 1, a + 2) - + x,y,z = fn() assert x == 1 and y == 2 and z == 3 """, @@ -282,7 +363,7 @@ class SimpleStatementTest(CoverageTest): assert a == 1 and b == 9 and c == (1,2) """, [1,2,3,4,7,9,10], "") - + def testBreak(self): self.check_coverage("""\ for x in range(10): @@ -292,7 +373,7 @@ class SimpleStatementTest(CoverageTest): assert a == 2 """, [1,2,3,4,5], "4") - + def testContinue(self): self.check_coverage("""\ for x in range(10): @@ -302,7 +383,7 @@ class SimpleStatementTest(CoverageTest): assert a == 11 """, [1,2,3,4,5], "4") - + if 0: # Peephole optimization of jumps to jumps can mean that some statements # never hit the line tracer. The behavior is different in different @@ -319,7 +400,7 @@ class SimpleStatementTest(CoverageTest): b += 1 c += 1 assert a == 50 and b == 50 and c == 50 - + a = b = c = 0 for n in range(100): if n % 2: @@ -332,7 +413,7 @@ class SimpleStatementTest(CoverageTest): assert a == 33 and b == 50 and c == 50 """, [1,2,3,4,5,6,8,9,10, 12,13,14,15,16,17,19,20,21], "") - + def testImport(self): self.check_coverage("""\ import string @@ -379,7 +460,7 @@ class SimpleStatementTest(CoverageTest): assert len(path) > 0 """, [1,3], "") - + def testGlobal(self): self.check_coverage("""\ g = h = i = 1 @@ -401,7 +482,7 @@ class SimpleStatementTest(CoverageTest): """, [1,2,3,4,5], "") - if sys.hexversion < 0x03000000: + if sys.version_info < (3, 0): # In Python 2.x, exec is a statement. def testExec(self): self.check_coverage("""\ @@ -486,24 +567,24 @@ class SimpleStatementTest(CoverageTest): class CompoundStatementTest(CoverageTest): """Testing coverage of multi-line compound statements.""" - + def testStatementList(self): self.check_coverage("""\ a = 1; b = 2; c = 3 d = 4; e = 5; - + assert (a,b,c,d,e) == (1,2,3,4,5) """, [1,2,3,5], "") - + def testIf(self): self.check_coverage("""\ a = 1 if a == 1: x = 3 assert x == 3 - if (a == + if (a == 1): x = 7 assert x == 7 @@ -539,7 +620,7 @@ class CompoundStatementTest(CoverageTest): assert x == 4 """, [1,2,3,4,6,8,9], "6-8") - + def testElif(self): self.check_coverage("""\ a = 1; b = 2; c = 3; @@ -551,7 +632,7 @@ class CompoundStatementTest(CoverageTest): z = 7 assert x == 3 """, - [1,2,3,4,5,7,8], "4-7", report="7 4 57% 4-7") + [1,2,3,4,5,7,8], "4-7", report="7 3 57% 4-7") self.check_coverage("""\ a = 1; b = 2; c = 3; if a != 1: @@ -562,7 +643,7 @@ class CompoundStatementTest(CoverageTest): z = 7 assert y == 5 """, - [1,2,3,4,5,7,8], "3, 7", report="7 5 71% 3, 7") + [1,2,3,4,5,7,8], "3, 7", report="7 2 71% 3, 7") self.check_coverage("""\ a = 1; b = 2; c = 3; if a != 1: @@ -573,7 +654,7 @@ class CompoundStatementTest(CoverageTest): z = 7 assert z == 7 """, - [1,2,3,4,5,7,8], "3, 5", report="7 5 71% 3, 5") + [1,2,3,4,5,7,8], "3, 5", report="7 2 71% 3, 5") def testElifNoElse(self): self.check_coverage("""\ @@ -584,7 +665,7 @@ class CompoundStatementTest(CoverageTest): y = 5 assert x == 3 """, - [1,2,3,4,5,6], "4-5", report="6 4 66% 4-5") + [1,2,3,4,5,6], "4-5", report="6 2 66% 4-5") self.check_coverage("""\ a = 1; b = 2; c = 3; if a != 1: @@ -593,7 +674,7 @@ class CompoundStatementTest(CoverageTest): y = 5 assert y == 5 """, - [1,2,3,4,5,6], "3", report="6 5 83% 3") + [1,2,3,4,5,6], "3", report="6 1 83% 3") def testElifBizarre(self): self.check_coverage("""\ @@ -653,7 +734,7 @@ class CompoundStatementTest(CoverageTest): assert z == 7 """, [1,2,4,5,7,9,10], "4, 7") - + def testPathologicalSplitIf(self): self.check_coverage("""\ a = 1; b = 2; c = 3; @@ -700,7 +781,7 @@ class CompoundStatementTest(CoverageTest): assert z == 7 """, [1,2,5,6,9,11,12], "5, 9") - + def testAbsurdSplitIf(self): self.check_coverage("""\ a = 1; b = 2; c = 3; @@ -786,7 +867,7 @@ class CompoundStatementTest(CoverageTest): assert a == 2 and b == 1 """, [1,2,3,4,5,6,8,9], "6-8") - + def testSplitWhile(self): self.check_coverage("""\ a = 3; b = 0 @@ -834,7 +915,7 @@ class CompoundStatementTest(CoverageTest): assert a == 1 """, [1,2,3,4,5,6], "5") - + def testForElse(self): self.check_coverage("""\ a = 0 @@ -856,7 +937,7 @@ class CompoundStatementTest(CoverageTest): assert a == 1 """, [1,2,3,4,5,7,8], "5-7") - + def testSplitFor(self): self.check_coverage("""\ a = 0 @@ -876,7 +957,7 @@ class CompoundStatementTest(CoverageTest): assert a == 15 """, [1,2,6,7], "") - + def testTryExcept(self): self.check_coverage("""\ a = 0 @@ -946,7 +1027,7 @@ class CompoundStatementTest(CoverageTest): assert a == 99 """, [1,2,3,4,5,6,8,9], "8") - + def testTryFinally(self): self.check_coverage("""\ a = 0 @@ -978,7 +1059,7 @@ class CompoundStatementTest(CoverageTest): ''' docstring ''' return 1 - + a = foo() assert a == 1 """, @@ -991,7 +1072,7 @@ class CompoundStatementTest(CoverageTest): ''' docstring ''' return a+b - + x = foo(17, 23) assert x == 40 """, @@ -1007,7 +1088,7 @@ class CompoundStatementTest(CoverageTest): ''' docstring ''' return a+b - + x = foo() assert x == 22 """, @@ -1023,19 +1104,31 @@ class CompoundStatementTest(CoverageTest): def __init__(self): ''' Another docstring. ''' self.a = 1 - + def foo(self): return self.a - + x = theClass().foo() assert x == 1 """, - [2,6,8,10,11,13,14], "") + [2,6,8,10,11,13,14], "") class ExcludeTest(CoverageTest): """Tests of the exclusion feature to mark lines as not covered.""" - + + def testDefault(self): + # A number of forms of pragma comment are accepted. + self.check_coverage("""\ + a = 1 + b = 2 # pragma: no cover + c = 3 + d = 4 #pragma NOCOVER + e = 5 + """, + [1,3,5] + ) + def testSimple(self): self.check_coverage("""\ a = 1; b = 2 @@ -1056,7 +1149,7 @@ class ExcludeTest(CoverageTest): assert a == 1 and b == 2 """, [1,3,5,7], "5", ['-cc', '-xx']) - + def testExcludingIfSuite(self): self.check_coverage("""\ a = 1; b = 2 @@ -1083,7 +1176,7 @@ class ExcludeTest(CoverageTest): assert a == 8 and b == 9 """, [1,8,9,10], "", ['if 0:']) - + def testExcludingElseSuite(self): self.check_coverage("""\ a = 1; b = 2 @@ -1105,14 +1198,14 @@ class ExcludeTest(CoverageTest): a = 4 b = 5 c = 6 - + # Lots of comments to confuse the else handler. # more. - + else: #pragma: NO COVER # Comments here too. - + a = 8 b = 9 assert a == 4 and b == 5 and c == 6 @@ -1130,7 +1223,7 @@ class ExcludeTest(CoverageTest): elif 1==0: #pragma: NO COVER a = 8 b = 9 - else: + else: a = 11 b = 12 assert a == 4 and b == 5 and c == 6 @@ -1143,7 +1236,7 @@ class ExcludeTest(CoverageTest): a = 2 if 0: x = 3 # no cover b = 4 - + foo() """, [1,2,4,6], "", ["no cover"]) @@ -1154,11 +1247,11 @@ class ExcludeTest(CoverageTest): l = list(range(10)) a = l[:3] # no cover b = 4 - + foo() """, [1,2,4,6], "", ["no cover"]) - + def testExcludingForSuite(self): self.check_coverage("""\ a = 0 @@ -1186,7 +1279,7 @@ class ExcludeTest(CoverageTest): assert a == 1 """, [1,7], "", ['#pragma: NO COVER']) - + def testExcludingForElse(self): self.check_coverage("""\ a = 0 @@ -1199,7 +1292,7 @@ class ExcludeTest(CoverageTest): assert a == 1 """, [1,2,3,4,5,8], "5", ['#pragma: NO COVER']) - + def testExcludingWhile(self): self.check_coverage("""\ a = 3; b = 0 @@ -1290,7 +1383,7 @@ class ExcludeTest(CoverageTest): assert a == 99 """, [1,2,3,4,5,6,9], "", ['#pragma: NO COVER']) - + def testExcludingTryExceptPass(self): self.check_coverage("""\ a = 0 @@ -1336,7 +1429,7 @@ class ExcludeTest(CoverageTest): assert a == 99 """, [1,2,3,4,5,6,9], "", ['#pragma: NO COVER']) - + def testExcludingIfPass(self): # From a comment on the coverage page by Michael McNeil Forbes: self.check_coverage("""\ @@ -1345,18 +1438,18 @@ class ExcludeTest(CoverageTest): pass # This line still reported as missing if False: # pragma: no cover x = 1 # Now it is skipped. - + f() """, [1,7], "", ["no cover"]) - + def testExcludingFunction(self): self.check_coverage("""\ def fn(foo): #pragma: NO COVER a = 1 b = 2 c = 3 - + x = 1 assert x == 1 """, @@ -1367,71 +1460,47 @@ class ExcludeTest(CoverageTest): class Fooey: def __init__(self): self.a = 1 - + def foo(self): #pragma: NO COVER return self.a - + x = Fooey() assert x.a == 1 """, [1,2,3,8,9], "", ['#pragma: NO COVER']) - + def testExcludingClass(self): self.check_coverage("""\ class Fooey: #pragma: NO COVER def __init__(self): self.a = 1 - + def foo(self): return self.a - + x = 1 assert x == 1 """, [8,9], "", ['#pragma: NO COVER']) -class ThreadingTest(CoverageTest): - """Tests of the threading support.""" - - def testThreading(self): - self.check_coverage("""\ - import time, threading - - def fromMainThread(): - return "called from main thread" - - def fromOtherThread(): - return "called from other thread" - - def neverCalled(): - return "no one calls me" - - other = threading.Thread(target=fromOtherThread) - other.start() - fromMainThread() - other.join() - """, - [1,3,4,6,7,9,10,12,13,14,15], "10") - - -if sys.hexversion >= 0x020400f0: +if sys.version_info >= (2, 4): class Py24Test(CoverageTest): """Tests of new syntax in Python 2.4.""" - + def testFunctionDecorators(self): self.check_coverage("""\ def require_int(func): def wrapper(arg): assert isinstance(arg, int) return func(arg) - + return wrapper - + @require_int def p1(arg): return arg*2 - + assert p1(10) == 20 """, [1,2,3,4,6,8,10,12], "") @@ -1444,11 +1513,11 @@ if sys.hexversion >= 0x020400f0: return extra*func(arg) return wrapper return decorator - + @boost_by(10) def boosted(arg): return arg*2 - + assert boosted(10) == 200 """, [1,2,3,4,5,6,8,10,12], "") @@ -1467,45 +1536,45 @@ if sys.hexversion >= 0x020400f0: return extra*func(arg) return wrapper return decorator - + @require_int @boost_by(10) def boosted1(arg): return arg*2 - + assert boosted1(10) == 200 @boost_by(10) @require_int def boosted2(arg): return arg*2 - + assert boosted2(10) == 200 """, ([1,2,3,4,5,7,8,9,10,11,12,14,15,17,19,21,22,24,26], [1,2,3,4,5,7,8,9,10,11,12,14, 17,19,21, 24,26]), "") -if sys.hexversion >= 0x020500f0: +if sys.version_info >= (2, 5): class Py25Test(CoverageTest): """Tests of new syntax in Python 2.5.""" def testWithStatement(self): self.check_coverage("""\ from __future__ import with_statement - + class Managed: def __enter__(self): desc = "enter" - + def __exit__(self, type, value, tb): desc = "exit" - + m = Managed() with m: desc = "block1a" desc = "block1b" - + try: with m: desc = "block2" @@ -1514,7 +1583,7 @@ if sys.hexversion >= 0x020500f0: desc = "caught" """, [1,3,4,5,7,8,10,11,12,13,15,16,17,18,19,20], "") - + def testTryExceptFinally(self): self.check_coverage("""\ a = 0; b = 0 @@ -1596,7 +1665,7 @@ if sys.hexversion >= 0x020500f0: assert a == 99 and b == 2 """, [1,2,3,4,5,6,8,10,11], "8") - + class ModuleTest(CoverageTest): """Tests for the module-level behavior of the `coverage` module.""" @@ -1607,287 +1676,29 @@ class ModuleTest(CoverageTest): coverage.coverage() -class ProcessTest(CoverageTest): - """Tests of the per-process behavior of coverage.py.""" - - def testSaveOnExit(self): - self.make_file("mycode.py", """\ - h = "Hello" - w = "world" - """) - - self.assert_(not os.path.exists(".coverage")) - self.run_command("coverage -x mycode.py") - self.assert_(os.path.exists(".coverage")) - - def testEnvironment(self): - # Checks that we can import modules from the test directory at all! - self.make_file("mycode.py", """\ - import covmod1 - import covmodzip1 - a = 1 - print ('done') - """) - - self.assert_(not os.path.exists(".coverage")) - out = self.run_command("coverage -x mycode.py") - self.assert_(os.path.exists(".coverage")) - self.assertEqual(out, 'done\n') - - def testCombineParallelData(self): - self.make_file("b_or_c.py", """\ - import sys - a = 1 - if sys.argv[1] == 'b': - b = 1 - else: - c = 1 - d = 1 - print ('done') - """) - - out = self.run_command("coverage -x -p b_or_c.py b") - self.assertEqual(out, 'done\n') - self.assert_(not os.path.exists(".coverage")) - - out = self.run_command("coverage -x -p b_or_c.py c") - self.assertEqual(out, 'done\n') - self.assert_(not os.path.exists(".coverage")) - - # After two -p runs, there should be two .coverage.machine.123 files. - self.assertEqual( - len([f for f in os.listdir('.') if f.startswith('.coverage.')]), - 2) - - # Combine the parallel coverage data files into .coverage . - self.run_command("coverage -c") - self.assert_(os.path.exists(".coverage")) - - # Read the coverage file and see that b_or_c.py has all 7 lines - # executed. - data = coverage.CoverageData() - data.read_file(".coverage") - self.assertEqual(data.summary()['b_or_c.py'], 7) - - def test_missing_source_file(self): - # Check what happens if the source is missing when reporting happens. - self.make_file("fleeting.py", """\ - s = 'goodbye, cruel world!' - """) - - self.run_command("coverage run fleeting.py") - os.remove("fleeting.py") - out = self.run_command("coverage html -d htmlcov") - self.assert_matches(out, "No source for code: '.*fleeting.py'") - self.assert_("Traceback" not in out) - - # It happens that the code paths are different for *.py and other - # files, so try again with no extension. - self.make_file("fleeting", """\ - s = 'goodbye, cruel world!' - """) - - self.run_command("coverage run fleeting") - os.remove("fleeting") - out = self.run_command("coverage html -d htmlcov") - self.assert_matches(out, "No source for code: '.*fleeting'") - self.assert_("Traceback" not in out) - - def test_running_missing_file(self): - out = self.run_command("coverage run xyzzy.py") - self.assert_matches(out, "No file to run: .*xyzzy.py") - self.assert_("Traceback" not in out) - - -class RecursionTest(CoverageTest): - """Check what happens when recursive code gets near limits.""" - - def testShortRecursion(self): - # We can definitely get close to 500 stack frames. - self.check_coverage("""\ - def recur(n): - if n == 0: - return 0 - else: - return recur(n-1)+1 - - recur(495) # We can get at least this many stack frames. - """, - [1,2,3,5,7], "") - - def testLongRecursion(self): - # We can't finish a very deep recursion, but we don't crash. - self.assertRaises(RuntimeError, self.check_coverage, - """\ - def recur(n): - if n == 0: - return 0 - else: - return recur(n-1)+1 - - recur(100000) # This is definitely too many frames. - """, - [1,2,3,5,7], "") - - -class PyexpatTest(CoverageTest): - """Pyexpat screws up tracing. Make sure we've counter-defended properly.""" - - def testPyexpat(self): - # pyexpat calls the trace function explicitly (inexplicably), and does - # it wrong for exceptions. Parsing a DOCTYPE for some reason throws - # an exception internally, and triggers its wrong behavior. This test - # checks that our fake PyTrace_RETURN hack in tracer.c works. It will - # also detect if the pyexpat bug is fixed unbeknownst to us, meaning - # we'd see two RETURNs where there should only be one. - - self.make_file("trydom.py", """\ - import xml.dom.minidom - - XML = '''\\ - <!DOCTYPE fooey SYSTEM "http://www.example.com/example.dtd"> - <root><child/><child/></root> - ''' - - def foo(): - dom = xml.dom.minidom.parseString(XML) - assert len(dom.getElementsByTagName('child')) == 2 - a = 11 - - foo() - """) - - self.make_file("outer.py", "\n"*100 + "import trydom\na = 102\n") - - cov = coverage.coverage() - cov.erase() - - # Import the python file, executing it. - cov.start() - self.import_module("outer") - cov.stop() - - _, statements, missing, _ = cov.analysis("trydom.py") - self.assertEqual(statements, [1,3,8,9,10,11,13]) - self.assertEqual(missing, []) - - _, statements, missing, _ = cov.analysis("outer.py") - self.assertEqual(statements, [101,102]) - self.assertEqual(missing, []) - - -class ExceptionTest(CoverageTest): - """I suspect different versions of Python deal with exceptions differently - in the trace function. - """ - - def testException(self): - # Python 2.3's trace function doesn't get called with "return" if the - # scope is exiting due to an exception. This confounds our trace - # function which relies on scope announcements to track which files to - # trace. - # - # This test is designed to sniff this out. Each function in the call - # stack is in a different file, to try to trip up the tracer. Each - # file has active lines in a different range so we'll see if the lines - # get attributed to the wrong file. - - self.make_file("oops.py", """\ - def oops(args): - a = 2 - raise Exception("oops") - a = 4 - """) - - self.make_file("fly.py", "\n"*100 + """\ - def fly(calls): - a = 2 - calls[0](calls[1:]) - a = 4 - """) - - self.make_file("catch.py", "\n"*200 + """\ - def catch(calls): - try: - a = 3 - calls[0](calls[1:]) - a = 5 - except: - a = 7 - """) - - self.make_file("doit.py", "\n"*300 + """\ - def doit(calls): - try: - calls[0](calls[1:]) - except: - a = 5 - """) - - # Import all the modules before starting coverage, so the def lines - # won't be in all the results. - for mod in "oops fly catch doit".split(): - self.import_module(mod) - - # Each run nests the functions differently to get different - # combinations of catching exceptions and letting them fly. - runs = [ - ("doit fly oops", { - 'doit.py': [302,303,304,305], - 'fly.py': [102,103], - 'oops.py': [2,3], - }), - ("doit catch oops", { - 'doit.py': [302,303], - 'catch.py': [202,203,204,206,207], - 'oops.py': [2,3], - }), - ("doit fly catch oops", { - 'doit.py': [302,303], - 'fly.py': [102,103,104], - 'catch.py': [202,203,204,206,207], - 'oops.py': [2,3], - }), - ("doit catch fly oops", { - 'doit.py': [302,303], - 'catch.py': [202,203,204,206,207], - 'fly.py': [102,103], - 'oops.py': [2,3], - }), - ] - - for callnames, lines_expected in runs: - - # Make the list of functions we'll call for this test. - calls = [getattr(sys.modules[cn], cn) for cn in callnames.split()] - - cov = coverage.coverage() - cov.start() - # Call our list of functions: invoke the first, with the rest as - # an argument. - calls[0](calls[1:]) - cov.stop() - - # Clean the line data and compare to expected results. - # The filenames are absolute, so keep just the base. - lines = cov.data.line_data() - clean_lines = {} - for f, llist in lines.items(): - if f == __file__: - # ignore this file. - continue - clean_lines[os.path.basename(f)] = llist - self.assertEqual(clean_lines, lines_expected) - - -if __name__ == '__main__': - print("Testing under Python version: %s" % sys.version) - unittest.main() - - -# TODO: split "and" conditions across lines, and detect not running lines. -# (Can't be done: trace function doesn't get called for each line -# in an expression!) -# TODO: Generator comprehensions? -# TODO: Constant if tests ("if 1:"). Py 2.4 doesn't execute them. -# TODO: There are no tests for analysis2 directly. +class ReportingTest(CoverageTest): + """Tests of some reporting behavior.""" + + def test_no_data_to_report_on_annotate(self): + # Reporting with no data produces a nice message and no output dir. + self.assertRaisesRegexp( + CoverageException, "No data to report.", + self.command_line, "annotate -d ann" + ) + self.assertFalse(os.path.exists("ann")) + + def test_no_data_to_report_on_html(self): + # Reporting with no data produces a nice message and no output dir. + self.assertRaisesRegexp( + CoverageException, "No data to report.", + self.command_line, "html -d htmlcov" + ) + self.assertFalse(os.path.exists("htmlcov")) + + def test_no_data_to_report_on_xml(self): + # Reporting with no data produces a nice message. + self.assertRaisesRegexp( + CoverageException, "No data to report.", + self.command_line, "xml" + ) + # Currently, this leaves an empty coverage.xml file... :( diff --git a/test/test_data.py b/test/test_data.py index 640f4f07..83a5b8ae 100644 --- a/test/test_data.py +++ b/test/test_data.py @@ -29,11 +29,11 @@ class DataTest(CoverageTest): def assert_summary(self, covdata, summary): """Check that the summary of `covdata` is `summary`.""" self.assertEqual(covdata.summary(), summary) - + def assert_executed_files(self, covdata, execed): """Check that `covdata`'s executed files are `execed`.""" - self.assert_equal_sets(covdata.executed_files(), execed) - + self.assertSameElements(covdata.executed_files(), execed) + def test_reading_empty(self): covdata = CoverageData() covdata.read() @@ -44,25 +44,25 @@ class DataTest(CoverageTest): covdata.add_line_data(DATA_1) self.assert_summary(covdata, SUMMARY_1) self.assert_executed_files(covdata, EXECED_FILES_1) - + def test_writing_and_reading(self): covdata1 = CoverageData() covdata1.add_line_data(DATA_1) covdata1.write() - + covdata2 = CoverageData() covdata2.read() self.assert_summary(covdata2, SUMMARY_1) def test_combining(self): - covdata1 = CoverageData(suffix='1') + covdata1 = CoverageData() covdata1.add_line_data(DATA_1) - covdata1.write() - - covdata2 = CoverageData(suffix='2') + covdata1.write(suffix='1') + + covdata2 = CoverageData() covdata2.add_line_data(DATA_2) - covdata2.write() - + covdata2.write(suffix='2') + covdata3 = CoverageData() covdata3.combine_parallel_data() self.assert_summary(covdata3, SUMMARY_1_2) @@ -74,7 +74,7 @@ class DataTest(CoverageTest): covdata1.write() covdata1.erase() self.assert_summary(covdata1, {}) - + covdata2 = CoverageData() covdata2.read() self.assert_summary(covdata2, {}) @@ -84,17 +84,17 @@ class DataTest(CoverageTest): covdata = CoverageData() covdata.add_line_data(DATA_1) covdata.write() - + fdata = open(".coverage", 'rb') try: data = pickle.load(fdata) finally: fdata.close() - + lines = data['lines'] - self.assert_equal_sets(lines.keys(), EXECED_FILES_1) - self.assert_equal_sets(lines['a.py'], A_PY_LINES_1) - self.assert_equal_sets(lines['b.py'], B_PY_LINES_1) + self.assertSameElements(lines.keys(), EXECED_FILES_1) + self.assertSameElements(lines['a.py'], A_PY_LINES_1) + self.assertSameElements(lines['b.py'], B_PY_LINES_1) # If not measuring branches, there's no arcs entry. self.assertEqual(data.get('arcs', 'not there'), 'not there') @@ -103,14 +103,14 @@ class DataTest(CoverageTest): covdata = CoverageData() covdata.add_arc_data(ARC_DATA_3) covdata.write() - + fdata = open(".coverage", 'rb') try: data = pickle.load(fdata) finally: fdata.close() - - self.assert_equal_sets(data['lines'].keys(), []) + + self.assertSameElements(data['lines'].keys(), []) arcs = data['arcs'] - self.assert_equal_sets(arcs['x.py'], X_PY_ARCS_3) - self.assert_equal_sets(arcs['y.py'], Y_PY_ARCS_3) + self.assertSameElements(arcs['x.py'], X_PY_ARCS_3) + self.assertSameElements(arcs['y.py'], Y_PY_ARCS_3) diff --git a/test/test_execfile.py b/test/test_execfile.py index 5e9f4fd5..2f28a069 100644 --- a/test/test_execfile.py +++ b/test/test_execfile.py @@ -17,7 +17,7 @@ class RunTest(CoverageTest): tryfile = os.path.join(here, "try_execfile.py") run_python_file(tryfile, [tryfile, "arg1", "arg2"]) mod_globs = eval(self.stdout()) - + # The file should think it is __main__ self.assertEqual(mod_globs['__name__'], "__main__") @@ -30,10 +30,10 @@ class RunTest(CoverageTest): "Test file for run_python_file.") self.assertEqual(mod_globs['DATA'], "xyzzy") self.assertEqual(mod_globs['FN_VAL'], "my_fn('fooey')") - + # It must be self-importable as __main__. self.assertEqual(mod_globs['__main__.DATA'], "xyzzy") - + # Argv should have the proper values. self.assertEqual(mod_globs['argv'], [tryfile, "arg1", "arg2"]) @@ -60,5 +60,17 @@ class RunTest(CoverageTest): run_python_file('nl.py', ['nl.py']) self.assertEqual(self.stdout(), "Hello, world!\n"*3) + def test_missing_final_newline(self): + # Make sure we can deal with a Python file with no final newline. + self.make_file("abrupt.py", """\ + if 1: + a = 1 + print("a is %r" % a) + #""") + abrupt = open("abrupt.py").read() + self.assertEqual(abrupt[-1], '#') + run_python_file("abrupt.py", ["abrupt.py"]) + self.assertEqual(self.stdout(), "a is 1\n") + def test_no_such_file(self): self.assertRaises(NoSource, run_python_file, "xyzzy.py", []) diff --git a/test/test_farm.py b/test/test_farm.py index bc1d7a30..79b345a6 100644 --- a/test/test_farm.py +++ b/test/test_farm.py @@ -3,7 +3,7 @@ import difflib, filecmp, fnmatch, glob, os, re, shutil, sys sys.path.insert(0, os.path.split(__file__)[0]) # Force relative import for Py3k -from backtest import run_command, execfile # pylint: disable-msg=W0622 +from backtest import run_command, execfile # pylint: disable-msg=W0622 def test_farm(clean_only=False): @@ -15,9 +15,9 @@ def test_farm(clean_only=False): class FarmTestCase(object): """A test case from the farm tree. - + Tests are short Python script files, often called run.py: - + copy("src", "out") run(''' coverage -x white.py @@ -29,14 +29,14 @@ class FarmTestCase(object): Verbs (copy, run, compare, clean) are methods in this class. FarmTestCase has options to allow various uses of the test cases (normal execution, cleaning-only, or run and leave the results for debugging). - + """ def __init__(self, runpy, clean_only=False, dont_clean=False): """Create a test case from a run.py file. - + `clean_only` means that only the clean() action is executed. `dont_clean` means that the clean() action is not executed. - + """ self.description = runpy self.dir, self.runpy = os.path.split(runpy) @@ -54,14 +54,14 @@ class FarmTestCase(object): oldpath = sys.path[:] sys.path.insert(0, directory) return oldpath - + def restorepath(self, path): """Restore the system path to `path`.""" sys.path = path def __call__(self): """Execute the test from the run.py file. - + """ cwd = self.cd(self.dir) @@ -74,13 +74,18 @@ class FarmTestCase(object): glo = dict([(fn, getattr(self, fn)) for fn in fns]) if self.dont_clean: glo['clean'] = self.noop - + + old_mods = dict(sys.modules) try: execfile(self.runpy, glo) finally: self.cd(cwd) + # Remove any new modules imported during the test run. This lets us + # import the same source files for more than one test. + for m in [m for m in sys.modules if m not in old_mods]: + del sys.modules[m] - def run_fully(self): + def run_fully(self): # pragma: no cover """Run as a full test case, with setUp and tearDown.""" self.setUp() try: @@ -88,16 +93,16 @@ class FarmTestCase(object): finally: self.tearDown() - def fnmatch_list(self, files, filepattern): - """Filter the list of `files` to only those that match `filepattern`. - - If `filepattern` is None, then return the entire list of files. - + def fnmatch_list(self, files, file_pattern): + """Filter the list of `files` to only those that match `file_pattern`. + + If `file_pattern` is None, then return the entire list of files. + Returns a list of the filtered files. - + """ - if filepattern: - files = [f for f in files if fnmatch.fnmatch(f, filepattern)] + if file_pattern: + files = [f for f in files if fnmatch.fnmatch(f, file_pattern)] return files def setUp(self): @@ -106,7 +111,7 @@ class FarmTestCase(object): # Modules should be importable from the current directory. self.old_syspath = sys.path[:] sys.path.insert(0, '') - + def tearDown(self): """Test tear down, run by nose after __call__.""" # Make sure no matter what, the test is cleaned up. @@ -118,11 +123,11 @@ class FarmTestCase(object): sys.path = self.old_syspath # Functions usable inside farm run.py files - + def noop(self, *args, **kwargs): """A no-op function to stub out run, copy, etc, when only cleaning.""" pass - + def copy(self, src, dst): """Copy a directory.""" @@ -132,11 +137,11 @@ class FarmTestCase(object): def run(self, cmds, rundir="src", outfile=None): """Run a list of commands. - + `cmds` is a string, commands separated by newlines. `rundir` is the directory in which to run the commands. `outfile` is a filename to redirect stdout to. - + """ cwd = self.cd(rundir) try: @@ -155,12 +160,12 @@ class FarmTestCase(object): def runfunc(self, fn, rundir="src", addtopath=None): """Run a function. - + `fn` is a callable. `rundir` is the directory in which to run the function. - + """ - + cwd = self.cd(rundir) oldpath = self.addtopath(addtopath) try: @@ -169,32 +174,32 @@ class FarmTestCase(object): self.cd(cwd) self.restorepath(oldpath) - def compare(self, dir1, dir2, filepattern=None, size_within=0, + def compare(self, dir1, dir2, file_pattern=None, size_within=0, left_extra=False, right_extra=False, scrubs=None ): - """Compare files matching `filepattern` in `dir1` and `dir2`. - + """Compare files matching `file_pattern` in `dir1` and `dir2`. + `dir2` is interpreted as a prefix, with Python version numbers appended to find the actual directory to compare with. "foo" will compare against "foo_v241", "foo_v24", "foo_v2", or "foo", depending on which directory is found first. - + `size_within` is a percentage delta for the file sizes. If non-zero, then the file contents are not compared (since they are expected to often be different), but the file sizes must be within this amount. For example, size_within=10 means that the two files' sizes must be within 10 percent of each other to compare equal. - + `left_extra` true means the left directory can have extra files in it without triggering an assertion. `right_extra` means the right directory can. - + `scrubs` is a list of pairs, regex find and replace patterns to use to scrub the files of unimportant differences. - + An assertion will be raised if the directories fail one of their matches. - + """ # Search for a dir2 with a version suffix. version_suff = ''.join(map(str, sys.version_info[:3])) @@ -207,12 +212,12 @@ class FarmTestCase(object): assert os.path.exists(dir1), "Left directory missing: %s" % dir1 assert os.path.exists(dir2), "Right directory missing: %s" % dir2 - + dc = filecmp.dircmp(dir1, dir2) - diff_files = self.fnmatch_list(dc.diff_files, filepattern) - left_only = self.fnmatch_list(dc.left_only, filepattern) - right_only = self.fnmatch_list(dc.right_only, filepattern) - + diff_files = self.fnmatch_list(dc.diff_files, file_pattern) + left_only = self.fnmatch_list(dc.left_only, file_pattern) + right_only = self.fnmatch_list(dc.right_only, file_pattern) + if size_within: # The files were already compared, use the diff_files list as a # guide for size comparison. @@ -226,7 +231,10 @@ class FarmTestCase(object): # print "%d %d" % (big, little) # print "Left: ---\n%s\n-----\n%s" % (left, right) wrong_size.append(f) - assert not wrong_size, "File sizes differ: %s" % wrong_size + assert not wrong_size, ( + "File sizes differ between %s and %s: %s" % ( + dir1, dir2, wrong_size + )) else: # filecmp only compares in binary mode, but we want text mode. So # look through the list of different files, and compare them @@ -250,10 +258,10 @@ class FarmTestCase(object): def _scrub(self, strlist, scrubs): """Scrub uninteresting data from the strings in `strlist`. - + `scrubs is a list of (find, replace) pairs of regexes that are used on each string in `strlist`. A list of scrubbed strings is returned. - + """ scrubbed = [] for s in strlist: @@ -264,10 +272,10 @@ class FarmTestCase(object): def contains(self, filename, *strlist): """Check that the file contains all of a list of strings. - + An assert will be raised if one of the arguments in `strlist` is missing in `filename`. - + """ text = open(filename, "r").read() for s in strlist: @@ -275,10 +283,10 @@ class FarmTestCase(object): def doesnt_contain(self, filename, *strlist): """Check that the file contains none of a list of strings. - + An assert will be raised if any of the strings in strlist appears in `filename`. - + """ text = open(filename, "r").read() for s in strlist: @@ -286,18 +294,32 @@ class FarmTestCase(object): def clean(self, cleandir): """Clean `cleandir` by removing it and all its children completely.""" - if os.path.exists(cleandir): - shutil.rmtree(cleandir) + # rmtree gives mysterious failures on Win7, so retry a "few" times. + # I've seen it take over 100 tries, so, 1000! This is probably the + # most unpleasant hack I've written in a long time... + tries = 1000 + while tries: + if os.path.exists(cleandir): + try: + shutil.rmtree(cleandir) + except OSError: + if tries == 1: + raise + else: + tries -= 1 + continue + break + -def main(): +def main(): # pragma: no cover """Command-line access to test_farm. - + Commands: - + run testcase - Run a single test case. out testcase - Run a test case, but don't clean up, to see the output. clean - Clean all the output for all tests. - + """ op = sys.argv[1] if op == 'run': @@ -314,7 +336,7 @@ def main(): test[0].run_fully() else: print("Need an operation: run, out, clean") - + # So that we can run just one farm run.py at a time. if __name__ == '__main__': main() diff --git a/test/test_files.py b/test/test_files.py new file mode 100644 index 00000000..ca9b4e0d --- /dev/null +++ b/test/test_files.py @@ -0,0 +1,35 @@ +"""Tests for files.py""" + +import os, sys + +from coverage.files import FileLocator + +sys.path.insert(0, os.path.split(__file__)[0]) # Force relative import for Py3k +from coveragetest import CoverageTest + + +class FileLocatorTest(CoverageTest): + """Tests of `FileLocator`.""" + + def abs_path(self, p): + """Return the absolute path for `p`.""" + return os.path.join(os.getcwd(), os.path.normpath(p)) + + def test_simple(self): + self.make_file("hello.py", "#hello") + fl = FileLocator() + self.assertEqual(fl.relative_filename("hello.py"), "hello.py") + a = self.abs_path("hello.py") + self.assertNotEqual(a, "hello.py") + self.assertEqual(fl.relative_filename(a), "hello.py") + + def test_peer_directories(self): + self.make_file("sub/proj1/file1.py", "file1") + self.make_file("sub/proj2/file2.py", "file2") + a1 = self.abs_path("sub/proj1/file1.py") + a2 = self.abs_path("sub/proj2/file2.py") + d = os.path.normpath("sub/proj1") + os.chdir(d) + fl = FileLocator() + self.assertEqual(fl.relative_filename(a1), "file1.py") + self.assertEqual(fl.relative_filename(a2), a2) diff --git a/test/test_oddball.py b/test/test_oddball.py new file mode 100644 index 00000000..7d8084ae --- /dev/null +++ b/test/test_oddball.py @@ -0,0 +1,284 @@ +"""Oddball cases for testing coverage.py""" + +import os, sys +import coverage + +sys.path.insert(0, os.path.split(__file__)[0]) # Force relative import for Py3k +from coveragetest import CoverageTest +import osinfo + +class ThreadingTest(CoverageTest): + """Tests of the threading support.""" + + def testThreading(self): + self.check_coverage("""\ + import time, threading + + def fromMainThread(): + return "called from main thread" + + def fromOtherThread(): + return "called from other thread" + + def neverCalled(): + return "no one calls me" + + other = threading.Thread(target=fromOtherThread) + other.start() + fromMainThread() + other.join() + """, + [1,3,4,6,7,9,10,12,13,14,15], "10") + + +class RecursionTest(CoverageTest): + """Check what happens when recursive code gets near limits.""" + + def testShortRecursion(self): + # We can definitely get close to 500 stack frames. + self.check_coverage("""\ + def recur(n): + if n == 0: + return 0 + else: + return recur(n-1)+1 + + recur(495) # We can get at least this many stack frames. + """, + [1,2,3,5,7], "") + + def testLongRecursion(self): + # We can't finish a very deep recursion, but we don't crash. + self.assertRaises(RuntimeError, self.check_coverage, + """\ + def recur(n): + if n == 0: + return 0 + else: + return recur(n-1)+1 + + recur(100000) # This is definitely too many frames. + """, + [1,2,3,5,7], "") + + +class MemoryLeakTest(CoverageTest): + """Attempt the impossible: test that memory doesn't leak.""" + + def test_for_leaks(self): + lines = list(range(301, 315)) + lines.remove(306) + # Ugly string mumbo jumbo to get 300 blank lines at the beginning.. + code = """\ + # blank line\n""" * 300 + """\ + def once(x): + if x % 100 == 0: + raise Exception("100!") + elif x % 2: + return 10 + else: + return 11 + i = 0 # Portable loop without alloc'ing memory. + while i < ITERS: + try: + once(i) + except: + pass + i += 1 + """ + ram_0 = osinfo.process_ram() + self.check_coverage(code.replace("ITERS", "10"), lines, "") + ram_1 = osinfo.process_ram() + self.check_coverage(code.replace("ITERS", "10000"), lines, "") + ram_2 = osinfo.process_ram() + ram_growth = (ram_2 - ram_1) - (ram_1 - ram_0) + self.assertTrue(ram_growth < 100000, "RAM grew by %d" % (ram_growth)) + + +class PyexpatTest(CoverageTest): + """Pyexpat screws up tracing. Make sure we've counter-defended properly.""" + + def testPyexpat(self): + # pyexpat calls the trace function explicitly (inexplicably), and does + # it wrong for exceptions. Parsing a DOCTYPE for some reason throws + # an exception internally, and triggers its wrong behavior. This test + # checks that our fake PyTrace_RETURN hack in tracer.c works. It will + # also detect if the pyexpat bug is fixed unbeknownst to us, meaning + # we'd see two RETURNs where there should only be one. + + self.make_file("trydom.py", """\ + import xml.dom.minidom + + XML = '''\\ + <!DOCTYPE fooey SYSTEM "http://www.example.com/example.dtd"> + <root><child/><child/></root> + ''' + + def foo(): + dom = xml.dom.minidom.parseString(XML) + assert len(dom.getElementsByTagName('child')) == 2 + a = 11 + + foo() + """) + + self.make_file("outer.py", "\n"*100 + "import trydom\na = 102\n") + + cov = coverage.coverage() + cov.erase() + + # Import the python file, executing it. + cov.start() + self.import_module("outer") + cov.stop() + + _, statements, missing, _ = cov.analysis("trydom.py") + self.assertEqual(statements, [1,3,8,9,10,11,13]) + self.assertEqual(missing, []) + + _, statements, missing, _ = cov.analysis("outer.py") + self.assertEqual(statements, [101,102]) + self.assertEqual(missing, []) + + +class ExceptionTest(CoverageTest): + """I suspect different versions of Python deal with exceptions differently + in the trace function. + """ + + def testException(self): + # Python 2.3's trace function doesn't get called with "return" if the + # scope is exiting due to an exception. This confounds our trace + # function which relies on scope announcements to track which files to + # trace. + # + # This test is designed to sniff this out. Each function in the call + # stack is in a different file, to try to trip up the tracer. Each + # file has active lines in a different range so we'll see if the lines + # get attributed to the wrong file. + + self.make_file("oops.py", """\ + def oops(args): + a = 2 + raise Exception("oops") + a = 4 + """) + + self.make_file("fly.py", "\n"*100 + """\ + def fly(calls): + a = 2 + calls[0](calls[1:]) + a = 4 + """) + + self.make_file("catch.py", "\n"*200 + """\ + def catch(calls): + try: + a = 3 + calls[0](calls[1:]) + a = 5 + except: + a = 7 + """) + + self.make_file("doit.py", "\n"*300 + """\ + def doit(calls): + try: + calls[0](calls[1:]) + except: + a = 5 + """) + + # Import all the modules before starting coverage, so the def lines + # won't be in all the results. + for mod in "oops fly catch doit".split(): + self.import_module(mod) + + # Each run nests the functions differently to get different + # combinations of catching exceptions and letting them fly. + runs = [ + ("doit fly oops", { + 'doit.py': [302,303,304,305], + 'fly.py': [102,103], + 'oops.py': [2,3], + }), + ("doit catch oops", { + 'doit.py': [302,303], + 'catch.py': [202,203,204,206,207], + 'oops.py': [2,3], + }), + ("doit fly catch oops", { + 'doit.py': [302,303], + 'fly.py': [102,103,104], + 'catch.py': [202,203,204,206,207], + 'oops.py': [2,3], + }), + ("doit catch fly oops", { + 'doit.py': [302,303], + 'catch.py': [202,203,204,206,207], + 'fly.py': [102,103], + 'oops.py': [2,3], + }), + ] + + for callnames, lines_expected in runs: + + # Make the list of functions we'll call for this test. + calls = [getattr(sys.modules[cn], cn) for cn in callnames.split()] + + cov = coverage.coverage() + cov.start() + # Call our list of functions: invoke the first, with the rest as + # an argument. + calls[0](calls[1:]) + cov.stop() + + # Clean the line data and compare to expected results. + # The filenames are absolute, so keep just the base. + lines = cov.data.line_data() + clean_lines = {} + for f, llist in lines.items(): + if f == __file__: + # ignore this file. + continue + clean_lines[os.path.basename(f)] = llist + self.assertEqual(clean_lines, lines_expected) + + +if sys.version_info >= (2, 5): + class DoctestTest(CoverageTest): + """Tests invoked with doctest should measure properly.""" + + def setUp(self): + super(DoctestTest, self).setUp() + + # Oh, the irony! This test case exists because Python 2.4's + # doctest module doesn't play well with coverage. But nose fixes + # the problem by monkeypatching doctest. I want to undo the + # monkeypatch to be sure I'm getting the doctest module that users + # of coverage will get. Deleting the imported module here is + # enough: when the test imports doctest again, it will get a fresh + # copy without the monkeypatch. + del sys.modules['doctest'] + + def testDoctest(self): + self.check_coverage('''\ + def return_arg_or_void(arg): + """If <arg> is None, return "Void"; otherwise return <arg> + + >>> return_arg_or_void(None) + 'Void' + >>> return_arg_or_void("arg") + 'arg' + >>> return_arg_or_void("None") + 'None' + """ + if arg is None: + return "Void" + else: + return arg + + import doctest, sys + doctest.testmod(sys.modules[__name__]) # we're not __main__ :( + ''', + [1,11,12,14,16,17], "") diff --git a/test/test_parser.py b/test/test_parser.py index 3d5726de..b398044d 100644 --- a/test/test_parser.py +++ b/test/test_parser.py @@ -16,10 +16,10 @@ class ParserTest(CoverageTest): def parse_source(self, text): """Parse `text` as source, and return the `CodeParser` used.""" text = textwrap.dedent(text) - cp = CodeParser(text) + cp = CodeParser(text, exclude="nocover") cp.parse_source() return cp - + def test_exit_counts(self): cp = self.parse_source("""\ # check some basic branch counting @@ -29,7 +29,7 @@ class ParserTest(CoverageTest): return 5 else: return 7 - + class Bar: pass """) @@ -52,4 +52,45 @@ class ParserTest(CoverageTest): self.assertEqual(cp.exit_counts(), { 1: 1, 2:1, 3:1, 4:1, 5:1, 6:1, 7:1, 8:1, 9:1 }) -
\ No newline at end of file + + def test_excluded_classes(self): + cp = self.parse_source("""\ + class Foo: + def __init__(self): + pass + + if 0: # nocover + class Bar: + pass + """) + self.assertEqual(cp.exit_counts(), { + 1:0, 2:1, 3:1 + }) + + def test_missing_branch_to_excluded_code(self): + cp = self.parse_source("""\ + if fooey: + a = 2 + else: # nocover + a = 4 + b = 5 + """) + self.assertEqual(cp.exit_counts(), { 1:1, 2:1, 5:1 }) + cp = self.parse_source("""\ + def foo(): + if fooey: + a = 3 + else: + a = 5 + b = 6 + """) + self.assertEqual(cp.exit_counts(), { 1:1, 2:2, 3:1, 5:1, 6:1 }) + cp = self.parse_source("""\ + def foo(): + if fooey: + a = 3 + else: # nocover + a = 5 + b = 6 + """) + self.assertEqual(cp.exit_counts(), { 1:1, 2:1, 3:1, 6:1 }) diff --git a/test/test_phystokens.py b/test/test_phystokens.py index fa0fa043..0e778510 100644 --- a/test/test_phystokens.py +++ b/test/test_phystokens.py @@ -36,12 +36,10 @@ class PhysTokensTest(CoverageTest): tokenized += text + "\n" # source_token_lines doesn't preserve trailing spaces, so trim all that # before comparing. + source = source.replace('\r\n', '\n') source = re.sub("(?m)[ \t]+$", "", source) tokenized = re.sub("(?m)[ \t]+$", "", tokenized) - #if source != tokenized: - # open("0.py", "w").write(source) - # open("1.py", "w").write(tokenized) - self.assertEqual(source, tokenized) + self.assertMultiLineEqual(source, tokenized) def check_file_tokenization(self, fname): """Use the contents of `fname` for `check_tokenization`.""" @@ -78,7 +76,7 @@ class PhysTokensTest(CoverageTest): def test_stress(self): # Check the tokenization of a stress-test file. - stress = os.path.join(HERE, "stress_phystoken.txt") + stress = os.path.join(HERE, "stress_phystoken.tok") + self.check_file_tokenization(stress) + stress = os.path.join(HERE, "stress_phystoken_dos.tok") self.check_file_tokenization(stress) - -
\ No newline at end of file diff --git a/test/test_process.py b/test/test_process.py new file mode 100644 index 00000000..1f8a9884 --- /dev/null +++ b/test/test_process.py @@ -0,0 +1,245 @@ +"""Tests for process behavior of coverage.py.""" + +import os, sys, textwrap +import coverage + +sys.path.insert(0, os.path.split(__file__)[0]) # Force relative import for Py3k +from coveragetest import CoverageTest + + +class ProcessTest(CoverageTest): + """Tests of the per-process behavior of coverage.py.""" + + def number_of_data_files(self): + """Return the number of coverage data files in this directory.""" + num = 0 + for f in os.listdir('.'): + if f.startswith('.coverage.') or f == '.coverage': + num += 1 + return num + + def testSaveOnExit(self): + self.make_file("mycode.py", """\ + h = "Hello" + w = "world" + """) + + self.assertFalse(os.path.exists(".coverage")) + self.run_command("coverage -x mycode.py") + self.assertTrue(os.path.exists(".coverage")) + + def testEnvironment(self): + # Checks that we can import modules from the test directory at all! + self.make_file("mycode.py", """\ + import covmod1 + import covmodzip1 + a = 1 + print ('done') + """) + + self.assertFalse(os.path.exists(".coverage")) + out = self.run_command("coverage -x mycode.py") + self.assertTrue(os.path.exists(".coverage")) + self.assertEqual(out, 'done\n') + + def testCombineParallelData(self): + self.make_file("b_or_c.py", """\ + import sys + a = 1 + if sys.argv[1] == 'b': + b = 1 + else: + c = 1 + d = 1 + print ('done') + """) + + out = self.run_command("coverage -x -p b_or_c.py b") + self.assertEqual(out, 'done\n') + self.assertFalse(os.path.exists(".coverage")) + + out = self.run_command("coverage -x -p b_or_c.py c") + self.assertEqual(out, 'done\n') + self.assertFalse(os.path.exists(".coverage")) + + # After two -p runs, there should be two .coverage.machine.123 files. + self.assertEqual(self.number_of_data_files(), 2) + + # Combine the parallel coverage data files into .coverage . + self.run_command("coverage -c") + self.assertTrue(os.path.exists(".coverage")) + + # After combining, there should be only the .coverage file. + self.assertEqual(self.number_of_data_files(), 1) + + # Read the coverage file and see that b_or_c.py has all 7 lines + # executed. + data = coverage.CoverageData() + data.read_file(".coverage") + self.assertEqual(data.summary()['b_or_c.py'], 7) + + def test_combine_with_rc(self): + self.make_file("b_or_c.py", """\ + import sys + a = 1 + if sys.argv[1] == 'b': + b = 1 + else: + c = 1 + d = 1 + print ('done') + """) + + self.make_file(".coveragerc", """\ + [run] + parallel = true + """) + + out = self.run_command("coverage run b_or_c.py b") + self.assertEqual(out, 'done\n') + self.assertFalse(os.path.exists(".coverage")) + + out = self.run_command("coverage run b_or_c.py c") + self.assertEqual(out, 'done\n') + self.assertFalse(os.path.exists(".coverage")) + + # After two runs, there should be two .coverage.machine.123 files. + self.assertEqual(self.number_of_data_files(), 2) + + # Combine the parallel coverage data files into .coverage . + self.run_command("coverage combine") + self.assertTrue(os.path.exists(".coverage")) + self.assertTrue(os.path.exists(".coveragerc")) + + # After combining, there should be only the .coverage file. + self.assertEqual(self.number_of_data_files(), 1) + + # Read the coverage file and see that b_or_c.py has all 7 lines + # executed. + data = coverage.CoverageData() + data.read_file(".coverage") + self.assertEqual(data.summary()['b_or_c.py'], 7) + + # Reporting should still work even with the .rc file + out = self.run_command("coverage report") + self.assertMultiLineEqual(out, textwrap.dedent("""\ + Name Stmts Miss Cover + ---------------------------- + b_or_c 7 0 100% + """)) + + def test_missing_source_file(self): + # Check what happens if the source is missing when reporting happens. + self.make_file("fleeting.py", """\ + s = 'goodbye, cruel world!' + """) + + self.run_command("coverage run fleeting.py") + os.remove("fleeting.py") + out = self.run_command("coverage html -d htmlcov") + self.assertRegexpMatches(out, "No source for code: '.*fleeting.py'") + self.assertFalse("Traceback" in out) + + # It happens that the code paths are different for *.py and other + # files, so try again with no extension. + self.make_file("fleeting", """\ + s = 'goodbye, cruel world!' + """) + + self.run_command("coverage run fleeting") + os.remove("fleeting") + status, out = self.run_command_status("coverage html -d htmlcov", 1) + self.assertRegexpMatches(out, "No source for code: '.*fleeting'") + self.assertFalse("Traceback" in out) + self.assertEqual(status, 1) + + def test_running_missing_file(self): + status, out = self.run_command_status("coverage run xyzzy.py", 1) + self.assertRegexpMatches(out, "No file to run: .*xyzzy.py") + self.assertFalse("Traceback" in out) + self.assertEqual(status, 1) + + def test_code_throws(self): + self.make_file("throw.py", """\ + def f1(): + raise Exception("hey!") + + def f2(): + f1() + + f2() + """) + + # The important thing is for "coverage run" and "python" to report the + # same traceback. + status, out = self.run_command_status("coverage run throw.py", 1) + out2 = self.run_command("python throw.py") + self.assertMultiLineEqual(out, out2) + + # But also make sure that the output is what we expect. + self.assertTrue('File "throw.py", line 5, in f2' in out) + self.assertTrue('raise Exception("hey!")' in out) + self.assertFalse('coverage' in out) + self.assertEqual(status, 1) + + def test_code_exits(self): + self.make_file("exit.py", """\ + import sys + def f1(): + print("about to exit..") + sys.exit(17) + + def f2(): + f1() + + f2() + """) + + # The important thing is for "coverage run" and "python" to have the + # same output. No traceback. + status, out = self.run_command_status("coverage run exit.py", 17) + status2, out2 = self.run_command_status("python exit.py", 17) + self.assertMultiLineEqual(out, out2) + self.assertMultiLineEqual(out, "about to exit..\n") + self.assertEqual(status, status2) + self.assertEqual(status, 17) + + if hasattr(os, 'fork'): + def test_fork(self): + self.make_file("fork.py", """\ + import os + + def child(): + print('Child!') + + def main(): + ret = os.fork() + + if ret == 0: + child() + else: + os.waitpid(ret, 0) + + main() + """) + + out = self.run_command("coverage run -p fork.py") + self.assertEqual(out, 'Child!\n') + self.assertFalse(os.path.exists(".coverage")) + + # After running the forking program, there should be two + # .coverage.machine.123 files. + self.assertEqual(self.number_of_data_files(), 2) + + # Combine the parallel coverage data files into .coverage . + self.run_command("coverage -c") + self.assertTrue(os.path.exists(".coverage")) + + # After combining, there should be only the .coverage file. + self.assertEqual(self.number_of_data_files(), 1) + + # Read the coverage file and see that b_or_c.py has all 7 lines + # executed. + data = coverage.CoverageData() + data.read_file(".coverage") + self.assertEqual(data.summary()['fork.py'], 9) diff --git a/test/test_results.py b/test/test_results.py index 33ebe4d7..ef15121c 100644 --- a/test/test_results.py +++ b/test/test_results.py @@ -10,7 +10,7 @@ from coveragetest import CoverageTest class NumbersTest(CoverageTest): """Tests for Coverage.py's numeric measurement summaries.""" - + run_in_temp_dir = False def test_basic(self): @@ -19,7 +19,7 @@ class NumbersTest(CoverageTest): self.assertEqual(n1.n_executed, 180) self.assertEqual(n1.n_missing, 20) self.assertEqual(n1.pc_covered, 90) - + def test_addition(self): n1 = Numbers(n_files=1, n_statements=200, n_missing=20) n2 = Numbers(n_files=1, n_statements=10, n_missing=8) diff --git a/test/test_summary.py b/test/test_summary.py index 36db9969..b41a3e7d 100644 --- a/test/test_summary.py +++ b/test/test_summary.py @@ -20,9 +20,9 @@ class SummaryTest(CoverageTest): def report_from_command(self, cmd): """Return the report from the `cmd`, with some convenience added.""" report = self.run_command(cmd).replace('\\', '/') - self.assert_("error" not in report.lower()) + self.assertFalse("error" in report.lower()) return report - + def line_count(self, report): """How many lines are in `report`?""" self.assertEqual(report.split('\n')[-1], "") @@ -38,52 +38,52 @@ class SummaryTest(CoverageTest): self.assertEqual(out, 'done\n') report = self.report_from_command("coverage -r") - # Name Stmts Exec Cover + # Name Stmts Miss Cover # --------------------------------------------------------------------- - # c:/ned/coverage/trunk/test/modules/covmod1 2 2 100% - # c:/ned/coverage/trunk/test/zipmods.zip/covmodzip1 2 2 100% - # mycode 4 4 100% + # c:/ned/coverage/trunk/test/modules/covmod1 2 0 100% + # c:/ned/coverage/trunk/test/zipmods.zip/covmodzip1 2 0 100% + # mycode 4 0 100% # --------------------------------------------------------------------- - # TOTAL 8 8 100% + # TOTAL 8 0 100% - self.assert_("/coverage/__init__/" not in report) - self.assert_("/test/modules/covmod1 " in report) - self.assert_("/test/zipmods.zip/covmodzip1 " in report) - self.assert_("mycode " in report) - self.assertEqual(self.last_line_squeezed(report), "TOTAL 8 8 100%") + self.assertFalse("/coverage/__init__/" in report) + self.assertTrue("/test/modules/covmod1 " in report) + self.assertTrue("/test/zipmods.zip/covmodzip1 " in report) + self.assertTrue("mycode " in report) + self.assertEqual(self.last_line_squeezed(report), "TOTAL 8 0 100%") def test_report_just_one(self): # Try reporting just one module self.run_command("coverage -x mycode.py") report = self.report_from_command("coverage -r mycode.py") - # Name Stmts Exec Cover + # Name Stmts Miss Cover # ---------------------------- - # mycode 4 4 100% + # mycode 4 0 100% self.assertEqual(self.line_count(report), 3) - self.assert_("/coverage/" not in report) - self.assert_("/test/modules/covmod1 " not in report) - self.assert_("/test/zipmods.zip/covmodzip1 " not in report) - self.assert_("mycode " in report) - self.assertEqual(self.last_line_squeezed(report), "mycode 4 4 100%") + self.assertFalse("/coverage/" in report) + self.assertFalse("/test/modules/covmod1 " in report) + self.assertFalse("/test/zipmods.zip/covmodzip1 " in report) + self.assertTrue("mycode " in report) + self.assertEqual(self.last_line_squeezed(report), "mycode 4 0 100%") def test_report_omitting(self): # Try reporting while omitting some modules prefix = os.path.split(__file__)[0] self.run_command("coverage -x mycode.py") report = self.report_from_command("coverage -r -o %s" % prefix) - - # Name Stmts Exec Cover + + # Name Stmts Miss Cover # ---------------------------- - # mycode 4 4 100% + # mycode 4 0 100% self.assertEqual(self.line_count(report), 3) - self.assert_("/coverage/" not in report) - self.assert_("/test/modules/covmod1 " not in report) - self.assert_("/test/zipmods.zip/covmodzip1 " not in report) - self.assert_("mycode " in report) - self.assertEqual(self.last_line_squeezed(report), "mycode 4 4 100%") + self.assertFalse("/coverage/" in report) + self.assertFalse("/test/modules/covmod1 " in report) + self.assertFalse("/test/zipmods.zip/covmodzip1 " in report) + self.assertTrue("mycode " in report) + self.assertEqual(self.last_line_squeezed(report), "mycode 4 0 100%") def test_report_branches(self): self.make_file("mybranch.py", """\ @@ -97,11 +97,11 @@ class SummaryTest(CoverageTest): self.assertEqual(out, 'x\n') report = self.report_from_command("coverage report") - # Name Stmts Exec Branch BrExec Cover + # Name Stmts Miss Branch BrPart Cover # -------------------------------------------- - # mybranch 5 5 2 1 85% + # mybranch 5 0 2 1 85% self.assertEqual(self.line_count(report), 3) - self.assert_("mybranch " in report) + self.assertTrue("mybranch " in report) self.assertEqual(self.last_line_squeezed(report), - "mybranch 5 5 2 1 85%") + "mybranch 5 0 2 1 85%") diff --git a/test/test_templite.py b/test/test_templite.py index 8cb25865..93e9183d 100644 --- a/test/test_templite.py +++ b/test/test_templite.py @@ -9,9 +9,9 @@ import unittest class AnyOldObject(object): """Simple testing object. - + Use keyword arguments in the constructor to set attributes on the object. - + """ def __init__(self, **attrs): for n, v in attrs.items(): @@ -45,7 +45,7 @@ class TempliteTest(unittest.TestCase): 'second': lambda x: x[1], } self.try_render("Hello, {{name|upper}}!", data, "Hello, NED!") - + # Pipes can be concatenated. self.try_render("Hello, {{name|upper|second}}!", data, "Hello, E!") @@ -55,7 +55,7 @@ class TempliteTest(unittest.TestCase): 'upper': lambda x: x.upper(), 'punct': '!', } - + template = Templite("This is {{name|upper}}{{punct}}", globs) self.assertEqual(template.render({'name':'Ned'}), "This is NED!") self.assertEqual(template.render({'name':'Ben'}), "This is BEN!") @@ -67,7 +67,7 @@ class TempliteTest(unittest.TestCase): obj2 = AnyOldObject(obj=obj, b="Bee") self.try_render("{{obj2.obj.a}} {{obj2.b}}", locals(), "Ay Bee") - + def test_member_function(self): # Variables' member functions can be used, as long as they are nullary. class WithMemberFns(AnyOldObject): @@ -97,7 +97,7 @@ class TempliteTest(unittest.TestCase): l = l[:] l.reverse() return l - + self.try_render( "Look: {% for n in nums|rev %}{{n}}, {% endfor %}done.", locals(), @@ -117,7 +117,7 @@ class TempliteTest(unittest.TestCase): {'nums':[1,2,3]}, "Look: \n\n1, \n\n2, \n\n3, \ndone." ) - + def test_multiple_loops(self): self.try_render( "{% for n in nums %}{{n}}{% endfor %} and " @@ -191,6 +191,14 @@ class TempliteTest(unittest.TestCase): "@a0b0c0a1b1c1a2b2c2!" ) - -if __name__ == '__main__': - unittest.main() + def test_exception_during_evaluation(self): + # TypeError: Couldn't evaluate {{ foo.bar.baz }}: + # 'NoneType' object is unsubscriptable + self.assertRaises(TypeError, self.try_render, + "Hey {{foo.bar.baz}} there", {'foo': None}, "Hey ??? there" + ) + + def test_bogus_tag_syntax(self): + self.assertRaises(SyntaxError, self.try_render, + "Huh: {% bogus %}!!{% endbogus %}??", {}, "" + ) diff --git a/test/test_testing.py b/test/test_testing.py index 1e22202a..9bbb7cca 100644 --- a/test/test_testing.py +++ b/test/test_testing.py @@ -2,29 +2,110 @@ import os, sys sys.path.insert(0, os.path.split(__file__)[0]) # Force relative import for Py3k +from backunittest import TestCase from coveragetest import CoverageTest from coverage.backward import set # pylint: disable-msg=W0622 -class TestingTest(CoverageTest): - """Tests of helper methods on CoverageTest.""" +class TestingTest(TestCase): + """Tests of helper methods on `backunittest.TestCase`.""" run_in_temp_dir = False - def test_assert_equal_sets(self): - self.assert_equal_sets(set(), set()) - self.assert_equal_sets(set([1,2,3]), set([3,1,2])) - self.assertRaises(AssertionError, self.assert_equal_sets, + def please_raise(self, exc, msg): + """Raise an exception for testing assertRaisesRegexp.""" + raise exc(msg) + + def please_succeed(self): + """A simple successful method for testing assertRaisesRegexp.""" + return "All is well" + + def test_assert_same_elements(self): + self.assertSameElements(set(), set()) + self.assertSameElements(set([1,2,3]), set([3,1,2])) + self.assertRaises(AssertionError, self.assertSameElements, set([1,2,3]), set() ) - self.assertRaises(AssertionError, self.assert_equal_sets, + self.assertRaises(AssertionError, self.assertSameElements, set([1,2,3]), set([4,5,6]) ) - def test_assert_matches(self): - self.assert_matches("hello", "hel*o") - self.assert_matches("Oh, hello there!", "hel*o") - self.assertRaises(AssertionError, self.assert_matches, + def test_assert_regexp_matches(self): + self.assertRegexpMatches("hello", "hel*o") + self.assertRegexpMatches("Oh, hello there!", "hel*o") + self.assertRaises(AssertionError, self.assertRegexpMatches, "hello there", "^hello$" ) + def test_assert_multiline_equal(self): + self.assertMultiLineEqual("hello", "hello") + self.assertRaises(AssertionError, self.assertMultiLineEqual, + "hello there", "Hello there" + ) + self.assertRaises(AssertionError, self.assertMultiLineEqual, + "hello\nthere", "hello\nThere" + ) + # With messages also. + self.assertMultiLineEqual("hi", "hi", "it's ok") + self.assertRaisesRegexp( + AssertionError, "my message", + self.assertMultiLineEqual, "xyz", "abc", "my message" + ) + + def test_assert_raises_regexp(self): + # Raising the right error with the right message passes. + self.assertRaisesRegexp( + ZeroDivisionError, "Wow! Zero!", + self.please_raise, ZeroDivisionError, "Wow! Zero!" + ) + # Raising the right error with a match passes. + self.assertRaisesRegexp( + ZeroDivisionError, "Zero", + self.please_raise, ZeroDivisionError, "Wow! Zero!" + ) + # Raising the right error with a mismatch fails. + self.assertRaises(AssertionError, + self.assertRaisesRegexp, ZeroDivisionError, "XYZ", + self.please_raise, ZeroDivisionError, "Wow! Zero!" + ) + # Raising the right error with a mismatch fails. + self.assertRaises(AssertionError, + self.assertRaisesRegexp, ZeroDivisionError, "XYZ", + self.please_raise, ZeroDivisionError, "Wow! Zero!" + ) + # Raising the wrong error raises the error itself. + self.assertRaises(ZeroDivisionError, + self.assertRaisesRegexp, IOError, "Wow! Zero!", + self.please_raise, ZeroDivisionError, "Wow! Zero!" + ) + # Raising no error fails. + self.assertRaises(AssertionError, + self.assertRaisesRegexp, ZeroDivisionError, "XYZ", + self.please_succeed + ) + + def test_assert_true(self): + self.assertTrue(True) + self.assertRaises(AssertionError, self.assertTrue, False) + + def test_assert_false(self): + self.assertFalse(False) + self.assertRaises(AssertionError, self.assertFalse, True) + + +class CoverageTestTest(CoverageTest): + """Test the methods in `CoverageTest`.""" + + def test_make_file(self): + # A simple file. + self.make_file("fooey.boo", "Hello there") + self.assertEqual(open("fooey.boo").read(), "Hello there") + # A file in a sub-directory + self.make_file("sub/another.txt", "Another") + self.assertEqual(open("sub/another.txt").read(), "Another") + # A second file in that sub-directory + self.make_file("sub/second.txt", "Second") + self.assertEqual(open("sub/second.txt").read(), "Second") + # A deeper directory + self.make_file("sub/deeper/evenmore/third.txt", "Third") + self.assertEqual(open("sub/deeper/evenmore/third.txt").read(), "Third") |