diff options
303 files changed, 19632 insertions, 13948 deletions
@@ -9,12 +9,14 @@ syntax: glob *.bak .coverage .coverage.* +coverage.xml .metacov .metacov.* *.swp # Stuff generated by editors. .idea/ +.vimtags # Stuff in the root. build @@ -33,3 +35,6 @@ zipmods.zip _build _spell sample_html_beta + +# Stuff in the ci directory. +*.token @@ -41,3 +41,11 @@ af20c6543c226fbc9deeba4a6d4114641374734a coverage-3.6 eec8e928880df1beafdf7d4bea87f784375b35d7 coverage-4.0a3 989f42e9eb11b5864e5746cea675d95ff4cf645d coverage-4.0a4 00a61f028fcb000ae2cbc77bfbe0ac4cfacfab65 coverage-4.0a5 +90debbdf56495e6c0422ceb5f53f8550d2ad86bf coverage-4.0a6 +825fb6db681e9cfb227f09adbee50b881a3380e2 coverage-4.0b1 +9ab0815227d29c03775f7f7ad6dba1b0d93db777 coverage-4.0b2 +82b0c5a85a7eb2156eebaa6b81b1f62fb4fe51b5 coverage-4.0b3 +3c3e507a247eb35251083b9528a99e50831c960f coverage-4.0 +8e727dc12de10fb8a302b04a8f2af3e00587889e coverage-4.0.1 +7428dab9307da4660878436fe71b696ca2048cf2 coverage-4.0.2 +5ab728b8fd55bd78352012a15a6541fa73dd9e2c coverage-4.0.3 diff --git a/.travis.yml b/.travis.yml index 75b86b0a..f3c93a55 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,27 +3,27 @@ language: python +sudo: false + python: - - 2.6 - 2.7 - - 3.3 - - 3.4 - - pypy + +env: + - TOXENV=py26 + - TOXENV=py27 + - TOXENV=py33 + - TOXENV=py34 + - TOXENV=py35 + - TOXENV=pypy + - TOXENV=py27 COVERAGE_COVERAGE=yes sudo: false install: - - if [[ $TRAVIS_PYTHON_VERSION == '2.6' ]]; then pip install unittest2; fi - - python setup.py clean develop - -before_script: - - pwd - - ls -l - - coverage debug sys - - if [[ $TRAVIS_PYTHON_VERSION == 'pypy' ]]; then export COVERAGE_NO_EXTENSION=1; fi + - pip install -r requirements/tox.pip script: - - python igor.py zip_mods install_egg - - python igor.py test_with_tracer c - - python igor.py remove_extension - - python igor.py test_with_tracer py + - tox + - if [ $COVERAGE_COVERAGE == 'yes' ]; then python igor.py combine_html; fi + - if [ $COVERAGE_COVERAGE == 'yes' ]; then pip install codecov; fi + - if [ $COVERAGE_COVERAGE == 'yes' ]; then codecov; fi diff --git a/AUTHORS.txt b/AUTHORS.txt index e23ae2a1..de3d6502 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -5,7 +5,9 @@ Other contributions have been made by: Adi Roiban Alex Gaynor +Alexander Todorov Anthony Sottile +Arcadiy Ivanov Ben Finney Bill Hart Brandon Rhodes @@ -25,6 +27,7 @@ David Christian David Stanek Detlev Offenbach Devin Jeanpierre +Dmitry Trofimov Eduardo Schettino Edward Loper Geoff Bache @@ -33,6 +36,7 @@ George Song Greg Rogers Guillaume Chazarain Imri Goldberg +Ionel Cristian Mărieș JT Olds Jessamyn Smith Jon Chappell @@ -56,6 +60,10 @@ Ross Lawley Sandra Martocchia Sigve Tjora Stan Hu +Stefan Behnel Steve Leonard +Steve Peak +Ted Wexler Titus Brown +Yury Selivanov Zooko Wilcox-O'Hearn diff --git a/CHANGES.txt b/CHANGES.rst index 9f1823e2..65424168 100644 --- a/CHANGES.txt +++ b/CHANGES.rst @@ -1,10 +1,258 @@ ------------------------------- +.. Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +.. For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +============================== Change history for Coverage.py +============================== + + +Version 4.1, in progress +------------------------ + +- Pragmas to disable coverage measurement can now be used on decorator lines, + and they will apply to the entire function or class being decorated. This + implements the feature requested in `issue 131`_. + +.. _issue 131: https://bitbucket.org/ned/coveragepy/issues/131/pragma-on-a-decorator-line-should-affect + + +Version 4.0.3, 24 November 2015 +------------------------------- + +- Fixed a mysterious problem that manifested in different ways: sometimes + hanging the process (`issue 420`_), sometimes making database connections + fail (`issue 445`_). + +- The XML report now has correct ``<source>`` elements when using a + ``--source=`` option somewhere besides the current directory. This fixes + `issue 439`_. Thanks, Arcady Ivanov. + +- Fixed an unusual edge case of detecting source encodings, described in + `issue 443`_. + +- Help messages that mention the command to use now properly use the actual + command name, which might be different than "coverage". Thanks to Ben Finney, + this closes `issue 438`_. + +.. _issue 420: https://bitbucket.org/ned/coveragepy/issues/420/coverage-40-hangs-indefinitely-on-python27 +.. _issue 438: https://bitbucket.org/ned/coveragepy/issues/438/parameterise-coverage-command-name +.. _issue 439: https://bitbucket.org/ned/coveragepy/issues/439/incorrect-cobertura-file-sources-generated +.. _issue 443: https://bitbucket.org/ned/coveragepy/issues/443/coverage-gets-confused-when-encoding +.. _issue 445: https://bitbucket.org/ned/coveragepy/issues/445/django-app-cannot-connect-to-cassandra + + +Version 4.0.2 --- 4 November 2015 +--------------------------------- + +- More work on supporting unusually encoded source. Fixed `issue 431`_. + +- Files or directories with non-ASCII characters are now handled properly, + fixing `issue 432`_. + +- Setting a trace function with sys.settrace was broken by a change in 4.0.1, + as reported in `issue 436`_. This is now fixed. + +- Officially support PyPy 4.0, which required no changes, just updates to the + docs. + +.. _issue 431: https://bitbucket.org/ned/coveragepy/issues/431/couldnt-parse-python-file-with-cp1252 +.. _issue 432: https://bitbucket.org/ned/coveragepy/issues/432/path-with-unicode-characters-various +.. _issue 436: https://bitbucket.org/ned/coveragepy/issues/436/disabled-coverage-ctracer-may-rise-from + + +Version 4.0.1 --- 13 October 2015 +--------------------------------- + +- When combining data files, unreadable files will now generate a warning + instead of failing the command. This is more in line with the older + coverage.py v3.7.1 behavior, which silently ignored unreadable files. + Prompted by `issue 418`_. + +- The --skip-covered option would skip reporting on 100% covered files, but + also skipped them when calculating total coverage. This was wrong, it should + only remove lines from the report, not change the final answer. This is now + fixed, closing `issue 423`_. + +- In 4.0, the data file recorded a summary of the system on which it was run. + Combined data files would keep all of those summaries. This could lead to + enormous data files consisting of mostly repetitive useless information. That + summary is now gone, fixing `issue 415`_. If you want summary information, + get in touch, and we'll figure out a better way to do it. + +- Test suites that mocked os.path.exists would experience strange failures, due + to coverage.py using their mock inadvertently. This is now fixed, closing + `issue 416`_. + +- Importing a ``__init__`` module explicitly would lead to an error: + ``AttributeError: 'module' object has no attribute '__path__'``, as reported + in `issue 410`_. This is now fixed. + +- Code that uses ``sys.settrace(sys.gettrace())`` used to incur a more than 2x + speed penalty. Now there's no penalty at all. Fixes `issue 397`_. + +- Pyexpat C code will no longer be recorded as a source file, fixing + `issue 419`_. + +- The source kit now contains all of the files needed to have a complete source + tree, re-fixing `issue 137`_ and closing `issue 281`_. + +.. _issue 281: https://bitbucket.org/ned/coveragepy/issues/281/supply-scripts-for-testing-in-the +.. _issue 397: https://bitbucket.org/ned/coveragepy/issues/397/stopping-and-resuming-coverage-with +.. _issue 410: https://bitbucket.org/ned/coveragepy/issues/410/attributeerror-module-object-has-no +.. _issue 415: https://bitbucket.org/ned/coveragepy/issues/415/repeated-coveragedataupdates-cause +.. _issue 416: https://bitbucket.org/ned/coveragepy/issues/416/mocking-ospathexists-causes-failures +.. _issue 418: https://bitbucket.org/ned/coveragepy/issues/418/json-parse-error +.. _issue 419: https://bitbucket.org/ned/coveragepy/issues/419/nosource-no-source-for-code-path-to-c +.. _issue 423: https://bitbucket.org/ned/coveragepy/issues/423/skip_covered-changes-reported-total + + +Version 4.0 --- 20 September 2015 +--------------------------------- + +No changes from 4.0b3 + + +Version 4.0b3 --- 7 September 2015 +---------------------------------- + +- Reporting on an unmeasured file would fail with a traceback. This is now + fixed, closing `issue 403`_. + +- The Jenkins ShiningPanda plugin looks for an obsolete file name to find the + HTML reports to publish, so it was failing under coverage.py 4.0. Now we + create that file if we are running under Jenkins, to keep things working + smoothly. `issue 404`_. + +- Kits used to include tests and docs, but didn't install them anywhere, or + provide all of the supporting tools to make them useful. Kits no longer + include tests and docs. If you were using them from the older packages, get + in touch and help me understand how. + +.. _issue 403: https://bitbucket.org/ned/coveragepy/issues/403/hasherupdate-fails-with-typeerror-nonetype +.. _issue 404: https://bitbucket.org/ned/coveragepy/issues/404/shiningpanda-jenkins-plugin-cant-find-html + + + +Version 4.0b2 --- 22 August 2015 +-------------------------------- + +- 4.0b1 broke --append creating new data files. This is now fixed, closing + `issue 392`_. + +- ``py.test --cov`` can write empty data, then touch files due to ``--source``, + which made coverage.py mistakenly force the data file to record lines instead + of arcs. This would lead to a "Can't combine line data with arc data" error + message. This is now fixed, and changed some method names in the + CoverageData interface. Fixes `issue 399`_. + +- `CoverageData.read_fileobj` and `CoverageData.write_fileobj` replace the + `.read` and `.write` methods, and are now properly inverses of each other. + +- When using ``report --skip-covered``, a message will now be included in the + report output indicating how many files were skipped, and if all files are + skipped, coverage.py won't accidentally scold you for having no data to + report. Thanks, Krystian Kichewko. + +- A new conversion utility has been added: ``python -m coverage.pickle2json`` + will convert v3.x pickle data files to v4.x JSON data files. Thanks, + Alexander Todorov. Closes `issue 395`_. + +- A new version identifier is available, `coverage.version_info`, a plain tuple + of values similar to `sys.version_info`_. + +.. _issue 392: https://bitbucket.org/ned/coveragepy/issues/392/run-append-doesnt-create-coverage-file +.. _issue 395: https://bitbucket.org/ned/coveragepy/issues/395/rfe-read-pickled-files-as-well-for +.. _issue 399: https://bitbucket.org/ned/coveragepy/issues/399/coverageexception-cant-combine-line-data +.. _sys.version_info: https://docs.python.org/3/library/sys.html#sys.version_info + + +Version 4.0b1 --- 2 August 2015 +------------------------------- + +- Coverage.py is now licensed under the Apache 2.0 license. See NOTICE.txt for + details. Closes `issue 313`_. + +- The data storage has been completely revamped. The data file is now + JSON-based instead of a pickle, closing `issue 236`_. The `CoverageData` + class is now a public supported documented API to the data file. + +- A new configuration option, ``[run] note``, lets you set a note that will be + stored in the `runs` section of the data file. You can use this to annotate + the data file with any information you like. + +- Unrecognized configuration options will now print an error message and stop + coverage.py. This should help prevent configuration mistakes from passing + silently. Finishes `issue 386`_. + +- In parallel mode, ``coverage erase`` will now delete all of the data files, + fixing `issue 262`_. + +- Coverage.py now accepts a directory name for ``coverage run`` and will run a + ``__main__.py`` found there, just like Python will. Fixes `issue 252`_. + Thanks, Dmitry Trofimov. + +- The XML report now includes a ``missing-branches`` attribute. Thanks, Steve + Peak. This is not a part of the Cobertura DTD, so the XML report no longer + references the DTD. + +- Missing branches in the HTML report now have a bit more information in the + right-hand annotations. Hopefully this will make their meaning clearer. + +- All the reporting functions now behave the same if no data had been + collected, exiting with a status code of 1. Fixed ``fail_under`` to be + applied even when the report is empty. Thanks, Ionel Cristian Mărieș. + +- Plugins are now initialized differently. Instead of looking for a class + called ``Plugin``, coverage.py looks for a function called ``coverage_init``. + +- A file-tracing plugin can now ask to have built-in Python reporting by + returning `"python"` from its `file_reporter()` method. + +- Code that was executed with `exec` would be mis-attributed to the file that + called it. This is now fixed, closing `issue 380`_. + +- The ability to use item access on `Coverage.config` (introduced in 4.0a2) has + been changed to a more explicit `Coverage.get_option` and + `Coverage.set_option` API. + +- The ``Coverage.use_cache`` method is no longer supported. + +- The private method ``Coverage._harvest_data`` is now called + ``Coverage.get_data``, and returns the ``CoverageData`` containing the + collected data. + +- The project is consistently referred to as "coverage.py" throughout the code + and the documentation, closing `issue 275`_. + +- Combining data files with an explicit configuration file was broken in 4.0a6, + but now works again, closing `issue 385`_. + +- ``coverage combine`` now accepts files as well as directories. + +- The speed is back to 3.7.1 levels, after having slowed down due to plugin + support, finishing up `issue 387`_. + +.. _issue 236: https://bitbucket.org/ned/coveragepy/issues/236/pickles-are-bad-and-you-should-feel-bad +.. _issue 252: https://bitbucket.org/ned/coveragepy/issues/252/coverage-wont-run-a-program-with +.. _issue 262: https://bitbucket.org/ned/coveragepy/issues/262/when-parallel-true-erase-should-erase-all +.. _issue 275: https://bitbucket.org/ned/coveragepy/issues/275/refer-consistently-to-project-as-coverage +.. _issue 313: https://bitbucket.org/ned/coveragepy/issues/313/add-license-file-containing-2-3-or-4 +.. _issue 380: https://bitbucket.org/ned/coveragepy/issues/380/code-executed-by-exec-excluded-from +.. _issue 385: https://bitbucket.org/ned/coveragepy/issues/385/coverage-combine-doesnt-work-with-rcfile +.. _issue 386: https://bitbucket.org/ned/coveragepy/issues/386/error-on-unrecognised-configuration +.. _issue 387: https://bitbucket.org/ned/coveragepy/issues/387/performance-degradation-from-371-to-40 + +.. 40 issues closed in 4.0 below here + + +Version 4.0a6 --- 21 June 2015 ------------------------------ +- Python 3.5b2 and PyPy 2.6.0 are supported. -Latest ------- +- The original module-level function interface to coverage.py is no longer + supported. You must now create a ``coverage.Coverage`` object, and use + methods on it. - The ``coverage combine`` command now accepts any number of directories as arguments, and will combine all the data files from those directories. This @@ -18,10 +266,16 @@ Latest persisted in pursuing this despite Ned's pessimism. Fixes `issue 308`_ and `issue 324`_. +- The COVERAGE_DEBUG environment variable can be used to set the ``[run] debug`` + configuration option to control what internal operations are logged. + - HTML reports were truncated at formfeed characters. This is now fixed (`issue 360`_). It's always fun when the problem is due to a `bug in the Python standard library <http://bugs.python.org/issue19035>`_. +- Files with incorrect encoding declaration comments are no longer ignored by + the reporting commands, fixing `issue 351`_. + - HTML reports now include a timestamp in the footer, closing `issue 299`_. Thanks, Conrad Ho. @@ -33,14 +287,23 @@ Latest - The ``coverage annotate`` command now handles non-ASCII characters properly, closing `issue 363`_. Thanks, Leonardo Pistone. +- Drive letters on Windows were not normalized correctly, now they are. Thanks, + Ionel Cristian Mărieș. + +- Plugin support had some bugs fixed, closing `issue 374`_ and `issue 375`_. + Thanks, Stefan Behnel. + .. _issue 299: https://bitbucket.org/ned/coveragepy/issue/299/inserted-created-on-yyyy-mm-dd-hh-mm-in .. _issue 308: https://bitbucket.org/ned/coveragepy/issue/308/yield-lambda-branch-coverage .. _issue 324: https://bitbucket.org/ned/coveragepy/issue/324/yield-in-loop-confuses-branch-coverage +.. _issue 351: https://bitbucket.org/ned/coveragepy/issue/351/files-with-incorrect-encoding-are-ignored .. _issue 354: https://bitbucket.org/ned/coveragepy/issue/354/coverage-combine-should-take-a-list-of .. _issue 359: https://bitbucket.org/ned/coveragepy/issue/359/xml-report-chunk-error .. _issue 360: https://bitbucket.org/ned/coveragepy/issue/360/html-reports-get-confused-by-l-in-the-code .. _issue 361: https://bitbucket.org/ned/coveragepy/issue/361/use-double-quotes-in-html-output-to .. _issue 363: https://bitbucket.org/ned/coveragepy/issue/363/annotate-command-hits-unicode-happy-fun +.. _issue 374: https://bitbucket.org/ned/coveragepy/issue/374/c-tracer-lookups-fail-in +.. _issue 375: https://bitbucket.org/ned/coveragepy/issue/375/ctracer_handle_return-reads-byte-code Version 4.0a5 --- 16 February 2015 @@ -62,7 +325,7 @@ Version 4.0a5 --- 16 February 2015 Eduardo Schettino. Currently, this does not work on Windows. - A new warning is possible, if a desired file isn't measured because it was - imported before coverage was started (`issue 353`_). + imported before coverage.py was started (`issue 353`_). - The `coverage.process_startup` function now will start coverage measurement only once, no matter how many times it is called. This fixes problems due @@ -140,7 +403,7 @@ Version 4.0a2 --- 14 January 2015 they are 100% covered, closing `issue 315`_. - You can now specify the ``--fail-under`` option in the ``.coveragerc`` file - as the ``[report] fail_under`` options. This closes `issue 314`_. + as the ``[report] fail_under`` option. This closes `issue 314`_. - The ``COVERAGE_OPTIONS`` environment variable is no longer supported. It was a hack for ``--timid`` before configuration files were available. @@ -159,8 +422,8 @@ Version 4.0a2 --- 14 January 2015 - The ``--debug`` switch can now be used on any command. -- You can now programmatically adjust the configuration of coverage by setting - items on `Coverage.config` after construction. +- You can now programmatically adjust the configuration of coverage.py by + setting items on `Coverage.config` after construction. - A module run with ``-m`` can be used as the argument to ``--source``, fixing `issue 328`_. Thanks, Buck Evan. @@ -171,7 +434,7 @@ Version 4.0a2 --- 14 January 2015 - Made some PyPy-specific tweaks to improve speed under PyPy. Thanks, Alex Gaynor. -- In some cases, with a source file missing a final newline, coverage would +- In some cases, with a source file missing a final newline, coverage.py would count statements incorrectly. This is now fixed, closing `issue 293`_. - The status.dat file that HTML reports use to avoid re-creating files that @@ -204,8 +467,8 @@ Version 4.0a1 --- 27 September 2014 prefixed with "coverage:", so the ``[run]`` options will be read from the ``[coverage:run]`` section of setup.cfg. Finishes `issue 304`_. -- The ``report`` command can now show missing branches when reporting on branch - coverage. Thanks, Steve Leonard. Closes `issue 230`_. +- The ``report -m`` command can now show missing branches when reporting on + branch coverage. Thanks, Steve Leonard. Closes `issue 230`_. - The XML report now contains a <source> element, fixing `issue 94`_. Thanks Stan Hu. @@ -217,7 +480,7 @@ Version 4.0a1 --- 27 September 2014 preventing paradoxical results, fixing `issue 284`_. - The XML report will now create the output directory if need be, fixing - `issue 285`_. Thanks Chris Rose. + `issue 285`_. Thanks, Chris Rose. - HTML reports no longer raise UnicodeDecodeError if a Python file has undecodable characters, fixing `issue 303`_ and `issue 331`_. @@ -263,9 +526,9 @@ Version 3.7 --- 6 October 2013 - Running code with ``coverage run -m`` now behaves more like Python does, setting sys.path properly, which fixes `issue 207`_ and `issue 242`_. -- Coverage can now run .pyc files directly, closing `issue 264`_. +- Coverage.py can now run .pyc files directly, closing `issue 264`_. -- Coverage properly supports .pyw files, fixing `issue 261`_. +- Coverage.py properly supports .pyw files, fixing `issue 261`_. - Omitting files within a tree specified with the ``source`` option would cause them to be incorrectly marked as unexecuted, as described in @@ -281,9 +544,10 @@ Version 3.7 --- 6 October 2013 - Trying to create an XML report with no files to report on, would cause a ZeroDivideError, but no longer does, fixing `issue 250`_. -- When running a threaded program under the Python tracer, coverage no longer - issues a spurious warning about the trace function changing: "Trace function - changed, measurement is likely wrong: None." This fixes `issue 164`_. +- When running a threaded program under the Python tracer, coverage.py no + longer issues a spurious warning about the trace function changing: "Trace + function changed, measurement is likely wrong: None." This fixes `issue + 164`_. - Static files necessary for HTML reports are found in system-installed places, to ease OS-level packaging of coverage.py. Closes `issue 259`_. @@ -340,10 +604,9 @@ Version 3.6b2 --- 23 December 2012 - ``debug sys`` now shows the configuration file path that was read. - If an oddly-behaved package claims that code came from an empty-string - filename, coverage.py no longer associates it with the directory name, + file name, coverage.py no longer associates it with the directory name, fixing `issue 221`_. -.. _issue 80: https://bitbucket.org/ned/coveragepy/issue/80/is-there-a-duck-typing-way-to-know-we-cant .. _issue 221: https://bitbucket.org/ned/coveragepy/issue/221/coveragepy-incompatible-with-pyratemp @@ -372,10 +635,10 @@ Version 3.6b1 --- 28 November 2012 - Configuration files now support substitution of environment variables, using syntax like ``${WORD}``. Closes `issue 97`_. -- Embarrassingly, the `[xml] output=` setting in the .coveragerc file simply +- Embarrassingly, the ``[xml] output=`` setting in the .coveragerc file simply didn't work. Now it does. -- The XML report now consistently uses filenames for the filename attribute, +- The XML report now consistently uses file names for the file name attribute, rather than sometimes using module names. Fixes `issue 67`_. Thanks, Marcus Cobden. @@ -416,8 +679,9 @@ Version 3.6b1 --- 28 November 2012 - Jython files now work with the ``--source`` option, fixing `issue 100`_. -- Running coverage under a debugger is unlikely to work, but it shouldn't fail - with "TypeError: 'NoneType' object is not iterable". Fixes `issue 201`_. +- Running coverage.py under a debugger is unlikely to work, but it shouldn't + fail with "TypeError: 'NoneType' object is not iterable". Fixes `issue + 201`_. - On some Linux distributions, when installed with the OS package manager, coverage.py would report its own code as part of the results. Now it won't, @@ -499,7 +763,6 @@ Version 3.5.3 --- 29 September 2012 .. _tox: http://tox.readthedocs.org/ - Version 3.5.2 --- 4 May 2012 ---------------------------- @@ -513,7 +776,7 @@ Version 3.5.2b1 --- 29 April 2012 the page are color-coded to the source lines they affect. - Custom CSS can be applied to the HTML report by specifying a CSS file as - the extra_css configuration value in the [html] section. + the ``extra_css`` configuration value in the ``[html]`` section. - Source files with custom encodings declared in a comment at the top are now properly handled during reporting on Python 2. Python 3 always handled them @@ -523,7 +786,7 @@ Version 3.5.2b1 --- 29 April 2012 option, fixing `issue 168`_. - If a file doesn't parse properly as Python, we don't report it as an error - if the filename seems like maybe it wasn't meant to be Python. This is a + if the file name seems like maybe it wasn't meant to be Python. This is a pragmatic fix for `issue 82`_. - The ``-m`` switch on ``coverage report``, which includes missing line numbers @@ -561,10 +824,10 @@ Version 3.5.1 --- 23 September 2011 Version 3.5.1b1 --- 28 August 2011 ---------------------------------- -- When combining data files from parallel runs, you can now instruct coverage - about which directories are equivalent on different machines. A ``[paths]`` - section in the configuration file lists paths that are to be considered - equivalent. Finishes `issue 17`_. +- When combining data files from parallel runs, you can now instruct + coverage.py about which directories are equivalent on different machines. A + ``[paths]`` section in the configuration file lists paths that are to be + considered equivalent. Finishes `issue 17`_. - for-else constructs are understood better, and don't cause erroneous partial branch warnings. Fixes `issue 122`_. @@ -586,7 +849,7 @@ Version 3.5.1b1 --- 28 August 2011 - In order to help the core developers measure the test coverage of the standard library, Brandon Rhodes devised an aggressive hack to trick Python - into running some coverage code before anything else in the process. + into running some coverage.py code before anything else in the process. See the coverage/fullcoverage directory if you are interested. .. _issue 17: http://bitbucket.org/ned/coveragepy/issue/17/support-combining-coverage-data-from @@ -733,7 +996,7 @@ Version 3.4b1 --- 21 August 2010 file patterns rather than file prefixes, closing `issue 34`_ and `issue 36`_. - BACKWARD INCOMPATIBILITY: the `omit_prefixes` argument is gone throughout - coverage.py, replaced with `omit`, a list of filename patterns suitable for + coverage.py, replaced with `omit`, a list of file name patterns suitable for `fnmatch`. A parallel argument `include` controls what files are included. - The run command now has a ``--source`` switch, a list of directories or @@ -774,7 +1037,7 @@ Version 3.4b1 --- 21 August 2010 and parent processes. Use ``coverage run -p`` to get two data files that can be combined with ``coverage combine``. Fixes `issue 56`_. -- Coverage is now runnable as a module: ``python -m coverage``. Thanks, +- Coverage.py is now runnable as a module: ``python -m coverage``. Thanks, Brett Cannon. - When measuring code running in a virtualenv, most of the system library was @@ -783,7 +1046,7 @@ Version 3.4b1 --- 21 August 2010 - Doctest text files are no longer recorded in the coverage data, since they can't be reported anyway. Fixes `issue 52`_ and `issue 61`_. -- Jinja HTML templates compile into Python code using the HTML filename, +- Jinja HTML templates compile into Python code using the HTML file name, which confused coverage.py. Now these files are no longer traced, fixing `issue 82`_. @@ -995,8 +1258,8 @@ Version 3.0.1 --- 7 July 2009 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`_. + coverage.py 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 @@ -1075,10 +1338,10 @@ Version 3.0b1 --- 7 March 2009 Major overhaul. -- Coverage is now a package rather than a module. Functionality has been split - into classes. +- Coverage.py 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 +- The trace function is implemented in C for speed. Coverage.py runs are now much faster. Thanks to David Christian for productive micro-sprints and other encouragement. @@ -1090,7 +1353,7 @@ Major overhaul. - 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. + programmatic use of Coverage.py. - The minimum supported Python version is 2.3. @@ -1188,7 +1451,7 @@ Version 2.5 --- 4 December 2005 - Add a file argument to report so that reports can be captured to a different destination. -- coverage.py can now measure itself. +- Coverage.py can now measure itself. - Adapted Greg Rogers' patch for using relative file names, and sorting and omitting files to report on. diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 00000000..f433b1a5 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/MANIFEST.in b/MANIFEST.in index 72246745..31e2230c 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,17 +1,46 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + # MANIFEST.in file for coverage.py -recursive-include coverage/htmlfiles * -recursive-include coverage/fullcoverage * -include coverage.egg-info/*.* -include setup.py -include __main__.py -include README.txt -include CHANGES.txt include AUTHORS.txt -include requirements.txt +include CHANGES.rst +include LICENSE.txt +include MANIFEST.in +include Makefile +include NOTICE.txt +include README.rst +include TODO.txt +include __main__.py +include .travis.yml +include appveyor.yml +include circle.yml +include howto.txt include igor.py +include metacov.ini +include pylintrc +include setup.py include tox.ini +include tox_wheels.ini + +recursive-include ci *.* +exclude ci/appveyor.token + +recursive-include coverage/fullcoverage *.py +recursive-include coverage/ctracer *.c *.h + +recursive-include doc conf.py *.pip *.rst *.txt +recursive-include doc/_static *.* +prune doc/_build + +recursive-include requirements *.pip + +recursive-include tests *.py *.tok +recursive-include tests/farm */gold*/*.* */gold*/*/*.* +recursive-include tests/farm/*/src * *.* +recursive-include tests js/*.* qunit/*.* +prune tests/eggsrc/build +prune tests/eggsrc/dist +prune tests/eggsrc/*.egg-info -recursive-include tests * -recursive-include doc *.rst -global-exclude *.pyc +global-exclude *.py[co] @@ -1,4 +1,7 @@ -# Makefile for utility work on Coverage. +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +# Makefile for utility work on coverage.py. default: @echo "* No default action *" @@ -24,7 +27,7 @@ clean: sterile: clean -rm -rf .tox* -LINTABLE = coverage igor.py setup.py tests +LINTABLE = coverage igor.py setup.py tests ci/*.py lint: -pylint $(LINTABLE) @@ -35,10 +38,10 @@ spell: -pylint --disable=all --enable=spelling $(LINTABLE) pep8: - pep8 --filename=*.py --ignore=E401,E301 --repeat coverage + pep8 --filename=*.py --repeat $(LINTABLE) test: - tox -e py27 $(ARGS) + tox -e py27,py34 $(ARGS) metacov: COVERAGE_COVERAGE=yes tox $(ARGS) @@ -48,31 +51,33 @@ metahtml: # Kitting -# For kitting on Windows: -# SDIST_CMD = python setup.py sdist --keep-temp --formats=gztar fixtar --owner=ned --group=coverage --clean -SDIST_CMD = python setup.py sdist --formats=gztar - kit: - $(SDIST_CMD) + python setup.py sdist --formats=gztar,zip + +wheel: + tox -c tox_wheels.ini $(ARGS) kit_upload: - $(SDIST_CMD) upload + twine upload dist/* kit_local: cp -v dist/* `awk -F "=" '/find-links/ {print $$2}' ~/.pip/pip.conf` + # pip caches wheels of things it has installed. Clean them out so we + # don't go crazy trying to figure out why our new code isn't installing. + find ~/Library/Caches/pip/wheels -name 'coverage-*' -delete + +download_appveyor: + python ci/download_appveyor.py nedbat/coveragepy pypi: python setup.py register +build_ext: + python setup.py build_ext + install: python setup.py install -DEVINST_FILE = coverage.egg-info/PKG-INFO -devinst: $(DEVINST_FILE) -$(DEVINST_FILE): coverage/tracer.c - -rm coverage/tracer.pyd - python setup.py develop - uninstall: -rm -rf $(PYHOME)/lib/site-packages/coverage* -rm -rf $(PYHOME)/scripts/coverage* @@ -81,34 +86,27 @@ uninstall: SPHINXBUILD = sphinx-build SPHINXOPTS = -a -E doc -WEBHOME = ~/web/stellated/pages/code/coverage +WEBHOME = ~/web/stellated/ +WEBSAMPLE = $(WEBHOME)/files/sample_coverage_html +WEBSAMPLEBETA = $(WEBHOME)/files/sample_coverage_html_beta docreqs: - pip install -r doc/requirements.txt + pip install -r doc/requirements.pip -px: docreqs - $(SPHINXBUILD) -b px $(SPHINXOPTS) doc/_build/px - rm doc/_build/px/search.px - python doc/_ext/px_cleaner.py doc/_build/px/*.px - -dochtml: docreqs +dochtml: $(SPHINXBUILD) -b html $(SPHINXOPTS) doc/_build/html @echo @echo "Build finished. The HTML pages are in doc/_build/html." -docspell: docreqs +docspell: $(SPHINXBUILD) -b spelling $(SPHINXOPTS) doc/_spell -publish: px - rm -f $(WEBHOME)/*.px - cp doc/_build/px/*.px $(WEBHOME) - rm -f $(WEBHOME)/sample_html/*.* - cp doc/sample_html/*.* $(WEBHOME)/sample_html - -publishbeta: px - rm -f $(WEBHOME)/beta/*.px - mkdir -p $(WEBHOME)/beta - cp doc/_build/px/*.px $(WEBHOME)/beta - rm -f $(WEBHOME)/sample_html_beta/*.* - mkdir -p $(WEBHOME)/sample_html_beta - cp doc/sample_html_beta/*.* $(WEBHOME)/sample_html_beta +publish: + rm -f $(WEBSAMPLE)/*.* + mkdir -p $(WEBSAMPLE) + cp doc/sample_html/*.* $(WEBSAMPLE) + +publishbeta: + rm -f $(WEBSAMPLEBETA)/*.* + mkdir -p $(WEBSAMPLEBETA) + cp doc/sample_html_beta/*.* $(WEBSAMPLEBETA) diff --git a/NOTICE.txt b/NOTICE.txt new file mode 100644 index 00000000..ff68ab80 --- /dev/null +++ b/NOTICE.txt @@ -0,0 +1,14 @@ +Copyright 2001 Gareth Rees. All rights reserved. +Copyright 2004-2015 Ned Batchelder. All rights reserved. + +Except where noted otherwise, this software is licensed under the Apache +License, Version 2.0 (the "License"); you may not use this work except in +compliance with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/README.rst b/README.rst new file mode 100644 index 00000000..66a8f5e9 --- /dev/null +++ b/README.rst @@ -0,0 +1,75 @@ +.. Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +.. For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +=========== +Coverage.py +=========== + +Code coverage testing for Python. + +| |license| |versions| |status| |docs| +| |ci-status| |win-ci-status| |codecov| +| |kit| |format| |downloads| + +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. + +Coverage.py runs on CPython 2.6, 2.7, 3.3, 3.4 and 3.5; PyPy 2.4, 2.6 and 4.0; +and PyPy3 2.4. + +Documentation is on `Read the Docs <http://coverage.readthedocs.org>`_. +Code repository and issue tracker are on `Bitbucket <http://bitbucket.org/ned/coveragepy>`_, +with a mirrored repository on `GitHub <https://github.com/nedbat/coveragepy>`_. + +**New in 4.0:** ``--concurrency``, plugins for non-Python files, setup.cfg +support, --skip-covered, HTML filtering, and more than 50 issues closed. + + +Getting Started +--------------- + +See the `quick start <http://coverage.readthedocs.org/#quick-start>`_ +section of the docs. + + +License +------- + +Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0. +For details, see https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt. + + +.. |ci-status| image:: https://travis-ci.org/nedbat/coveragepy.svg?branch=master + :target: https://travis-ci.org/nedbat/coveragepy + :alt: Build status +.. |win-ci-status| image:: https://ci.appveyor.com/api/projects/status/bitbucket/ned/coveragepy?svg=true + :target: https://ci.appveyor.com/project/nedbat/coveragepy + :alt: Windows build status +.. |docs| image:: https://readthedocs.org/projects/coverage/badge/?version=latest&style=flat + :target: http://coverage.readthedocs.org + :alt: Documentation +.. |reqs| image:: https://requires.io/github/nedbat/coveragepy/requirements.svg?branch=master + :target: https://requires.io/github/nedbat/coveragepy/requirements/?branch=master + :alt: Requirements status +.. |kit| image:: https://badge.fury.io/py/coverage.svg + :target: https://pypi.python.org/pypi/coverage + :alt: PyPI status +.. |format| image:: https://img.shields.io/pypi/format/coverage.svg + :target: https://pypi.python.org/pypi/coverage + :alt: Kit format +.. |downloads| image:: https://img.shields.io/pypi/dd/coverage.svg + :target: https://pypi.python.org/pypi/coverage + :alt: Daily PyPI downloads +.. |versions| image:: https://img.shields.io/pypi/pyversions/coverage.svg + :target: https://pypi.python.org/pypi/coverage + :alt: Python versions supported +.. |status| image:: https://img.shields.io/pypi/status/coverage.svg + :target: https://pypi.python.org/pypi/coverage + :alt: Package stability +.. |license| image:: https://img.shields.io/pypi/l/coverage.svg + :target: https://pypi.python.org/pypi/coverage + :alt: License +.. |codecov| image:: http://codecov.io/github/nedbat/coveragepy/coverage.svg?branch=master + :target: http://codecov.io/github/nedbat/coveragepy?branch=master + :alt: Coverage! diff --git a/README.txt b/README.txt deleted file mode 100644 index 2c6fe3d6..00000000 --- a/README.txt +++ /dev/null @@ -1,9 +0,0 @@ -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,4 +1,4 @@ -Coverage TODO +Coverage.py TODO Key: * Heading @@ -9,7 +9,7 @@ Key: * 4.0 - What defaults should change? - - --source = . ? + x --source = . ? x --branch = True ? - Remove 2.3, 2.4, 2.5 limitations @@ -28,29 +28,21 @@ Key: + we can use "except ExcClass as e:" - Plugins - - Clean up + + Clean up + implement plugin support in CTracer + remove plugin support from PyTracer - - add services: + x add services: - filelocator - warning - dynamic_source_filename: return should be a canonical path - update the omit test to use "quux*" instead of "*quux*" - - docs + + docs + Make reports use filenames, not module names - documentation - test helpers - - cov.config["run:branch"] api - - "added in 4.0" -+ Remove code only run on <2.6 -- Change data file to json -- Create data api -+ gevent, etc. -+ Remove the old command-line syntax - + A pain, b/c of the structure of the tests. - + BTW: make an easier way to write those tests. - -- Documentation + + cov.config["run:branch"] api (well, coverage.get_option etc) + + "added in 4.0" + - tweaks to theme? - Plugins! Once per process Once per file @@ -58,6 +50,22 @@ Key: - call its has_dynamic_source_file() Once per call Once per line +- build process + - don't publish to nedbat.com any more (but still need the sample html reports) + + don't need .px tooling + - write a new nedbat.com/code/coverage page. + - all doc links should point to rtfd ++ Remove code only run on <2.6 ++ Change data file to json ++ Create data api ++ gevent, etc. ++ Remove the old command-line syntax + + A pain, b/c of the structure of the tests. + + BTW: make an easier way to write those tests. + +- tests + - test the kit has the right contents + - test the kit installs the right stuff * --source stuff: @@ -82,7 +90,7 @@ Key: - 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. +x 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? @@ -126,7 +134,7 @@ x Tricky swapping of collector like figleaf, pycov, et al. (Don't need to do 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. ++ API for getting coverage data. - Instruction tracing instead of line tracing. - Path tracing (how does this even work?) - Count execution of lines @@ -143,7 +151,7 @@ x Tricky swapping of collector like figleaf, pycov, et al. (Don't need to do 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. ++ Use a .coveragerc file to control coverage.py without the programmatic API. - 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? @@ -156,7 +164,7 @@ x Why can't you specify execute (-x) and report (-r) in the same invocation? 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) ++ Reporting on files never touched by coverage.py (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 @@ -177,7 +185,7 @@ x Why can't you specify execute (-x) and report (-r) in the same invocation? + 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. + + Footer in reports pointing to coverage.py 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/ @@ -196,10 +204,10 @@ x Why can't you specify execute (-x) and report (-r) in the same invocation? - ignore (files not to collect) - exclude (lines not to report as missed) - omit (files not to report) - - Changes from coverage 2.x: + - Changes from coverage.py 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. + x Document the .coverage file format. + HTML reporting. - Much more detail about what's in the report. - References between pages are off: @@ -220,8 +228,8 @@ x Why can't you specify execute (-x) and report (-r) in the same invocation? * Installation -x How will Coverage package install over coverage.py module? -x pip can't install it: it reads the coverage html page, and finds the kit link, +x How will coverage.py package install over coverage.py module? +x pip can't install it: it reads the coverage.py html page, and finds the kit link, but then can't handle the root-relative link. @@ -263,13 +271,13 @@ x pip can't install it: it reads the coverage html page, and finds the kit link, + 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 .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! ++ Coverage test coverage.py! - Tests that tracing stops after calling stop() - More intensive thread testing. x Tests about the "import __main__" in cmdline.py diff --git a/__main__.py b/__main__.py index b11dafce..a44b820a 100644 --- a/__main__.py +++ b/__main__.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Be able to execute coverage.py by pointing Python at a working tree.""" import runpy, os diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 00000000..faa354f3 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,130 @@ +# Appveyor, continuous integration for Windows +# https://ci.appveyor.com/project/nedbat/coveragepy + +version: '{branch}-{build}' + +shallow_clone: true + +environment: + + CMD_IN_ENV: "cmd /E:ON /V:ON /C .\\ci\\run_with_env.cmd" + + matrix: + - JOB: "2.6 32-bit" + TOXENV: "py26" + PYTHON: "C:\\Python26.6" + PYTHON_VERSION: "2.6.6" + PYTHON_ARCH: "32" + + - JOB: "2.6 64-bit" + TOXENV: "py26" + PYTHON: "C:\\Python26.6-x64" + PYTHON_VERSION: "2.6.6" + PYTHON_ARCH: "64" + + - JOB: "2.7 32-bit" + TOXENV: "py27" + PYTHON: "C:\\Python27.10" + PYTHON_VERSION: "2.7.10" + PYTHON_ARCH: "32" + + - JOB: "2.7 64-bit" + TOXENV: "py27" + PYTHON: "C:\\Python27.10-x64" + PYTHON_VERSION: "2.7.10" + PYTHON_ARCH: "64" + + - JOB: "3.3 32-bit" + TOXENV: "py33" + PYTHON: "C:\\Python33" + PYTHON_VERSION: "3.3" + PYTHON_ARCH: "32" + + - JOB: "3.3 64-bit" + TOXENV: "py33" + PYTHON: "C:\\Python33-x64" + PYTHON_VERSION: "3.3" + PYTHON_ARCH: "64" + + - JOB: "3.4 32-bit" + TOXENV: "py34" + PYTHON: "C:\\Python34" + PYTHON_VERSION: "3.4" + PYTHON_ARCH: "32" + + - JOB: "3.4 64-bit" + TOXENV: "py34" + PYTHON: "C:\\Python34-x64" + PYTHON_VERSION: "3.4" + PYTHON_ARCH: "64" + + - JOB: "3.5 32-bit" + TOXENV: "py35" + PYTHON: "C:\\Python35" + PYTHON_VERSION: "3.5.0" + PYTHON_ARCH: "32" + + - JOB: "3.5 64-bit" + TOXENV: "py35" + PYTHON: "C:\\Python35-x64" + PYTHON_VERSION: "3.5.0" + PYTHON_ARCH: "64" + + # Meta coverage + - JOB: "Meta 2.7" + TOXENV: "py27" + PYTHON: "C:\\Python27" + PYTHON_VERSION: "2.7" + PYTHON_ARCH: "32" + COVERAGE_COVERAGE: "yes" + + - JOB: "Meta 3.4" + TOXENV: "py34" + PYTHON: "C:\\Python34" + PYTHON_VERSION: "3.4" + PYTHON_ARCH: "32" + COVERAGE_COVERAGE: "yes" + +init: + - "ECHO %TOXENV%" + +install: + # Install Python (from the official .msi of http://python.org) and pip when + # not already installed. + - ps: if (-not(Test-Path($env:PYTHON))) { & ci\install.ps1 } + + # Prepend newly installed Python to the PATH of this build (this cannot be + # done from inside the powershell script as it would require to restart + # the parent CMD process). + - "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%" + + # Check that we have the expected version and architecture for Python + - "python --version" + - "python -c \"import struct; print(struct.calcsize('P') * 8)\"" + + # Upgrade to the latest version of pip to avoid it displaying warnings + # about it being out of date. + - "pip install --disable-pip-version-check --user --upgrade pip" + + # Install requirements. + - "%CMD_IN_ENV% pip install -r requirements/tox.pip -r requirements/wheel.pip" + + # Make a python3.4.bat file in the current directory so that tox will find it + # and python3.4 will mean what we want it to. + - "python -c \"import os; open('python{0}.{1}.bat'.format(*os.environ['TOXENV'][2:]), 'w').write('@{0}\\\\python \\x25*\\n'.format(os.environ['PYTHON']))\"" + +build_script: + # If not a metacov job, then build wheels and .exe installers. + - if NOT "%COVERAGE_COVERAGE%" == "yes" %CMD_IN_ENV% %PYTHON%\python setup.py bdist_wheel bdist_wininst + + # Push everything in dist\ as an artifact. + - ps: if ( Test-Path 'dist' -PathType Container ) { Get-ChildItem dist\*.* | % { Push-AppveyorArtifact $_.FullName -FileName ('dist\' + $_.Name) } } + +test_script: + - "%CMD_IN_ENV% %PYTHON%\\Scripts\\tox" + +after_test: + - if "%COVERAGE_COVERAGE%" == "yes" 7z a metacov-win-%TOXENV%.zip %APPVEYOR_BUILD_FOLDER%\.metacov* + +artifacts: + - path: "metacov-*.zip" diff --git a/ci/README.txt b/ci/README.txt new file mode 100644 index 00000000..a34d036b --- /dev/null +++ b/ci/README.txt @@ -0,0 +1 @@ +Files to support continuous integration systems. diff --git a/ci/download_appveyor.py b/ci/download_appveyor.py new file mode 100644 index 00000000..f640b41a --- /dev/null +++ b/ci/download_appveyor.py @@ -0,0 +1,95 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +"""Use the Appveyor API to download Windows artifacts.""" + +import os +import os.path +import sys +import zipfile + +import requests + + +def make_auth_headers(): + """Make the authentication headers needed to use the Appveyor API.""" + with open("ci/appveyor.token") as f: + token = f.read().strip() + + headers = { + 'Authorization': 'Bearer {0}'.format(token), + } + return headers + + +def make_url(url, **kwargs): + """Build an Appveyor API url.""" + return "https://ci.appveyor.com/api" + url.format(**kwargs) + + +def get_project_build(account_project): + """Get the details of the latest Appveyor build.""" + url = make_url("/projects/{account_project}", account_project=account_project) + response = requests.get(url, headers=make_auth_headers()) + return response.json() + + +def download_latest_artifacts(account_project): + """Download all the artifacts from the latest build.""" + build = get_project_build(account_project) + jobs = build['build']['jobs'] + print "Build {0[build][version]}, {1} jobs: {0[build][message]}".format(build, len(jobs)) + for job in jobs: + name = job['name'].partition(':')[2].split(',')[0].strip() + print " {0}: {1[status]}, {1[artifactsCount]} artifacts".format(name, job) + + url = make_url("/buildjobs/{jobid}/artifacts", jobid=job['jobId']) + response = requests.get(url, headers=make_auth_headers()) + artifacts = response.json() + + for artifact in artifacts: + is_zip = artifact['type'] == "Zip" + filename = artifact['fileName'] + print " {0}, {1} bytes".format(filename, artifact['size']) + + url = make_url( + "/buildjobs/{jobid}/artifacts/{filename}", + jobid=job['jobId'], + filename=filename + ) + download_url(url, filename, make_auth_headers()) + + if is_zip: + unpack_zipfile(filename) + os.remove(filename) + + +def ensure_dirs(filename): + """Make sure the directories exist for `filename`.""" + dirname, _ = os.path.split(filename) + if dirname and not os.path.exists(dirname): + os.makedirs(dirname) + + +def download_url(url, filename, headers): + """Download a file from `url` to `filename`.""" + ensure_dirs(filename) + response = requests.get(url, headers=headers, stream=True) + if response.status_code == 200: + with open(filename, 'wb') as f: + for chunk in response.iter_content(16*1024): + f.write(chunk) + + +def unpack_zipfile(filename): + """Unpack a zipfile, using the names in the zip.""" + with open(filename, 'rb') as fzip: + z = zipfile.ZipFile(fzip) + for name in z.namelist(): + print " extracting {0}".format(name) + ensure_dirs(name) + z.extract(name) + + +if __name__ == "__main__": + download_latest_artifacts(sys.argv[1]) diff --git a/ci/install.ps1 b/ci/install.ps1 new file mode 100644 index 00000000..f9934aa1 --- /dev/null +++ b/ci/install.ps1 @@ -0,0 +1,232 @@ +# From: https://github.com/ogrisel/python-appveyor-demo/blob/master/appveyor/install.ps1 +# +# +# Sample script to install Python and pip under Windows +# Authors: Olivier Grisel, Jonathan Helmus, Kyle Kastner, and Alex Willmer +# License: CC0 1.0 Universal: http://creativecommons.org/publicdomain/zero/1.0/ + +$MINICONDA_URL = "http://repo.continuum.io/miniconda/" +$BASE_URL = "https://www.python.org/ftp/python/" +$GET_PIP_URL = "https://bootstrap.pypa.io/get-pip.py" +$GET_PIP_PATH = "C:\get-pip.py" + +$PYTHON_PRERELEASE_REGEX = @" +(?x) +(?<major>\d+) +\. +(?<minor>\d+) +\. +(?<micro>\d+) +(?<prerelease>[a-z]{1,2}\d+) +"@ + + +function Download ($filename, $url) { + $webclient = New-Object System.Net.WebClient + + $basedir = $pwd.Path + "\" + $filepath = $basedir + $filename + if (Test-Path $filename) { + Write-Host "Reusing" $filepath + return $filepath + } + + # Download and retry up to 3 times in case of network transient errors. + Write-Host "Downloading" $filename "from" $url + $retry_attempts = 2 + for ($i = 0; $i -lt $retry_attempts; $i++) { + try { + $webclient.DownloadFile($url, $filepath) + break + } + Catch [Exception]{ + Start-Sleep 1 + } + } + if (Test-Path $filepath) { + Write-Host "File saved at" $filepath + } else { + # Retry once to get the error message if any at the last try + $webclient.DownloadFile($url, $filepath) + } + return $filepath +} + + +function ParsePythonVersion ($python_version) { + if ($python_version -match $PYTHON_PRERELEASE_REGEX) { + return ([int]$matches.major, [int]$matches.minor, [int]$matches.micro, + $matches.prerelease) + } + $version_obj = [version]$python_version + return ($version_obj.major, $version_obj.minor, $version_obj.build, "") +} + + +function DownloadPython ($python_version, $platform_suffix) { + $major, $minor, $micro, $prerelease = ParsePythonVersion $python_version + + if (($major -le 2 -and $micro -eq 0) ` + -or ($major -eq 3 -and $minor -le 2 -and $micro -eq 0) ` + ) { + $dir = "$major.$minor" + $python_version = "$major.$minor$prerelease" + } else { + $dir = "$major.$minor.$micro" + } + + if ($prerelease) { + if (($major -le 2) ` + -or ($major -eq 3 -and $minor -eq 1) ` + -or ($major -eq 3 -and $minor -eq 2) ` + -or ($major -eq 3 -and $minor -eq 3) ` + ) { + $dir = "$dir/prev" + } + } + + if (($major -le 2) -or ($major -le 3 -and $minor -le 4)) { + $ext = "msi" + if ($platform_suffix) { + $platform_suffix = ".$platform_suffix" + } + } else { + $ext = "exe" + if ($platform_suffix) { + $platform_suffix = "-$platform_suffix" + } + } + + $filename = "python-$python_version$platform_suffix.$ext" + $url = "$BASE_URL$dir/$filename" + $filepath = Download $filename $url + return $filepath +} + + +function InstallPython ($python_version, $architecture, $python_home) { + Write-Host "Installing Python" $python_version "for" $architecture "bit architecture to" $python_home + if (Test-Path $python_home) { + Write-Host $python_home "already exists, skipping." + return $false + } + if ($architecture -eq "32") { + $platform_suffix = "" + } else { + $platform_suffix = "amd64" + } + $installer_path = DownloadPython $python_version $platform_suffix + $installer_ext = [System.IO.Path]::GetExtension($installer_path) + Write-Host "Installing $installer_path to $python_home" + $install_log = $python_home + ".log" + if ($installer_ext -eq '.msi') { + InstallPythonMSI $installer_path $python_home $install_log + } else { + InstallPythonEXE $installer_path $python_home $install_log + } + if (Test-Path $python_home) { + Write-Host "Python $python_version ($architecture) installation complete" + } else { + Write-Host "Failed to install Python in $python_home" + Get-Content -Path $install_log + Exit 1 + } +} + + +function InstallPythonEXE ($exepath, $python_home, $install_log) { + $install_args = "/quiet InstallAllUsers=1 TargetDir=$python_home" + RunCommand $exepath $install_args +} + + +function InstallPythonMSI ($msipath, $python_home, $install_log) { + $install_args = "/qn /log $install_log /i $msipath TARGETDIR=$python_home" + $uninstall_args = "/qn /x $msipath" + RunCommand "msiexec.exe" $install_args + if (-not(Test-Path $python_home)) { + Write-Host "Python seems to be installed else-where, reinstalling." + RunCommand "msiexec.exe" $uninstall_args + RunCommand "msiexec.exe" $install_args + } +} + +function RunCommand ($command, $command_args) { + Write-Host $command $command_args + Start-Process -FilePath $command -ArgumentList $command_args -Wait -Passthru +} + + +function InstallPip ($python_home) { + $pip_path = $python_home + "\Scripts\pip.exe" + $python_path = $python_home + "\python.exe" + if (-not(Test-Path $pip_path)) { + Write-Host "Installing pip..." + $webclient = New-Object System.Net.WebClient + $webclient.DownloadFile($GET_PIP_URL, $GET_PIP_PATH) + Write-Host "Executing:" $python_path $GET_PIP_PATH + & $python_path $GET_PIP_PATH + } else { + Write-Host "pip already installed." + } +} + + +function DownloadMiniconda ($python_version, $platform_suffix) { + if ($python_version -eq "3.4") { + $filename = "Miniconda3-3.5.5-Windows-" + $platform_suffix + ".exe" + } else { + $filename = "Miniconda-3.5.5-Windows-" + $platform_suffix + ".exe" + } + $url = $MINICONDA_URL + $filename + $filepath = Download $filename $url + return $filepath +} + + +function InstallMiniconda ($python_version, $architecture, $python_home) { + Write-Host "Installing Python" $python_version "for" $architecture "bit architecture to" $python_home + if (Test-Path $python_home) { + Write-Host $python_home "already exists, skipping." + return $false + } + if ($architecture -eq "32") { + $platform_suffix = "x86" + } else { + $platform_suffix = "x86_64" + } + $filepath = DownloadMiniconda $python_version $platform_suffix + Write-Host "Installing" $filepath "to" $python_home + $install_log = $python_home + ".log" + $args = "/S /D=$python_home" + Write-Host $filepath $args + Start-Process -FilePath $filepath -ArgumentList $args -Wait -Passthru + if (Test-Path $python_home) { + Write-Host "Python $python_version ($architecture) installation complete" + } else { + Write-Host "Failed to install Python in $python_home" + Get-Content -Path $install_log + Exit 1 + } +} + + +function InstallMinicondaPip ($python_home) { + $pip_path = $python_home + "\Scripts\pip.exe" + $conda_path = $python_home + "\Scripts\conda.exe" + if (-not(Test-Path $pip_path)) { + Write-Host "Installing pip..." + $args = "install --yes pip" + Write-Host $conda_path $args + Start-Process -FilePath "$conda_path" -ArgumentList $args -Wait -Passthru + } else { + Write-Host "pip already installed." + } +} + +function main () { + InstallPython $env:PYTHON_VERSION $env:PYTHON_ARCH $env:PYTHON + InstallPip $env:PYTHON +} + +main diff --git a/ci/run_with_env.cmd b/ci/run_with_env.cmd new file mode 100644 index 00000000..66b9252e --- /dev/null +++ b/ci/run_with_env.cmd @@ -0,0 +1,91 @@ +:: From: https://github.com/ogrisel/python-appveyor-demo/blob/master/appveyor/run_with_env.cmd +:: +:: +:: To build extensions for 64 bit Python 3, we need to configure environment +:: variables to use the MSVC 2010 C++ compilers from GRMSDKX_EN_DVD.iso of: +:: MS Windows SDK for Windows 7 and .NET Framework 4 (SDK v7.1) +:: +:: To build extensions for 64 bit Python 2, we need to configure environment +:: variables to use the MSVC 2008 C++ compilers from GRMSDKX_EN_DVD.iso of: +:: MS Windows SDK for Windows 7 and .NET Framework 3.5 (SDK v7.0) +:: +:: 32 bit builds, and 64-bit builds for 3.5 and beyond, do not require specific +:: environment configurations. +:: +:: Note: this script needs to be run with the /E:ON and /V:ON flags for the +:: cmd interpreter, at least for (SDK v7.0) +:: +:: More details at: +:: https://github.com/cython/cython/wiki/64BitCythonExtensionsOnWindows +:: http://stackoverflow.com/a/13751649/163740 +:: +:: Author: Olivier Grisel +:: License: CC0 1.0 Universal: http://creativecommons.org/publicdomain/zero/1.0/ +:: +:: Notes about batch files for Python people: +:: +:: Quotes in values are literally part of the values: +:: SET FOO="bar" +:: FOO is now five characters long: " b a r " +:: If you don't want quotes, don't include them on the right-hand side. +:: +:: The CALL lines at the end of this file look redundant, but if you move them +:: outside of the IF clauses, they do not run properly in the SET_SDK_64==Y +:: case, I don't know why. +@ECHO OFF + +SET COMMAND_TO_RUN=%* +SET WIN_SDK_ROOT=C:\Program Files\Microsoft SDKs\Windows +SET WIN_WDK=c:\Program Files (x86)\Windows Kits\10\Include\wdf + +:: Extract the major and minor versions, and allow for the minor version to be +:: more than 9. This requires the version number to have two dots in it. +SET MAJOR_PYTHON_VERSION=%PYTHON_VERSION:~0,1% +IF "%PYTHON_VERSION:~3,1%" == "." ( + SET MINOR_PYTHON_VERSION=%PYTHON_VERSION:~2,1% +) ELSE ( + SET MINOR_PYTHON_VERSION=%PYTHON_VERSION:~2,2% +) + +:: Based on the Python version, determine what SDK version to use, and whether +:: to set the SDK for 64-bit. +IF %MAJOR_PYTHON_VERSION% == 2 ( + SET WINDOWS_SDK_VERSION="v7.0" + SET SET_SDK_64=Y +) ELSE ( + IF %MAJOR_PYTHON_VERSION% == 3 ( + SET WINDOWS_SDK_VERSION="v7.1" + IF %MINOR_PYTHON_VERSION% LEQ 4 ( + SET SET_SDK_64=Y + ) ELSE ( + SET SET_SDK_64=N + IF EXIST "%WIN_WDK%" ( + :: See: https://connect.microsoft.com/VisualStudio/feedback/details/1610302/ + REN "%WIN_WDK%" 0wdf + ) + ) + ) ELSE ( + ECHO Unsupported Python version: "%MAJOR_PYTHON_VERSION%" + EXIT 1 + ) +) + +IF %PYTHON_ARCH% == 64 ( + IF %SET_SDK_64% == Y ( + ECHO Configuring Windows SDK %WINDOWS_SDK_VERSION% for Python %MAJOR_PYTHON_VERSION% on a 64 bit architecture + SET DISTUTILS_USE_SDK=1 + SET MSSdk=1 + "%WIN_SDK_ROOT%\%WINDOWS_SDK_VERSION%\Setup\WindowsSdkVer.exe" -q -version:%WINDOWS_SDK_VERSION% + "%WIN_SDK_ROOT%\%WINDOWS_SDK_VERSION%\Bin\SetEnv.cmd" /x64 /release + ECHO Executing: %COMMAND_TO_RUN% + call %COMMAND_TO_RUN% || EXIT 1 + ) ELSE ( + ECHO Using default MSVC build environment for 64 bit architecture + ECHO Executing: %COMMAND_TO_RUN% + call %COMMAND_TO_RUN% || EXIT 1 + ) +) ELSE ( + ECHO Using default MSVC build environment for 32 bit architecture + ECHO Executing: %COMMAND_TO_RUN% + call %COMMAND_TO_RUN% || EXIT 1 +) diff --git a/circle.yml b/circle.yml new file mode 100644 index 00000000..a52959ef --- /dev/null +++ b/circle.yml @@ -0,0 +1,18 @@ +# Circle CI configuration for coverage.py. +# https://circleci.com/gh/nedbat/coveragepy + +machine: + python: + version: 2.7.6 + post: + - pyenv global pypy-2.4.0 2.6.8 2.7.9 3.3.3 3.4.2 + +dependencies: + pre: + - pip install -U pip + override: + - pip install -r requirements/tox.pip + +test: + override: + - tox diff --git a/coverage/__init__.py b/coverage/__init__.py index 0aa1d45c..d132e4a7 100644 --- a/coverage/__init__.py +++ b/coverage/__init__.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Code coverage measurement for Python. Ned Batchelder @@ -5,78 +8,16 @@ http://nedbatchelder.com/code/coverage """ -from coverage.version import __version__, __url__ +from coverage.version import __version__, __url__, version_info from coverage.control import Coverage, process_startup from coverage.data import CoverageData -from coverage.cmdline import main, CoverageScript from coverage.misc import CoverageException -from coverage.plugin import CoveragePlugin +from coverage.plugin import CoveragePlugin, FileTracer, FileReporter # Backward compatibility. coverage = Coverage -# Module-level functions. The original API to this module was based on -# functions defined directly in the module, with a singleton of the Coverage() -# class. That design hampered programmability, so the current API uses -# explicitly-created Coverage objects. But for backward compatibility, here we -# define the top-level functions to create the singleton when they are first -# called. - -# Singleton object for use with module-level functions. The singleton is -# created as needed when one of the module-level functions is called. -_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. - - """ - # Disable pylint message, because a bunch of variables look unused, but - # they're accessed via locals(). - # pylint: disable=unused-variable - - def wrapper(*args, **kwargs): - """Singleton wrapper around a coverage method.""" - global _the_coverage - if not _the_coverage: - _the_coverage = Coverage(auto_data=True) - return getattr(_the_coverage, name)(*args, **kwargs) - - import inspect - meth = getattr(Coverage, name) - args, varargs, kw, defaults = inspect.getargspec(meth) - argspec = inspect.formatargspec(args[1:], varargs, kw, defaults) - docstring = meth.__doc__ - wrapper.__doc__ = ("""\ - A first-use-singleton wrapper around Coverage.%(name)s. - - This wrapper is provided for backward compatibility with legacy code. - New code should use Coverage.%(name)s directly. - - %(name)s%(argspec)s: - - %(docstring)s - """ % locals() - ) - - return wrapper - - -# Define the module-level functions. -use_cache = _singleton_method('use_cache') -start = _singleton_method('start') -stop = _singleton_method('stop') -erase = _singleton_method('erase') -exclude = _singleton_method('exclude') -analysis = _singleton_method('analysis') -analysis2 = _singleton_method('analysis2') -report = _singleton_method('report') -annotate = _singleton_method('annotate') - - # On Windows, we encode and decode deep enough that something goes wrong and # the encodings.utf_8 module is loaded and then unloaded, I don't know why. # Adding a reference here prevents it from being unloaded. Yuk. @@ -91,34 +32,3 @@ try: del sys.modules['coverage.coverage'] except KeyError: pass - - -# COPYRIGHT AND LICENSE -# -# Copyright 2001 Gareth Rees. All rights reserved. -# Copyright 2004-2015 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 -# met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the -# distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS -# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR -# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -# DAMAGE. diff --git a/coverage/__main__.py b/coverage/__main__.py index 55e0d259..35ab87a5 100644 --- a/coverage/__main__.py +++ b/coverage/__main__.py @@ -1,4 +1,8 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Coverage.py's main entry point.""" + import sys from coverage.cmdline import main sys.exit(main()) diff --git a/coverage/annotate.py b/coverage/annotate.py index 6e68d4a3..4060450f 100644 --- a/coverage/annotate.py +++ b/coverage/annotate.py @@ -1,10 +1,19 @@ -"""Source file annotation for Coverage.""" +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt -import os, re +"""Source file annotation for coverage.py.""" -from coverage import env +import io +import os +import re + +from coverage.files import flat_rootname +from coverage.misc import isolate_module from coverage.report import Reporter +os = isolate_module(os) + + class AnnotateReporter(Reporter): """Generate annotated source files showing line coverage. @@ -53,14 +62,14 @@ class AnnotateReporter(Reporter): excluded = sorted(analysis.excluded) if self.directory: - dest_file = os.path.join(self.directory, fr.flat_rootname()) + dest_file = os.path.join(self.directory, flat_rootname(fr.relative_filename())) if dest_file.endswith("_py"): dest_file = dest_file[:-3] + ".py" dest_file += ",cover" else: dest_file = fr.filename + ",cover" - with open(dest_file, 'w') as dest: + with io.open(dest_file, 'w', encoding='utf8') as dest: i = 0 j = 0 covered = True @@ -73,25 +82,22 @@ class AnnotateReporter(Reporter): if i < len(statements) and statements[i] == lineno: covered = j >= len(missing) or missing[j] > lineno if self.blank_re.match(line): - dest.write(' ') + dest.write(u' ') elif self.else_re.match(line): # Special logic for lines containing only 'else:'. if i >= len(statements) and j >= len(missing): - dest.write('! ') + dest.write(u'! ') elif i >= len(statements) or j >= len(missing): - dest.write('> ') + dest.write(u'> ') elif statements[i] == missing[j]: - dest.write('! ') + dest.write(u'! ') else: - dest.write('> ') + dest.write(u'> ') elif lineno in excluded: - dest.write('- ') + dest.write(u'- ') elif covered: - dest.write('> ') + dest.write(u'> ') else: - dest.write('! ') - - if env.PY2: - line = line.encode('utf-8') + dest.write(u'! ') dest.write(line) diff --git a/coverage/backunittest.py b/coverage/backunittest.py index 95b6fcc6..09574ccb 100644 --- a/coverage/backunittest.py +++ b/coverage/backunittest.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Implementations of unittest features from the future.""" # Use unittest2 if it's available, otherwise unittest. This gives us @@ -22,10 +25,13 @@ class TestCase(unittest.TestCase): """ # pylint: disable=missing-docstring - if not unittest_has('assertCountEqual'): - def assertCountEqual(self, s1, s2): - """Assert these have the same elements, regardless of order.""" - self.assertEqual(set(s1), set(s2)) + # Many Pythons have this method defined. But PyPy3 has a bug with it + # somehow (https://bitbucket.org/pypy/pypy/issues/2092), so always use our + # own implementation that works everywhere, at least for the ways we're + # calling it. + def assertCountEqual(self, s1, s2): + """Assert these have the same elements, regardless of order.""" + self.assertEqual(sorted(s1), sorted(s2)) if not unittest_has('assertRaisesRegex'): def assertRaisesRegex(self, *args, **kwargs): diff --git a/coverage/backward.py b/coverage/backward.py index 58d9cfea..4fc72215 100644 --- a/coverage/backward.py +++ b/coverage/backward.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Add things to old Pythons so I can pretend they are newer.""" # This file does lots of tricky stuff, so disable a bunch of pylint warnings. @@ -16,6 +19,12 @@ try: except ImportError: from io import StringIO +# In py3, ConfigParser was renamed to the more-standard configparser +try: + import configparser +except ImportError: + import ConfigParser as configparser + # What's a string called? try: string_class = basestring @@ -40,6 +49,15 @@ try: except NameError: range = range +# shlex.quote is new, but there's an undocumented implementation in "pipes", +# who knew!? +try: + from shlex import quote as shlex_quote +except ImportError: + # Useful function, available under a different (undocumented) name + # in Python versions earlier than 3.3. + from pipes import quote as shlex_quote + # A function to iterate listlessly over a dict's items. try: {}.iteritems @@ -133,11 +151,12 @@ except AttributeError: PYC_MAGIC_NUMBER = imp.get_magic() -def import_local_file(modname): +def import_local_file(modname, modfile=None): """Import a local file as a module. Opens a file in the current directory named `modname`.py, imports it - as `modname`, and returns the module object. + as `modname`, and returns the module object. `modfile` is the file to + import if it isn't in the current directory. """ try: @@ -145,7 +164,8 @@ def import_local_file(modname): except ImportError: SourceFileLoader = None - modfile = modname + '.py' + if modfile is None: + modfile = modname + '.py' if SourceFileLoader: mod = SourceFileLoader(modname, modfile).load_module() else: @@ -155,7 +175,6 @@ def import_local_file(modname): with open(modfile, 'r') as f: # pylint: disable=undefined-loop-variable - # (Using possibly undefined loop variable 'suff') mod = imp.load_module(modname, f, modfile, suff) return mod diff --git a/coverage/bytecode.py b/coverage/bytecode.py index d7304936..82929cef 100644 --- a/coverage/bytecode.py +++ b/coverage/bytecode.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Bytecode manipulation for coverage.py""" import opcode diff --git a/coverage/cmdline.py b/coverage/cmdline.py index 66a76fa6..221c18d6 100644 --- a/coverage/cmdline.py +++ b/coverage/cmdline.py @@ -1,9 +1,13 @@ -"""Command-line support for Coverage.""" +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +"""Command-line support for coverage.py.""" import glob import optparse -import os +import os.path import sys +import textwrap import traceback from coverage import env @@ -16,110 +20,122 @@ class Opts(object): """A namespace class for individual options we'll build parsers from.""" append = optparse.make_option( - '-a', '--append', action='store_false', dest="erase_first", - help="Append coverage data to .coverage, otherwise it is started " - "clean with each run." - ) + '-a', '--append', action='store_true', + help="Append coverage data to .coverage, otherwise it is started clean with each run.", + ) branch = optparse.make_option( '', '--branch', action='store_true', - help="Measure branch coverage in addition to statement coverage." - ) + help="Measure branch coverage in addition to statement coverage.", + ) CONCURRENCY_CHOICES = [ "thread", "gevent", "greenlet", "eventlet", "multiprocessing", ] concurrency = optparse.make_option( '', '--concurrency', action='store', metavar="LIB", choices=CONCURRENCY_CHOICES, - help="Properly measure code using a concurrency library. " - "Valid values are: %s." % ", ".join(CONCURRENCY_CHOICES) - ) + help=( + "Properly measure code using a concurrency library. " + "Valid values are: %s." + ) % ", ".join(CONCURRENCY_CHOICES), + ) debug = optparse.make_option( '', '--debug', action='store', metavar="OPTS", - help="Debug options, separated by commas" - ) + help="Debug options, separated by commas", + ) directory = optparse.make_option( '-d', '--directory', action='store', metavar="DIR", - help="Write the output files to DIR." - ) + help="Write the output files to DIR.", + ) fail_under = optparse.make_option( '', '--fail-under', action='store', metavar="MIN", type="int", - help="Exit with a status of 2 if the total coverage is less than MIN." - ) + help="Exit with a status of 2 if the total coverage is less than MIN.", + ) help = optparse.make_option( '-h', '--help', action='store_true', - help="Get help on this command." - ) + help="Get help on this command.", + ) ignore_errors = optparse.make_option( '-i', '--ignore-errors', action='store_true', - help="Ignore errors while reading source files." - ) + help="Ignore errors while reading source files.", + ) include = optparse.make_option( '', '--include', action='store', metavar="PAT1,PAT2,...", - help="Include only files whose paths match one of these patterns." - "Accepts shell-style wildcards, which must be quoted." - ) + help=( + "Include only files whose paths match one of these patterns. " + "Accepts shell-style wildcards, which must be quoted." + ), + ) pylib = optparse.make_option( '-L', '--pylib', action='store_true', - help="Measure coverage even inside the Python installed library, " - "which isn't done by default." - ) + help=( + "Measure coverage even inside the Python installed library, " + "which isn't done by default." + ), + ) show_missing = optparse.make_option( '-m', '--show-missing', action='store_true', - help="Show line numbers of statements in each module that weren't " - "executed." - ) + help="Show line numbers of statements in each module that weren't executed.", + ) skip_covered = optparse.make_option( '--skip-covered', action='store_true', - help="Skip files with 100% coverage." - ) + help="Skip files with 100% coverage.", + ) omit = optparse.make_option( '', '--omit', action='store', metavar="PAT1,PAT2,...", - help="Omit files whose paths match one of these patterns. " - "Accepts shell-style wildcards, which must be quoted." - ) + help=( + "Omit files whose paths match one of these patterns. " + "Accepts shell-style wildcards, which must be quoted." + ), + ) output_xml = optparse.make_option( '-o', '', action='store', dest="outfile", metavar="OUTFILE", - help="Write the XML report to this file. Defaults to 'coverage.xml'" - ) + help="Write the XML report to this file. Defaults to 'coverage.xml'", + ) parallel_mode = optparse.make_option( '-p', '--parallel-mode', action='store_true', - help="Append the machine name, process id and random number to the " - ".coverage data file name to simplify collecting data from " - "many processes." - ) + help=( + "Append the machine name, process id and random number to the " + ".coverage data file name to simplify collecting data from " + "many processes." + ), + ) module = optparse.make_option( '-m', '--module', action='store_true', - help="<pyfile> is an importable Python module, not a script path, " - "to be run as 'python -m' would run it." - ) + help=( + "<pyfile> is an importable Python module, not a script path, " + "to be run as 'python -m' would run it." + ), + ) rcfile = optparse.make_option( '', '--rcfile', action='store', - help="Specify configuration file. Defaults to '.coveragerc'" - ) + help="Specify configuration file. Defaults to '.coveragerc'", + ) source = optparse.make_option( '', '--source', action='store', metavar="SRC1,SRC2,...", - help="A list of packages or directories of code to be measured." - ) + help="A list of packages or directories of code to be measured.", + ) timid = optparse.make_option( '', '--timid', action='store_true', - help="Use a simpler but slower trace method. Try this if you get " - "seemingly impossible results!" - ) + help=( + "Use a simpler but slower trace method. Try this if you get " + "seemingly impossible results!" + ), + ) title = optparse.make_option( '', '--title', action='store', metavar="TITLE", - help="A text string to use as the title on the HTML." - ) + help="A text string to use as the title on the HTML.", + ) version = optparse.make_option( '', '--version', action='store_true', - help="Display version information and exit." - ) + help="Display version information and exit.", + ) class CoverageOptionParser(optparse.OptionParser, object): - """Base OptionParser for coverage. + """Base OptionParser for coverage.py. Problems don't exit the program. Defaults are initialized for all options. @@ -132,6 +148,7 @@ class CoverageOptionParser(optparse.OptionParser, object): ) self.set_defaults( action=None, + append=None, branch=None, concurrency=None, debug=None, @@ -140,9 +157,9 @@ class CoverageOptionParser(optparse.OptionParser, object): help=None, ignore_errors=None, include=None, + module=None, omit=None, parallel_mode=None, - module=None, pylib=None, rcfile=True, show_missing=None, @@ -150,7 +167,6 @@ class CoverageOptionParser(optparse.OptionParser, object): source=None, timid=None, title=None, - erase_first=None, version=None, ) @@ -199,10 +215,8 @@ class GlobalOptionParser(CoverageOptionParser): class CmdOptionParser(CoverageOptionParser): """Parse one of the new-style commands for coverage.py.""" - def __init__(self, action, options=None, defaults=None, usage=None, - description=None - ): - """Create an OptionParser for a coverage command. + def __init__(self, action, options=None, defaults=None, usage=None, description=None): + """Create an OptionParser for a coverage.py command. `action` is the slug to put into `options.action`. `options` is a list of Option's for the command. @@ -214,7 +228,6 @@ class CmdOptionParser(CoverageOptionParser): if usage: usage = "%prog " + usage super(CmdOptionParser, self).__init__( - prog="coverage %s" % action, usage=usage, description=description, ) @@ -228,6 +241,14 @@ class CmdOptionParser(CoverageOptionParser): # results, and they will compare equal to objects. return (other == "<CmdOptionParser:%s>" % self.cmd) + def get_prog_name(self): + """Override of an undocumented function in optparse.OptionParser.""" + program_name = super(CmdOptionParser, self).get_prog_name() + + # Include the sub-command for this parser as part of the command. + return "%(command)s %(subcommand)s" % {'command': program_name, 'subcommand': self.cmd} + + GLOBAL_ARGS = [ Opts.debug, Opts.help, @@ -235,115 +256,131 @@ GLOBAL_ARGS = [ ] CMDS = { - 'annotate': CmdOptionParser("annotate", + 'annotate': CmdOptionParser( + "annotate", [ Opts.directory, Opts.ignore_errors, - Opts.omit, Opts.include, + Opts.omit, ] + 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 !." + usage="[options] [modules]", + description=( + "Make annotated copies of the given files, marking statements that are executed " + "with > and statements that are missed with !." ), - - 'combine': CmdOptionParser("combine", GLOBAL_ARGS, - usage = "<dir1> <dir2> ... <dirN>", - description = "Combine data from multiple coverage files collected " + ), + + 'combine': CmdOptionParser( + "combine", + GLOBAL_ARGS, + usage="<path1> <path2> ... <pathN>", + 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. The positional " - "arguments are directories from which the data files should be " - "combined. By default, only data files in the current directory " - "are combined." + "arguments are data files or directories containing data files. " + "If no paths are provided, data files in the default data file's " + "directory are combined." ), + ), - 'debug': CmdOptionParser("debug", GLOBAL_ARGS, - usage = "<topic>", - description = "Display information on the internals of coverage.py, " + '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" - ), - - 'html': CmdOptionParser("html", + ), + + '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", + ), + + 'html': CmdOptionParser( + "html", [ Opts.directory, Opts.fail_under, Opts.ignore_errors, - Opts.omit, Opts.include, + Opts.omit, Opts.title, ] + GLOBAL_ARGS, - usage = "[options] [modules]", - description = "Create an HTML report of the coverage of the files. " + 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." ), + ), - 'report': CmdOptionParser("report", + 'report': CmdOptionParser( + "report", [ Opts.fail_under, Opts.ignore_errors, - Opts.omit, Opts.include, + Opts.omit, Opts.show_missing, - Opts.skip_covered + Opts.skip_covered, ] + GLOBAL_ARGS, - usage = "[options] [modules]", - description = "Report coverage statistics on modules." - ), + usage="[options] [modules]", + description="Report coverage statistics on modules." + ), - 'run': CmdOptionParser("run", + 'run': CmdOptionParser( + "run", [ Opts.append, Opts.branch, Opts.concurrency, + Opts.include, + Opts.module, + Opts.omit, Opts.pylib, Opts.parallel_mode, - Opts.module, - Opts.timid, Opts.source, - Opts.omit, - Opts.include, + Opts.timid, ] + GLOBAL_ARGS, - defaults = {'erase_first': True}, - usage = "[options] <pyfile> [program options]", - description = "Run a Python program, measuring code execution." - ), + usage="[options] <pyfile> [program options]", + description="Run a Python program, measuring code execution." + ), - 'xml': CmdOptionParser("xml", + 'xml': CmdOptionParser( + "xml", [ Opts.fail_under, Opts.ignore_errors, - Opts.omit, Opts.include, + Opts.omit, Opts.output_xml, ] + GLOBAL_ARGS, - usage = "[options] [modules]", - description = "Generate an XML report of coverage results." - ), - } + usage="[options] [modules]", + description="Generate an XML report of coverage results." + ), +} OK, ERR, FAIL_UNDER = 0, 1, 2 class CoverageScript(object): - """The command-line interface to Coverage.""" + """The command-line interface to coverage.py.""" def __init__(self, _covpkg=None, _run_python_file=None, - _run_python_module=None, _help_fn=None): + _run_python_module=None, _help_fn=None, _path_exists=None): # _covpkg is for dependency injection, so we can test this code. if _covpkg: self.covpkg = _covpkg @@ -355,12 +392,24 @@ class CoverageScript(object): self.run_python_file = _run_python_file or run_python_file self.run_python_module = _run_python_module or run_python_module self.help_fn = _help_fn or self.help + self.path_exists = _path_exists or os.path.exists self.global_option = False self.coverage = None + self.program_name = os.path.basename(sys.argv[0]) + if env.WINDOWS: + # entry_points={'console_scripts':...} on Windows makes files + # called coverage.exe, coverage3.exe, and coverage-3.5.exe. These + # invoke coverage-script.py, coverage3-script.py, and + # coverage-3.5-script.py. argv[0] is the .py file, but we want to + # get back to the original form. + auto_suffix = "-script.py" + if self.program_name.endswith(auto_suffix): + self.program_name = self.program_name[:-len(auto_suffix)] + def command_line(self, argv): - """The bulk of the command line interface to Coverage. + """The bulk of the command line interface to coverage.py. `argv` is the argument list to process. @@ -409,55 +458,58 @@ class CoverageScript(object): # Do something. self.coverage = self.covpkg.coverage( - data_suffix = options.parallel_mode, - cover_pylib = options.pylib, - timid = options.timid, - branch = options.branch, - config_file = options.rcfile, - source = source, - omit = omit, - include = include, - debug = debug, - concurrency = options.concurrency, + data_suffix=options.parallel_mode, + cover_pylib=options.pylib, + timid=options.timid, + branch=options.branch, + config_file=options.rcfile, + source=source, + omit=omit, + include=include, + debug=debug, + concurrency=options.concurrency, ) if options.action == "debug": return self.do_debug(args) - if options.action == "erase" or options.erase_first: + elif options.action == "erase": self.coverage.erase() - else: - self.coverage.load() + return OK - if options.action == "run": - self.do_run(options, args) + elif options.action == "run": + return self.do_run(options, args) - if options.action == "combine": - data_dirs = argv if argv else None + elif options.action == "combine": + self.coverage.load() + data_dirs = args or None self.coverage.combine(data_dirs) self.coverage.save() + return OK # Remaining actions are reporting, with some common options. report_args = dict( - morfs = unglob_args(args), - ignore_errors = options.ignore_errors, - omit = omit, - include = include, + morfs=unglob_args(args), + ignore_errors=options.ignore_errors, + omit=omit, + include=include, ) + self.coverage.load() + total = None if options.action == "report": total = self.coverage.report( show_missing=options.show_missing, skip_covered=options.skip_covered, **report_args) - if options.action == "annotate": + elif options.action == "annotate": self.coverage.annotate( directory=options.directory, **report_args) - if options.action == "html": + elif options.action == "html": total = self.coverage.html_report( directory=options.directory, title=options.title, **report_args) - if options.action == "xml": + elif options.action == "xml": outfile = options.outfile total = self.coverage.xml_report(outfile=outfile, **report_args) @@ -465,9 +517,9 @@ class CoverageScript(object): # Apply the command line fail-under options, and then use the config # value, so we can get fail_under from the config file. if options.fail_under is not None: - self.coverage.config["report:fail_under"] = options.fail_under + self.coverage.set_option("report:fail_under", options.fail_under) - if self.coverage.config["report:fail_under"]: + if self.coverage.get_option("report:fail_under"): # Total needs to be rounded, but be careful of 0 and 100. if 0 < total < 1: @@ -477,7 +529,7 @@ class CoverageScript(object): else: total = round(total) - if total >= self.coverage.config["report:fail_under"]: + if total >= self.coverage.get_option("report:fail_under"): return OK else: return FAIL_UNDER @@ -489,13 +541,15 @@ class CoverageScript(object): assert error or topic or parser if error: print(error) - print("Use 'coverage help' for help.") + print("Use '%s help' for help." % (self.program_name,)) elif parser: print(parser.format_help().strip()) else: - help_msg = HELP_TOPICS.get(topic, '').strip() + help_params = dict(self.covpkg.__dict__) + help_params['program_name'] = self.program_name + help_msg = textwrap.dedent(HELP_TOPICS.get(topic, '')).strip() if help_msg: - print(help_msg % self.covpkg.__dict__) + print(help_msg % help_params) else: print("Don't know topic %r" % topic) @@ -547,19 +601,22 @@ class CoverageScript(object): def do_run(self, options, args): """Implementation of 'coverage run'.""" - # Set the first path element properly. - old_path0 = sys.path[0] + if options.append and self.coverage.get_option("run:parallel"): + self.help_fn("Can't append to data files in parallel mode.") + return ERR + + if not self.coverage.get_option("run:parallel"): + if not options.append: + self.coverage.erase() # Run the script. self.coverage.start() code_ran = True try: if options.module: - sys.path[0] = '' self.run_python_module(args[0], args) else: filename = args[0] - sys.path[0] = os.path.abspath(os.path.dirname(filename)) self.run_python_file(filename, args) except NoSource: code_ran = False @@ -567,10 +624,13 @@ class CoverageScript(object): finally: self.coverage.stop() if code_ran: + if options.append: + data_file = self.coverage.get_option("run:data_file") + if self.path_exists(data_file): + self.coverage.combine(data_paths=[data_file]) self.coverage.save() - # Restore the old path - sys.path[0] = old_path0 + return OK def do_debug(self, args): """Implementation of 'coverage debug'.""" @@ -578,6 +638,7 @@ class CoverageScript(object): if not args: self.help_fn("What information would you like: data, sys?") return ERR + for info in args: if info == 'sys': sys_info = self.coverage.sys_info() @@ -586,17 +647,17 @@ class CoverageScript(object): print(" %s" % line) elif info == 'data': self.coverage.load() + data = self.coverage.data print(info_header("data")) - 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: - plugins = self.coverage.data.plugin_data() + print("path: %s" % self.coverage.data_files.filename) + if data: + print("has_arcs: %r" % data.has_arcs()) + summary = data.line_counts(fullpath=True) filenames = sorted(summary.keys()) print("\n%d files:" % len(filenames)) for f in filenames: line = "%s: %d lines" % (f, summary[f]) - plugin = plugins.get(f) + plugin = data.file_tracer(f) if plugin: line += " [%s]" % plugin print(line) @@ -605,6 +666,7 @@ class CoverageScript(object): else: self.help_fn("Don't know what you mean by %r" % info) return ERR + return OK @@ -613,9 +675,9 @@ def unshell_list(s): if not s: return None if env.WINDOWS: - # When running coverage as coverage.exe, some of the behavior + # When running coverage.py as coverage.exe, some of the behavior # of the shell is emulated: wildcards are expanded into a list of - # filenames. So you have to single-quote patterns on the command + # file names. So you have to single-quote patterns on the command # line, but (not) helpfully, the single quotes are included in the # argument, so we have to strip them off here. s = s.strip("'") @@ -636,40 +698,39 @@ def unglob_args(args): HELP_TOPICS = { -# ------------------------- -'help': """\ -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. - erase Erase previously collected coverage data. - help Get help on using coverage.py. - html Create an HTML report. - report Report coverage stats on modules. - run Run a Python program and measure code execution. - xml Create an XML report of coverage results. - -Use "coverage help <command>" for detailed help on any command. -For full documentation, see %(__url__)s -""", -# ------------------------- -'minimum_help': """\ -Code coverage for Python. Use 'coverage help' for help. -""", -# ------------------------- -'version': """\ -Coverage.py, version %(__version__)s. -Documentation at %(__url__)s -""", + 'help': """\ + Coverage.py, version %(__version__)s + Measure, collect, and report on code coverage in Python programs. + + usage: %(program_name)s <command> [options] [args] + + Commands: + annotate Annotate source files with execution information. + 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. + report Report coverage stats on modules. + run Run a Python program and measure code execution. + xml Create an XML report of coverage results. + + Use "%(program_name)s help <command>" for detailed help on any command. + For full documentation, see %(__url__)s + """, + + 'minimum_help': """\ + Code coverage for Python. Use '%(program_name)s help' for help. + """, + + 'version': """\ + Coverage.py, version %(__version__)s. + Documentation at %(__url__)s + """, } def main(argv=None): - """The main entry point to Coverage. + """The main entry point to coverage.py. This is installed as the script entry point. diff --git a/coverage/collector.py b/coverage/collector.py index 948cbbb0..0a43d87c 100644 --- a/coverage/collector.py +++ b/coverage/collector.py @@ -1,14 +1,23 @@ -"""Raw data collector for Coverage.""" +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt -import os, sys +"""Raw data collector for coverage.py.""" + +import os +import sys from coverage import env -from coverage.misc import CoverageException +from coverage.backward import iitems +from coverage.files import abs_file +from coverage.misc import CoverageException, isolate_module from coverage.pytracer import PyTracer +os = isolate_module(os) + + try: # Use the C extension code when we can, for speed. - from coverage.tracer import CTracer # pylint: disable=no-name-in-module + from coverage.tracer import CTracer, CFileDisposition # pylint: disable=no-name-in-module except ImportError: # Couldn't import the C extension, maybe it isn't built. if os.getenv('COVERAGE_TEST_TRACER') == 'c': @@ -18,13 +27,16 @@ except ImportError: # it, then exit quickly and clearly instead of dribbling confusing # errors. I'm using sys.exit here instead of an exception because an # exception here causes all sorts of other noise in unittest. - sys.stderr.write( - "*** COVERAGE_TEST_TRACER is 'c' but can't import CTracer!\n" - ) + sys.stderr.write("*** COVERAGE_TEST_TRACER is 'c' but can't import CTracer!\n") sys.exit(1) CTracer = None +class FileDisposition(object): + """A simple value type for recording what to do with a file.""" + pass + + class Collector(object): """Collects trace data. @@ -46,16 +58,14 @@ class Collector(object): # the top, and resumed when they become the top again. _collectors = [] - def __init__(self, - should_trace, check_include, timid, branch, warn, concurrency, - ): + def __init__(self, should_trace, check_include, timid, branch, warn, concurrency): """Create a collector. - `should_trace` is a function, taking a filename, and returning a - canonicalized filename, or None depending on whether the file should - be traced or not. + `should_trace` is a function, taking a file name, and returning a + `coverage.FileDisposition object`. - TODO: `check_include` + `check_include` is a function taking a file name and a frame. It returns + a boolean: True if the file should be traced, False if not. If `timid` is true, then a slower simpler trace function will be used. This is important for some environments where manipulation of @@ -85,13 +95,13 @@ class Collector(object): try: if concurrency == "greenlet": - import greenlet # pylint: disable=import-error + import greenlet self.concur_id_func = greenlet.getcurrent elif concurrency == "eventlet": - import eventlet.greenthread # pylint: disable=import-error + import eventlet.greenthread # pylint: disable=import-error,useless-suppression self.concur_id_func = eventlet.greenthread.getcurrent elif concurrency == "gevent": - import gevent # pylint: disable=import-error + import gevent # pylint: disable=import-error,useless-suppression self.concur_id_func = gevent.getcurrent elif concurrency == "thread" or not concurrency: # It's important to import threading only if we need it. If @@ -100,13 +110,10 @@ class Collector(object): import threading self.threading = threading else: - raise CoverageException( - "Don't understand concurrency=%s" % concurrency - ) + raise CoverageException("Don't understand concurrency=%s" % concurrency) except ImportError: raise CoverageException( - "Couldn't trace with concurrency=%s, " - "the module isn't installed." % concurrency + "Couldn't trace with concurrency=%s, the module isn't installed." % concurrency ) self.reset() @@ -119,10 +126,15 @@ class Collector(object): # trace function. self._trace_class = CTracer or PyTracer - self.supports_plugins = self._trace_class is CTracer + if self._trace_class is CTracer: + self.file_disposition_class = CFileDisposition + self.supports_plugins = True + else: + self.file_disposition_class = FileDisposition + self.supports_plugins = False def __repr__(self): - return "<Collector at 0x%x>" % id(self) + return "<Collector at 0x%x: %s>" % (id(self), self.tracer_name()) def tracer_name(self): """Return the class name of the tracer we're using.""" @@ -130,15 +142,23 @@ class Collector(object): def reset(self): """Clear collected data, and prepare to collect more.""" - # A dictionary mapping filenames to dicts with line number keys, - # or mapping filenames to dicts with line number pairs as keys. + # A dictionary mapping file names to dicts with line number keys (if not + # branch coverage), or mapping file names to dicts with line number + # pairs as keys (if branch coverage). self.data = {} - self.plugin_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 - # None). + # A dictionary mapping file names to file tracer plugin names that will + # handle them. + self.file_tracers = {} + + # The .should_trace_cache attribute is a cache from file names to + # coverage.FileDisposition objects, or None. When a file is first + # considered for tracing, a FileDisposition is obtained from + # Coverage.should_trace. Its .trace attribute indicates whether the + # file should be traced or not. If it should be, a plugin with dynamic + # file names can decide not to trace it based on the dynamic file name + # being excluded by the inclusion rules, in which case the + # FileDisposition will be replaced by None in the cache. if env.PYPY: import __pypy__ # pylint: disable=import-error # Alex Gaynor said: @@ -166,7 +186,7 @@ class Collector(object): """Start a new Tracer object, and store it in self.tracers.""" tracer = self._trace_class() tracer.data = self.data - tracer.arcs = self.branch + tracer.trace_arcs = self.branch tracer.should_trace = self.should_trace tracer.should_trace_cache = self.should_trace_cache tracer.warn = self.warn @@ -175,14 +195,13 @@ class Collector(object): tracer.concur_id_func = self.concur_id_func elif self.concur_id_func: raise CoverageException( - "Can't support concurrency=%s with %s, " - "only threads are supported" % ( + "Can't support concurrency=%s with %s, only threads are supported" % ( self.concurrency, self.tracer_name(), ) ) - if hasattr(tracer, 'plugin_data'): - tracer.plugin_data = self.plugin_data + if hasattr(tracer, 'file_tracers'): + tracer.file_tracers = self.file_tracers if hasattr(tracer, 'threading'): tracer.threading = self.threading if hasattr(tracer, 'check_include'): @@ -199,16 +218,16 @@ class Collector(object): # install this as a trace function, and the first time it's called, it does # the real trace installation. - def _installation_trace(self, frame_unused, event_unused, arg_unused): + def _installation_trace(self, frame, event, arg): """Called on new threads, installs the real tracer.""" - # Remove ourselves as the trace function + # Remove ourselves as the trace function. sys.settrace(None) # Install the real tracer. fn = self._start_tracer() # Invoke the real trace function with the current event, to be sure # not to lose an event. if fn: - fn = fn(frame_unused, event_unused, arg_unused) + fn = fn(frame, event, arg) # Return the new trace function to continue tracing in this scope. return fn @@ -216,9 +235,9 @@ class Collector(object): """Start collecting trace information.""" if self._collectors: self._collectors[-1].pause() - self._collectors.append(self) - # Check to see whether we had a fullcoverage tracer installed. + # Check to see whether we had a fullcoverage tracer installed. If so, + # get the stack frames it stashed away for us. traces0 = [] fn0 = sys.gettrace() if fn0: @@ -226,8 +245,17 @@ class Collector(object): if tracer0: traces0 = getattr(tracer0, 'traces', []) - # Install the tracer on this thread. - fn = self._start_tracer() + try: + # Install the tracer on this thread. + fn = self._start_tracer() + except: + if self._collectors: + self._collectors[-1].resume() + raise + + # If _start_tracer succeeded, then we add ourselves to the global + # stack of collectors. + self._collectors.append(self) # Replay all the events from fullcoverage into the new trace function. for args in traces0: @@ -235,9 +263,7 @@ class Collector(object): try: fn(frame, event, arg, lineno=lineno) except TypeError: - raise Exception( - "fullcoverage must be run with the C trace function." - ) + raise Exception("fullcoverage must be run with the C trace function.") # Install our installation tracer in threading, to jump start other # threads. @@ -248,9 +274,7 @@ class Collector(object): """Stop collecting trace information.""" assert self._collectors assert self._collectors[-1] is self, ( - "Expected current collector to be %r, but it's %r" % ( - self, self._collectors[-1], - ) + "Expected current collector to be %r, but it's %r" % (self, self._collectors[-1]) ) self.pause() @@ -283,39 +307,20 @@ class Collector(object): else: self._start_tracer() - def get_line_data(self): - """Return the line data collected. + def save_data(self, covdata): + """Save the collected data to a `CoverageData`. - Data is { filename: { lineno: None, ...}, ...} + Also resets the collector. """ - if self.branch: - # If we were measuring branches, then we have to re-build the dict - # to show line data. We'll use the first lines of all the arcs, - # if they are actual lines. We don't need the second lines, because - # the second lines will also be first lines, sometimes to exits. - line_data = {} - for f, arcs in self.data.items(): - line_data[f] = dict( - (l1, None) for l1, _ in arcs.keys() if l1 > 0 - ) - return line_data - else: - return self.data + def abs_file_dict(d): + """Return a dict like d, but with keys modified by `abs_file`.""" + return dict((abs_file(k), v) for k, v in iitems(d)) - 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 - created with `branch` true. - - """ if self.branch: - return self.data + covdata.add_arcs(abs_file_dict(self.data)) else: - return {} + covdata.add_lines(abs_file_dict(self.data)) + covdata.add_file_tracers(abs_file_dict(self.file_tracers)) - def get_plugin_data(self): - return self.plugin_data + self.reset() diff --git a/coverage/config.py b/coverage/config.py index 7b142671..cd66697d 100644 --- a/coverage/config.py +++ b/coverage/config.py @@ -1,27 +1,28 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Config file for coverage.py""" -import os, re, sys -from coverage.backward import string_class, iitems -from coverage.misc import CoverageException +import collections +import os +import re +import sys +from coverage.backward import configparser, iitems, string_class +from coverage.misc import CoverageException, isolate_module -# In py3, ConfigParser was renamed to the more-standard configparser -try: - import configparser -except ImportError: - import ConfigParser as configparser +os = isolate_module(os) class HandyConfigParser(configparser.RawConfigParser): """Our specialization of ConfigParser.""" def __init__(self, section_prefix): - # pylint: disable=super-init-not-called configparser.RawConfigParser.__init__(self) self.section_prefix = section_prefix def read(self, filename): - """Read a filename as UTF-8 configuration data.""" + """Read a file name as UTF-8 configuration data.""" kwargs = {} if sys.version_info >= (3, 2): kwargs['encoding'] = "utf-8" @@ -61,7 +62,7 @@ class HandyConfigParser(configparser.RawConfigParser): def dollar_replace(m): """Called for each $replacement.""" # Only one of the groups will have matched, just get its text. - word = next(w for w in m.groups() if w is not None) + word = next(w for w in m.groups() if w is not None) # pragma: part covered if word == "$": return "$" else: @@ -112,10 +113,8 @@ class HandyConfigParser(configparser.RawConfigParser): re.compile(value) except re.error as e: raise CoverageException( - "Invalid [%s].%s value %r: %s" % ( - section, option, value, e - ) - ) + "Invalid [%s].%s value %r: %s" % (section, option, value, e) + ) if value: value_list.append(value) return value_list @@ -124,12 +123,12 @@ class HandyConfigParser(configparser.RawConfigParser): # The default line exclusion regexes. DEFAULT_EXCLUDE = [ r'(?i)#\s*pragma[:\s]?\s*no\s*cover', - ] +] # The default partial branch regexes, to be modified by the user. DEFAULT_PARTIAL = [ r'(?i)#\s*pragma[:\s]?\s*no\s*branch', - ] +] # The default partial branch regexes, based on Python semantics. # These are any Python branching constructs that can't actually execute all @@ -137,7 +136,7 @@ DEFAULT_PARTIAL = [ DEFAULT_PARTIAL_ALWAYS = [ 'while (True|1|False|0):', 'if (True|1|False|0):', - ] +] class CoverageConfig(object): @@ -158,11 +157,12 @@ class CoverageConfig(object): self.concurrency = None self.cover_pylib = False self.data_file = ".coverage" - self.parallel = False - self.timid = False - self.source = None self.debug = [] + self.note = None + self.parallel = False self.plugins = [] + self.source = None + self.timid = False # Defaults for [report] self.exclude_list = DEFAULT_EXCLUDE[:] @@ -170,15 +170,15 @@ class CoverageConfig(object): self.ignore_errors = False self.include = None self.omit = None - self.partial_list = DEFAULT_PARTIAL[:] self.partial_always_list = DEFAULT_PARTIAL_ALWAYS[:] + self.partial_list = DEFAULT_PARTIAL[:] self.precision = 0 self.show_missing = False self.skip_covered = False # Defaults for [html] - self.html_dir = "htmlcov" self.extra_css = None + self.html_dir = "htmlcov" self.html_title = "Coverage report" # Defaults for [xml] @@ -215,9 +215,7 @@ class CoverageConfig(object): try: files_read = cp.read(filename) except configparser.Error as err: - raise CoverageException( - "Couldn't read config file %s: %s" % (filename, err) - ) + raise CoverageException("Couldn't read config file %s: %s" % (filename, err)) if not files_read: return False @@ -227,9 +225,24 @@ class CoverageConfig(object): for option_spec in self.CONFIG_FILE_OPTIONS: self._set_attr_from_config_option(cp, *option_spec) except ValueError as err: - raise CoverageException( - "Couldn't read config file %s: %s" % (filename, err) - ) + raise CoverageException("Couldn't read config file %s: %s" % (filename, err)) + + # Check that there are no unrecognized options. + all_options = collections.defaultdict(set) + for option_spec in self.CONFIG_FILE_OPTIONS: + section, option = option_spec[1].split(":") + all_options[section].add(option) + + for section, options in iitems(all_options): + if cp.has_section(section): + for unknown in set(cp.options(section)) - options: + if section_prefix: + section = section_prefix + section + raise CoverageException( + "Unrecognized option '[%s] %s=' in config file %s" % ( + section, unknown, filename + ) + ) # [paths] is special if cp.has_section('paths'): @@ -258,10 +271,11 @@ class CoverageConfig(object): ('cover_pylib', 'run:cover_pylib', 'boolean'), ('data_file', 'run:data_file'), ('debug', 'run:debug', 'list'), - ('plugins', 'run:plugins', 'list'), ('include', 'run:include', 'list'), + ('note', 'run:note'), ('omit', 'run:omit', 'list'), ('parallel', 'run:parallel', 'boolean'), + ('plugins', 'run:plugins', 'list'), ('source', 'run:source', 'list'), ('timid', 'run:timid', 'boolean'), @@ -271,35 +285,44 @@ class CoverageConfig(object): ('ignore_errors', 'report:ignore_errors', 'boolean'), ('include', 'report:include', 'list'), ('omit', 'report:omit', 'list'), - ('partial_list', 'report:partial_branches', 'regexlist'), ('partial_always_list', 'report:partial_branches_always', 'regexlist'), + ('partial_list', 'report:partial_branches', 'regexlist'), ('precision', 'report:precision', 'int'), ('show_missing', 'report:show_missing', 'boolean'), ('skip_covered', 'report:skip_covered', 'boolean'), # [html] - ('html_dir', 'html:directory'), ('extra_css', 'html:extra_css'), + ('html_dir', 'html:directory'), ('html_title', 'html:title'), # [xml] ('xml_output', 'xml:output'), ('xml_package_depth', 'xml:package_depth', 'int'), - ] + ] def _set_attr_from_config_option(self, cp, attr, where, type_=''): """Set an attribute on self if it exists in the ConfigParser.""" section, option = where.split(":") if cp.has_option(section, option): - method = getattr(cp, 'get'+type_) + method = getattr(cp, 'get' + type_) setattr(self, attr, method(section, option)) def get_plugin_options(self, plugin): """Get a dictionary of options for the plugin named `plugin`.""" return self.plugin_options.get(plugin, {}) - # TODO: docs for this. - def __setitem__(self, option_name, value): + def set_option(self, option_name, value): + """Set an option in the configuration. + + `option_name` is a colon-separated string indicating the section and + option name. For example, the ``branch`` option in the ``[run]`` + section of the config file would be indicated with `"run:branch"`. + + `value` is the new value for the option. + + """ + # Check all the hard-coded options. for option_spec in self.CONFIG_FILE_OPTIONS: attr, where = option_spec[:2] @@ -316,8 +339,17 @@ class CoverageConfig(object): # If we get here, we didn't find the option. raise CoverageException("No such option: %r" % option_name) - # TODO: docs for this. - def __getitem__(self, option_name): + def get_option(self, option_name): + """Get an option from the configuration. + + `option_name` is a colon-separated string indicating the section and + option name. For example, the ``branch`` option in the ``[run]`` + section of the config file would be indicated with `"run:branch"`. + + Returns the value of the option. + + """ + # Check all the hard-coded options. for option_spec in self.CONFIG_FILE_OPTIONS: attr, where = option_spec[:2] diff --git a/coverage/control.py b/coverage/control.py index 2c8d384e..0a5ccae6 100644 --- a/coverage/control.py +++ b/coverage/control.py @@ -1,34 +1,38 @@ -"""Core control stuff for Coverage.""" +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +"""Core control stuff for coverage.py.""" import atexit import inspect import os import platform -import random -import socket +import re import sys import traceback -from coverage import env +from coverage import env, files from coverage.annotate import AnnotateReporter from coverage.backward import string_class, iitems from coverage.collector import Collector from coverage.config import CoverageConfig -from coverage.data import CoverageData +from coverage.data import CoverageData, CoverageDataFiles from coverage.debug import DebugControl -from coverage.files import FileLocator, TreeMatcher, FnmatchMatcher +from coverage.files import TreeMatcher, FnmatchMatcher from coverage.files import PathAliases, find_python_files, prep_patterns from coverage.files import ModuleMatcher, abs_file from coverage.html import HtmlReporter from coverage.misc import CoverageException, bool_or_none, join_regex -from coverage.misc import file_be_gone, overrides +from coverage.misc import file_be_gone, isolate_module from coverage.monkey import patch_multiprocessing -from coverage.plugin import CoveragePlugin, FileReporter +from coverage.plugin import FileReporter +from coverage.plugin_support import Plugins from coverage.python import PythonFileReporter from coverage.results import Analysis, Numbers from coverage.summary import SummaryReporter from coverage.xmlreport import XmlReporter +os = isolate_module(os) # Pypy has some unusual stuff in the "stdlib". Consider those locations # when deciding where the stdlib is. @@ -97,7 +101,7 @@ class Coverage(object): in the trees indicated by the file paths or package names will be measured. - `include` and `omit` are lists of filename patterns. Files that match + `include` and `omit` are lists of file name patterns. Files that match `include` will be measured, files that match `omit` will not. Each will also accept a single string argument. @@ -109,6 +113,9 @@ class Coverage(object): results. Valid strings are "greenlet", "eventlet", "gevent", or "thread" (the default). + .. versionadded:: 4.0 + The `concurrency` parameter. + """ # Build our configuration from a number of sources: # 1: defaults: @@ -138,6 +145,9 @@ class Coverage(object): env_data_file = os.environ.get('COVERAGE_FILE') if env_data_file: self.config.data_file = env_data_file + debugs = os.environ.get('COVERAGE_DEBUG') + if debugs: + self.config.debug.extend(debugs.split(",")) # 4: from constructor arguments: self.config.from_args( @@ -166,10 +176,10 @@ class Coverage(object): # Other instance attributes, set later. self.omit = self.include = self.source = None - self.source_pkgs = self.file_locator = None - self.data = self.collector = None - self.plugins = self.file_tracing_plugins = None - self.pylib_dirs = self.cover_dir = None + self.source_pkgs = None + self.data = self.data_files = self.collector = None + self.plugins = None + self.pylib_dirs = self.cover_dirs = None self.data_suffix = self.run_suffix = None self._exclude_re = None self.debug = None @@ -186,41 +196,40 @@ class Coverage(object): """Set all the initial state. This is called by the public methods to initialize state. This lets us - construct a Coverage object, then tweak its state before this function - is called. + construct a :class:`Coverage` object, then tweak its state before this + function is called. """ - from coverage import __version__ - if self._inited: return - # Create and configure the debugging controller. + # Create and configure the debugging controller. COVERAGE_DEBUG_FILE + # is an environment variable, the name of a file to append debug logs + # to. if self._debug_file is None: - self._debug_file = sys.stderr + debug_file_name = os.environ.get("COVERAGE_DEBUG_FILE") + if debug_file_name: + self._debug_file = open(debug_file_name, "a") + else: + self._debug_file = sys.stderr self.debug = DebugControl(self.config.debug, self._debug_file) # Load plugins - self.plugins = Plugins.load_plugins(self.config.plugins, self.config) - - self.file_tracing_plugins = [] - for plugin in self.plugins: - if overrides(plugin, "file_tracer", CoveragePlugin): - self.file_tracing_plugins.append(plugin) + self.plugins = Plugins.load_plugins(self.config.plugins, self.config, self.debug) # _exclude_re is a dict that maps exclusion list names to compiled # regexes. self._exclude_re = {} self._exclude_regex_stale() - self.file_locator = FileLocator() + files.set_relative_directory() # The source argument can be directories or package names. self.source = [] self.source_pkgs = [] for src in self.config.source or []: if os.path.exists(src): - self.source.append(self.file_locator.canonical_filename(src)) + self.source.append(files.canonical_filename(src)) else: self.source_pkgs.append(src) @@ -242,17 +251,17 @@ class Coverage(object): ) # Early warning if we aren't going to be able to support plugins. - if self.file_tracing_plugins and not self.collector.supports_plugins: + if self.plugins.file_tracers and not self.collector.supports_plugins: self._warn( "Plugin file tracers (%s) aren't supported with %s" % ( ", ".join( plugin._coverage_plugin_name - for plugin in self.file_tracing_plugins + for plugin in self.plugins.file_tracers ), self.collector.tracer_name(), ) ) - for plugin in self.file_tracing_plugins: + for plugin in self.plugins.file_tracers: plugin._coverage_enabled = False # Suffixes are a bit tricky. We want to use the data suffix only when @@ -271,13 +280,10 @@ class Coverage(object): # 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=self.config.data_file, - collector="coverage v%s" % __version__, - debug=self.debug, - ) + self.data = CoverageData(debug=self.debug) + self.data_files = CoverageDataFiles(basename=self.config.data_file, warn=self._warn) - # The dirs for files considered "installed with the interpreter". + # The directories for files considered "installed with the interpreter". self.pylib_dirs = set() if not self.config.cover_pylib: # Look at where some standard modules are located. That's the @@ -285,12 +291,12 @@ class Coverage(object): # environments (virtualenv, for example), these modules may be # spread across a few locations. Look at all the candidate modules # we've imported, and take all the different ones. - for m in (atexit, os, platform, random, socket, _structseq): + for m in (atexit, inspect, os, platform, re, _structseq, traceback): if m is not None and hasattr(m, "__file__"): self.pylib_dirs.add(self._canonical_dir(m)) if _structseq and not hasattr(_structseq, '__file__'): # PyPy 2.4 has no __file__ in the builtin modules, but the code - # objects still have the filenames. So dig into one to find + # objects still have the file names. So dig into one to find # the path to exclude. structseq_new = _structseq.structseq_new try: @@ -299,9 +305,16 @@ class Coverage(object): structseq_file = structseq_new.__code__.co_filename self.pylib_dirs.add(self._canonical_dir(structseq_file)) - # To avoid tracing the coverage code itself, we skip anything located - # where we are. - self.cover_dir = self._canonical_dir(__file__) + # To avoid tracing the coverage.py code itself, we skip anything + # located where we are. + self.cover_dirs = [self._canonical_dir(__file__)] + if env.TESTING: + # When testing, we use PyContracts, which should be considered + # part of coverage.py, and it uses six. Exclude those directories + # just as we exclude ourselves. + import contracts, six + for mod in [contracts, six]: + self.cover_dirs.append(self._canonical_dir(mod)) # Set the reporting precision. Numbers.set_precision(self.config.precision) @@ -315,8 +328,8 @@ class Coverage(object): self.source_match = TreeMatcher(self.source) self.source_pkgs_match = ModuleMatcher(self.source_pkgs) else: - if self.cover_dir: - self.cover_match = TreeMatcher([self.cover_dir]) + if self.cover_dirs: + self.cover_match = TreeMatcher(self.cover_dirs) if self.pylib_dirs: self.pylib_match = TreeMatcher(self.pylib_dirs) if self.include: @@ -350,7 +363,7 @@ class Coverage(object): def _source_for_file(self, filename): """Return the source file for `filename`. - Given a filename being traced, return the best guess as to the source + Given a file name being traced, return the best guess as to the source file to attribute it to. """ @@ -376,18 +389,18 @@ class Coverage(object): # Jython is easy to guess. return filename[:-9] + ".py" - # No idea, just use the filename as-is. + # No idea, just use the file name as-is. return filename def _name_for_module(self, module_globals, filename): - """Get the name of the module for a set of globals and filename. + """Get the name of the module for a set of globals and file name. For configurability's sake, we allow __main__ modules to be matched by their importable name. If loaded via runpy (aka -m), we can usually recover the "original" full dotted module name, otherwise, we resort to interpreting the - filename to get the module's name. In the case that the module name + file name to get the module's name. In the case that the module name can't be determined, None is returned. """ @@ -424,7 +437,8 @@ class Coverage(object): Returns a FileDisposition object. """ - disp = FileDisposition(filename) + original_filename = filename + disp = _disposition_init(self.collector.file_disposition_class, filename) def nope(disp, reason): """Simple helper to make it easy to return NO.""" @@ -432,8 +446,8 @@ class Coverage(object): disp.reason = reason return disp - # Compiled Python files have two filenames: frame.f_code.co_filename is - # the filename at the time the .pyc was compiled. The second name is + # Compiled Python files have two file names: frame.f_code.co_filename is + # the file name at the time the .pyc was compiled. The second name is # __file__, which is where the .pyc was actually loaded from. Since # .pyc files can be moved after compilation (for example, by being # installed), we look for __file__ in the frame and prefer it to the @@ -441,31 +455,43 @@ class Coverage(object): dunder_file = frame.f_globals.get('__file__') if dunder_file: filename = self._source_for_file(dunder_file) + if original_filename and not original_filename.startswith('<'): + orig = os.path.basename(original_filename) + if orig != os.path.basename(filename): + # Files shouldn't be renamed when moved. This happens when + # exec'ing code. If it seems like something is wrong with + # the frame's file name, then just use the original. + filename = original_filename if not filename: # Empty string is pretty useless. - return nope(disp, "empty string isn't a filename") + return nope(disp, "empty string isn't a file name") if filename.startswith('memory:'): return nope(disp, "memory isn't traceable") if filename.startswith('<'): # Lots of non-file execution is represented with artificial - # filenames like "<string>", "<doctest readme.txt[0]>", or + # file names 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 nope(disp, "not a real filename") + return nope(disp, "not a real file name") + + # pyexpat does a dumb thing, calling the trace function explicitly from + # C code with a C file name. + if re.search(r"[/\\]Modules[/\\]pyexpat.c", filename): + return nope(disp, "pyexpat lies about itself") # Jython reports the .class file to the tracer, use the source file. if filename.endswith("$py.class"): filename = filename[:-9] + ".py" - canonical = self.file_locator.canonical_filename(filename) + canonical = files.canonical_filename(filename) disp.canonical_filename = canonical # Try the plugins, see if they have an opinion about the file. plugin = None - for plugin in self.file_tracing_plugins: + for plugin in self.plugins.file_tracers: if not plugin._coverage_enabled: continue @@ -478,10 +504,9 @@ class Coverage(object): if file_tracer.has_dynamic_source_filename(): disp.has_dynamic_filename = True else: - disp.source_filename = \ - self.file_locator.canonical_filename( - file_tracer.source_filename() - ) + disp.source_filename = files.canonical_filename( + file_tracer.source_filename() + ) break except Exception: self._warn( @@ -512,7 +537,7 @@ class Coverage(object): return disp def _check_include_omit_etc_internal(self, filename, frame): - """Check a filename against the include, omit, etc, rules. + """Check a file name against the include, omit, etc, rules. Returns a string or None. String means, don't trace, and is the reason why. None means no reason found to not trace. @@ -541,8 +566,8 @@ class Coverage(object): if self.pylib_match and self.pylib_match.match(filename): return "is in the stdlib" - # We exclude the coverage code itself, since a little of it will be - # measured otherwise. + # We exclude the coverage.py code itself, since a little of it + # will be measured otherwise. if self.cover_match and self.cover_match.match(filename): return "is part of coverage.py" @@ -561,11 +586,11 @@ class Coverage(object): """ disp = self._should_trace_internal(filename, frame) if self.debug.should('trace'): - self.debug.write(disp.debug_message()) + self.debug.write(_disposition_debug_msg(disp)) return disp def _check_include_omit_etc(self, filename, frame): - """Check a filename against the include/omit/etc, rules, verbosely. + """Check a file name against the include/omit/etc, rules, verbosely. Returns a boolean: True if the file should be traced, False if not. @@ -583,33 +608,70 @@ class Coverage(object): def _warn(self, msg): """Use `msg` as a warning.""" self._warnings.append(msg) - if self.debug.should("pid"): + if self.debug.should('pid'): msg = "[%d] %s" % (os.getpid(), msg) sys.stderr.write("Coverage.py warning: %s\n" % msg) - def use_cache(self, usecache): - """Control the use of a data file (incorrectly called a cache). + def get_option(self, option_name): + """Get an option from the configuration. + + `option_name` is a colon-separated string indicating the section and + option name. For example, the ``branch`` option in the ``[run]`` + section of the config file would be indicated with `"run:branch"`. - `usecache` is true or false, whether to read and write data on disk. + Returns the value of the option. + + .. versionadded:: 4.0 """ + return self.config.get_option(option_name) + + def set_option(self, option_name, value): + """Set an option in the configuration. + + `option_name` is a colon-separated string indicating the section and + option name. For example, the ``branch`` option in the ``[run]`` + section of the config file would be indicated with ``"run:branch"``. + + `value` is the new value for the option. This should be a Python + value where appropriate. For example, use True for booleans, not the + string ``"True"``. + + As an example, calling:: + + cov.set_option("run:branch", True) + + has the same effect as this configuration file:: + + [run] + branch = True + + .. versionadded:: 4.0 + + """ + self.config.set_option(option_name, value) + + def use_cache(self, usecache): + """Obsolete method.""" self._init() - self.data.usefile(usecache) + if not usecache: + self._warn("use_cache(False) is no longer supported.") def load(self): """Load previously-collected coverage data from the data file.""" self._init() self.collector.reset() - self.data.read() + self.data_files.read(self.data) def start(self): """Start measuring code coverage. - Coverage measurement actually occurs in functions called after `start` - is invoked. Statements in the same scope as `start` won't be measured. + Coverage measurement actually occurs in functions called after + :meth:`start` is invoked. Statements in the same scope as + :meth:`start` won't be measured. - Once you invoke `start`, you must also call `stop` eventually, or your - process might not shut down cleanly. + Once you invoke :meth:`start`, you must also call :meth:`stop` + eventually, or your process might not shut down cleanly. """ self._init() @@ -647,6 +709,7 @@ class Coverage(object): self._init() self.collector.reset() self.data.erase() + self.data_files.erase(parallel=self.config.parallel) def clear_exclude(self, which='exclude'): """Clear the exclude list.""" @@ -688,8 +751,8 @@ class Coverage(object): def get_exclude_list(self, which='exclude'): """Return a list of excluded regex patterns. - `which` indicates which list is desired. See `exclude` for the lists - that are available, and their meaning. + `which` indicates which list is desired. See :meth:`exclude` for the + lists that are available, and their meaning. """ self._init() @@ -698,62 +761,53 @@ class Coverage(object): def save(self): """Save the collected coverage data to the data file.""" self._init() - data_suffix = self.data_suffix - if data_suffix is True: - # 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. - extra = "" - if _TEST_NAME_FILE: # pragma: debugging - with open(_TEST_NAME_FILE) as f: - test_name = f.read() - extra = "." + test_name - data_suffix = "%s%s.%s.%06d" % ( - socket.gethostname(), extra, os.getpid(), - random.randint(0, 999999) - ) + self.get_data() + self.data_files.write(self.data, suffix=self.data_suffix) - self._harvest_data() - self.data.write(suffix=data_suffix) - - def combine(self, data_dirs=None): + def combine(self, data_paths=None): """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. - `data_dirs` is a list of directories from which data files should be - combined. If no list is passed, then the data files from the current - directory will be combined. + `data_paths` is a list of files or directories from which data should + be combined. If no list is passed, then the data files from the + directory indicated by the current data file (probably the current + directory) will be combined. + + .. versionadded:: 4.0 + The `data_paths` parameter. """ self._init() + self.get_data() + aliases = None if self.config.paths: - aliases = PathAliases(self.file_locator) + aliases = PathAliases() for paths in self.config.paths.values(): result = paths[0] for pattern in paths[1:]: aliases.add(pattern, result) - self.data.combine_parallel_data(aliases=aliases, data_dirs=data_dirs) - def _harvest_data(self): + self.data_files.combine_parallel_data(self.data, aliases=aliases, data_paths=data_paths) + + def get_data(self): """Get the collected data and reset the collector. Also warn about various problems collecting data. + Returns a :class:`coverage.CoverageData`, the collected coverage data. + + .. versionadded:: 4.0 + """ self._init() if not self._measured: - return + return self.data - # TODO: seems like this parallel structure is getting kinda old... - self.data.add_line_data(self.collector.get_line_data()) - self.data.add_arc_data(self.collector.get_arc_data()) - self.data.add_plugin_data(self.collector.get_plugin_data()) - self.collector.reset() + self.collector.save_data(self.data) # If there are still entries in the source_pkgs list, then we never # encountered those packages. @@ -767,20 +821,16 @@ class Coverage(object): ): self._warn("Module %s has no Python source." % pkg) else: - self._warn( - "Module %s was previously imported, " - "but not measured." % pkg - ) + self._warn("Module %s was previously imported, but not measured." % pkg) # Find out if we got any data. - summary = self.data.summary() - if not summary and self._warn_no_data: + if not self.data and self._warn_no_data: self._warn("No data was collected.") # Find files that were never executed at all. for src in self.source: for py_file in find_python_files(src): - py_file = self.file_locator.canonical_filename(py_file) + py_file = files.canonical_filename(py_file) if self.omit_match and self.omit_match.match(py_file): # Turns out this file was omitted, so don't pull it back @@ -789,7 +839,11 @@ class Coverage(object): self.data.touch_file(py_file) + if self.config.note: + self.data.add_run_info(note=self.config.note) + self._measured = False + return self.data # Backward compatibility with version 1. def analysis(self, morf): @@ -800,10 +854,10 @@ class Coverage(object): def analysis2(self, morf): """Analyze a module. - `morf` is a module or a filename. It will be analyzed to determine + `morf` is a module or a file name. It will be analyzed to determine its coverage statistics. The return value is a 5-tuple: - * The filename for the module. + * The file name 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 @@ -830,19 +884,20 @@ class Coverage(object): Returns an `Analysis` object. """ - self._harvest_data() + self.get_data() if not isinstance(it, FileReporter): it = self._get_file_reporter(it) - return Analysis(self, it) + return Analysis(self.data, it) def _get_file_reporter(self, morf): - """Get a FileReporter for a module or filename.""" + """Get a FileReporter for a module or file name.""" plugin = None + file_reporter = "python" if isinstance(morf, string_class): abs_morf = abs_file(morf) - plugin_name = self.data.plugin_data().get(abs_morf) + plugin_name = self.data.file_tracer(abs_morf) if plugin_name: plugin = self.plugins.get(plugin_name) @@ -854,25 +909,19 @@ class Coverage(object): plugin._coverage_plugin_name, morf ) ) - else: - file_reporter = PythonFileReporter(morf, self) - # The FileReporter can have a name attribute, but if it doesn't, we'll - # supply it as the relative path to self.filename. - if not hasattr(file_reporter, "name"): - file_reporter.name = self.file_locator.relative_filename( - file_reporter.filename - ) + if file_reporter == "python": + file_reporter = PythonFileReporter(morf, self) return file_reporter def _get_file_reporters(self, morfs=None): - """Get a list of FileReporters for a list of modules or filenames. + """Get a list of FileReporters for a list of modules or file names. - For each module or filename in `morfs`, find a FileReporter. Return + For each module or file name in `morfs`, find a FileReporter. Return the list of FileReporters. - If `morfs` is a single module or filename, this returns a list of one + If `morfs` is a single module or file name, this returns a list of one FileReporter. If `morfs` is empty or None, then the list of all files measured is used to find the FileReporters. @@ -901,14 +950,14 @@ class Coverage(object): Each module in `morfs` is listed, with counts of statements, executed statements, missing statements, and a list of lines missed. - `include` is a list of filename patterns. Files that match will be + `include` is a list of file name patterns. Files that match will be included in the report. Files matching `omit` will not be included in the report. Returns a float, the total percentage covered. """ - self._harvest_data() + self.get_data() self.config.from_args( ignore_errors=ignore_errors, omit=omit, include=include, show_missing=show_missing, skip_covered=skip_covered, @@ -927,10 +976,10 @@ class Coverage(object): marker to indicate the coverage of the line. Covered lines have ">", excluded lines have "-", and missing lines have "!". - See `coverage.report()` for other arguments. + See :meth:`report` for other arguments. """ - self._harvest_data() + self.get_data() self.config.from_args( ignore_errors=ignore_errors, omit=omit, include=include ) @@ -951,12 +1000,12 @@ class Coverage(object): `title` is a text string (not HTML) to use as the title of the HTML report. - See `coverage.report()` for other arguments. + See :meth:`report` for other arguments. Returns a float, the total percentage covered. """ - self._harvest_data() + self.get_data() self.config.from_args( ignore_errors=ignore_errors, omit=omit, include=include, html_dir=directory, extra_css=extra_css, html_title=title, @@ -975,12 +1024,12 @@ class Coverage(object): 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. + See :meth:`report` for other arguments. Returns a float, the total percentage covered. """ - self._harvest_data() + self.get_data() self.config.from_args( ignore_errors=ignore_errors, omit=omit, include=include, xml_output=outfile, @@ -998,10 +1047,13 @@ class Coverage(object): output_dir = os.path.dirname(self.config.xml_output) if output_dir and not os.path.isdir(output_dir): os.makedirs(output_dir) - outfile = open(self.config.xml_output, "w") + open_kwargs = {} + if env.PY3: + open_kwargs['encoding'] = 'utf8' + outfile = open(self.config.xml_output, "w", **open_kwargs) file_to_close = outfile try: - reporter = XmlReporter(self, self.config, self.file_locator) + reporter = XmlReporter(self, self.config) return reporter.report(morfs, outfile=outfile) except CoverageException: delete_file = True @@ -1018,13 +1070,9 @@ class Coverage(object): import coverage as covmod self._init() - try: - implementation = platform.python_implementation() - except AttributeError: - implementation = "unknown" ft_plugins = [] - for ft in self.file_tracing_plugins: + for ft in self.plugins.file_tracers: ft_name = ft._coverage_plugin_name if not ft._coverage_enabled: ft_name += " (disabled)" @@ -1033,16 +1081,16 @@ class Coverage(object): info = [ ('version', covmod.__version__), ('coverage', covmod.__file__), - ('cover_dir', self.cover_dir), + ('cover_dirs', self.cover_dirs), ('pylib_dirs', self.pylib_dirs), ('tracer', self.collector.tracer_name()), - ('file_tracing_plugins', ft_plugins), + ('plugins.file_tracers', ft_plugins), ('config_files', self.config.attempted_config_files), ('configs_read', self.config.config_files), - ('data_path', self.data.filename), + ('data_path', self.data_files.filename), ('python', sys.version.replace('\n', '')), ('platform', platform.platform()), - ('implementation', implementation), + ('implementation', platform.python_implementation()), ('executable', sys.executable), ('cwd', os.getcwd()), ('path', sys.path), @@ -1071,36 +1119,32 @@ class Coverage(object): return info -class FileDisposition(object): - """A simple object for noting a number of details of files to trace.""" - def __init__(self, original_filename): - self.original_filename = original_filename - self.canonical_filename = original_filename - self.source_filename = None - self.trace = False - self.reason = "" - self.file_tracer = None - self.has_dynamic_filename = False - - def __repr__(self): - ret = "FileDisposition %r" % (self.original_filename,) - if self.trace: - ret += " trace" - else: - ret += " notrace=%r" % (self.reason,) - if self.file_tracer: - ret += " file_tracer=%r" % (self.file_tracer,) - return "<" + ret + ">" - - def debug_message(self): - """Produce a debugging message explaining the outcome.""" - if self.trace: - msg = "Tracing %r" % (self.original_filename,) - if self.file_tracer: - msg += ": will be traced by %r" % self.file_tracer - else: - msg = "Not tracing %r: %s" % (self.original_filename, self.reason) - return msg +# FileDisposition "methods": FileDisposition is a pure value object, so it can +# be implemented in either C or Python. Acting on them is done with these +# functions. + +def _disposition_init(cls, original_filename): + """Construct and initialize a new FileDisposition object.""" + disp = cls() + disp.original_filename = original_filename + disp.canonical_filename = original_filename + disp.source_filename = None + disp.trace = False + disp.reason = "" + disp.file_tracer = None + disp.has_dynamic_filename = False + return disp + + +def _disposition_debug_msg(disp): + """Make a nice debug message of what the FileDisposition is doing.""" + if disp.trace: + msg = "Tracing %r" % (disp.original_filename,) + if disp.file_tracer: + msg += ": will be traced by %r" % disp.file_tracer + else: + msg = "Not tracing %r: %s" % (disp.original_filename, disp.reason) + return msg def process_startup(): @@ -1132,7 +1176,7 @@ def process_startup(): # because some virtualenv configurations make the same directory visible # twice in sys.path. This means that the .pth file will be found twice, # and executed twice, executing this function twice. We set a global - # flag (an attribute on this function) to indicate that coverage has + # flag (an attribute on this function) to indicate that coverage.py has # already been started, so we can avoid doing it twice. # # https://bitbucket.org/ned/coveragepy/issue/340/keyerror-subpy has more @@ -1140,7 +1184,7 @@ def process_startup(): if hasattr(process_startup, "done"): # We've annotated this function before, so we must have already - # started coverage in this process. Nothing to do. + # started coverage.py in this process. Nothing to do. return process_startup.done = True @@ -1148,55 +1192,3 @@ def process_startup(): cov.start() cov._warn_no_data = False cov._warn_unimported_source = False - - -# A hack for debugging testing in sub-processes. -_TEST_NAME_FILE = "" # "/tmp/covtest.txt" - - -class Plugins(object): - """The currently loaded collection of coverage.py plugins.""" - - def __init__(self): - self.order = [] - self.names = {} - - @classmethod - def load_plugins(cls, modules, config): - """Load plugins from `modules`. - - Returns a list of loaded and configured plugins. - - """ - plugins = cls() - - for module in modules: - __import__(module) - mod = sys.modules[module] - - plugin_class = getattr(mod, "Plugin", None) - if plugin_class: - options = config.get_plugin_options(module) - plugin = plugin_class(options) - plugin._coverage_plugin_name = module - plugin._coverage_enabled = True - plugins.order.append(plugin) - plugins.names[module] = plugin - else: - raise CoverageException( - "Plugin module %r didn't define a Plugin class" % module - ) - - return plugins - - def __nonzero__(self): - return bool(self.order) - - __bool__ = __nonzero__ - - def __iter__(self): - return iter(self.order) - - def get(self, plugin_name): - """Return a plugin by name.""" - return self.names[plugin_name] diff --git a/coverage/ctracer/datastack.c b/coverage/ctracer/datastack.c new file mode 100644 index 00000000..5a384e6b --- /dev/null +++ b/coverage/ctracer/datastack.c @@ -0,0 +1,42 @@ +/* Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 */ +/* For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt */ + +#include "util.h" +#include "datastack.h" + +#define STACK_DELTA 100 + +int +DataStack_init(Stats *pstats, DataStack *pdata_stack) +{ + pdata_stack->depth = -1; + pdata_stack->stack = NULL; + pdata_stack->alloc = 0; + return RET_OK; +} + +void +DataStack_dealloc(Stats *pstats, DataStack *pdata_stack) +{ + PyMem_Free(pdata_stack->stack); +} + +int +DataStack_grow(Stats *pstats, DataStack *pdata_stack) +{ + pdata_stack->depth++; + if (pdata_stack->depth >= pdata_stack->alloc) { + /* We've outgrown our data_stack array: make it bigger. */ + int bigger = pdata_stack->alloc + STACK_DELTA; + DataStackEntry * bigger_data_stack = PyMem_Realloc(pdata_stack->stack, bigger * sizeof(DataStackEntry)); + STATS( pstats->stack_reallocs++; ) + if (bigger_data_stack == NULL) { + PyErr_NoMemory(); + pdata_stack->depth--; + return RET_ERROR; + } + pdata_stack->stack = bigger_data_stack; + pdata_stack->alloc = bigger; + } + return RET_OK; +} diff --git a/coverage/ctracer/datastack.h b/coverage/ctracer/datastack.h new file mode 100644 index 00000000..78f85f7e --- /dev/null +++ b/coverage/ctracer/datastack.h @@ -0,0 +1,45 @@ +/* Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 */ +/* For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt */ + +#ifndef _COVERAGE_DATASTACK_H +#define _COVERAGE_DATASTACK_H + +#include "util.h" +#include "stats.h" + +/* An entry on the data stack. For each call frame, we need to record all + * the information needed for CTracer_handle_line to operate as quickly as + * possible. All PyObject* here are borrowed references. + */ +typedef struct DataStackEntry { + /* The current file_data dictionary. Borrowed, owned by self->data. */ + PyObject * file_data; + + /* The disposition object for this frame. If collector.py and control.py + * are working properly, this will be an instance of CFileDisposition. + */ + PyObject * disposition; + + /* The FileTracer handling this frame, or None if it's Python. */ + PyObject * file_tracer; + + /* The line number of the last line recorded, for tracing arcs. + -1 means there was no previous line, as when entering a code object. + */ + int last_line; +} DataStackEntry; + +/* A data stack is a dynamically allocated vector of DataStackEntry's. */ +typedef struct DataStack { + int depth; /* The index of the last-used entry in stack. */ + int alloc; /* number of entries allocated at stack. */ + /* The file data at each level, or NULL if not recording. */ + DataStackEntry * stack; +} DataStack; + + +int DataStack_init(Stats * pstats, DataStack *pdata_stack); +void DataStack_dealloc(Stats * pstats, DataStack *pdata_stack); +int DataStack_grow(Stats * pstats, DataStack *pdata_stack); + +#endif /* _COVERAGE_DATASTACK_H */ diff --git a/coverage/ctracer/filedisp.c b/coverage/ctracer/filedisp.c new file mode 100644 index 00000000..479a2c9f --- /dev/null +++ b/coverage/ctracer/filedisp.c @@ -0,0 +1,85 @@ +/* Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 */ +/* For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt */ + +#include "util.h" +#include "filedisp.h" + +void +CFileDisposition_dealloc(CFileDisposition *self) +{ + Py_XDECREF(self->original_filename); + Py_XDECREF(self->canonical_filename); + Py_XDECREF(self->source_filename); + Py_XDECREF(self->trace); + Py_XDECREF(self->reason); + Py_XDECREF(self->file_tracer); + Py_XDECREF(self->has_dynamic_filename); +} + +static PyMemberDef +CFileDisposition_members[] = { + { "original_filename", T_OBJECT, offsetof(CFileDisposition, original_filename), 0, + PyDoc_STR("") }, + + { "canonical_filename", T_OBJECT, offsetof(CFileDisposition, canonical_filename), 0, + PyDoc_STR("") }, + + { "source_filename", T_OBJECT, offsetof(CFileDisposition, source_filename), 0, + PyDoc_STR("") }, + + { "trace", T_OBJECT, offsetof(CFileDisposition, trace), 0, + PyDoc_STR("") }, + + { "reason", T_OBJECT, offsetof(CFileDisposition, reason), 0, + PyDoc_STR("") }, + + { "file_tracer", T_OBJECT, offsetof(CFileDisposition, file_tracer), 0, + PyDoc_STR("") }, + + { "has_dynamic_filename", T_OBJECT, offsetof(CFileDisposition, has_dynamic_filename), 0, + PyDoc_STR("") }, + + { NULL } +}; + +PyTypeObject +CFileDispositionType = { + MyType_HEAD_INIT + "coverage.CFileDispositionType", /*tp_name*/ + sizeof(CFileDisposition), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + (destructor)CFileDisposition_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ + "CFileDisposition objects", /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + CFileDisposition_members, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ +}; diff --git a/coverage/ctracer/filedisp.h b/coverage/ctracer/filedisp.h new file mode 100644 index 00000000..ada68eaf --- /dev/null +++ b/coverage/ctracer/filedisp.h @@ -0,0 +1,26 @@ +/* Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 */ +/* For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt */ + +#ifndef _COVERAGE_FILEDISP_H +#define _COVERAGE_FILEDISP_H + +#include "util.h" +#include "structmember.h" + +typedef struct CFileDisposition { + PyObject_HEAD + + PyObject * original_filename; + PyObject * canonical_filename; + PyObject * source_filename; + PyObject * trace; + PyObject * reason; + PyObject * file_tracer; + PyObject * has_dynamic_filename; +} CFileDisposition; + +void CFileDisposition_dealloc(CFileDisposition *self); + +extern PyTypeObject CFileDispositionType; + +#endif /* _COVERAGE_FILEDISP_H */ diff --git a/coverage/ctracer/module.c b/coverage/ctracer/module.c new file mode 100644 index 00000000..76231859 --- /dev/null +++ b/coverage/ctracer/module.c @@ -0,0 +1,108 @@ +/* Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 */ +/* For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt */ + +#include "util.h" +#include "tracer.h" +#include "filedisp.h" + +/* Module definition */ + +#define MODULE_DOC PyDoc_STR("Fast coverage tracer.") + +#if PY_MAJOR_VERSION >= 3 + +static PyModuleDef +moduledef = { + PyModuleDef_HEAD_INIT, + "coverage.tracer", + MODULE_DOC, + -1, + NULL, /* methods */ + NULL, + NULL, /* traverse */ + NULL, /* clear */ + NULL +}; + + +PyObject * +PyInit_tracer(void) +{ + PyObject * mod = PyModule_Create(&moduledef); + if (mod == NULL) { + return NULL; + } + + if (CTracer_intern_strings() < 0) { + return NULL; + } + + /* Initialize CTracer */ + CTracerType.tp_new = PyType_GenericNew; + if (PyType_Ready(&CTracerType) < 0) { + Py_DECREF(mod); + return NULL; + } + + Py_INCREF(&CTracerType); + if (PyModule_AddObject(mod, "CTracer", (PyObject *)&CTracerType) < 0) { + Py_DECREF(mod); + Py_DECREF(&CTracerType); + return NULL; + } + + /* Initialize CFileDisposition */ + CFileDispositionType.tp_new = PyType_GenericNew; + if (PyType_Ready(&CFileDispositionType) < 0) { + Py_DECREF(mod); + Py_DECREF(&CTracerType); + return NULL; + } + + Py_INCREF(&CFileDispositionType); + if (PyModule_AddObject(mod, "CFileDisposition", (PyObject *)&CFileDispositionType) < 0) { + Py_DECREF(mod); + Py_DECREF(&CTracerType); + Py_DECREF(&CFileDispositionType); + return NULL; + } + + return mod; +} + +#else + +void +inittracer(void) +{ + PyObject * mod; + + mod = Py_InitModule3("coverage.tracer", NULL, MODULE_DOC); + if (mod == NULL) { + return; + } + + if (CTracer_intern_strings() < 0) { + return; + } + + /* Initialize CTracer */ + CTracerType.tp_new = PyType_GenericNew; + if (PyType_Ready(&CTracerType) < 0) { + return; + } + + Py_INCREF(&CTracerType); + PyModule_AddObject(mod, "CTracer", (PyObject *)&CTracerType); + + /* Initialize CFileDisposition */ + CFileDispositionType.tp_new = PyType_GenericNew; + if (PyType_Ready(&CFileDispositionType) < 0) { + return; + } + + Py_INCREF(&CFileDispositionType); + PyModule_AddObject(mod, "CFileDisposition", (PyObject *)&CFileDispositionType); +} + +#endif /* Py3k */ diff --git a/coverage/ctracer/stats.h b/coverage/ctracer/stats.h new file mode 100644 index 00000000..ceba79bd --- /dev/null +++ b/coverage/ctracer/stats.h @@ -0,0 +1,30 @@ +/* Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 */ +/* For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt */ + +#ifndef _COVERAGE_STATS_H +#define _COVERAGE_STATS_H + +#include "util.h" + +#if COLLECT_STATS +#define STATS(x) x +#else +#define STATS(x) +#endif + +typedef struct Stats { + unsigned int calls; /* Need at least one member, but the rest only if needed. */ +#if COLLECT_STATS + 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; + unsigned int pycalls; +#endif +} Stats; + +#endif /* _COVERAGE_STATS_H */ diff --git a/coverage/tracer.c b/coverage/ctracer/tracer.c index fe40fc67..25036f99 100644 --- a/coverage/tracer.c +++ b/coverage/ctracer/tracer.c @@ -1,52 +1,12 @@ -/* C-based Tracer for Coverage. */ +/* Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 */ +/* For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt */ -#include "Python.h" -#include "structmember.h" -#include "frameobject.h" -#include "opcode.h" +/* C-based Tracer for coverage.py. */ -/* 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 */ - -#if PY_MAJOR_VERSION >= 3 - -#define MyText_Type PyUnicode_Type -#define MyText_AS_BYTES(o) PyUnicode_AsASCIIString(o) -#define MyBytes_AS_STRING(o) PyBytes_AS_STRING(o) -#define MyText_AsString(o) PyUnicode_AsUTF8(o) -#define MyText_FromFormat PyUnicode_FromFormat -#define MyInt_FromInt(i) PyLong_FromLong((long)i) -#define MyInt_AsInt(o) (int)PyLong_AsLong(o) - -#define MyType_HEAD_INIT PyVarObject_HEAD_INIT(NULL, 0) - -#else - -#define MyText_Type PyString_Type -#define MyText_AS_BYTES(o) (Py_INCREF(o), o) -#define MyBytes_AS_STRING(o) PyString_AS_STRING(o) -#define MyText_AsString(o) PyString_AsString(o) -#define MyText_FromFormat PyUnicode_FromFormat -#define MyInt_FromInt(i) PyInt_FromLong((long)i) -#define MyInt_AsInt(o) (int)PyInt_AsLong(o) - -#define MyType_HEAD_INIT PyObject_HEAD_INIT(NULL) 0, - -#endif /* Py3k */ - -/* The values returned to indicate ok or error. */ -#define RET_OK 0 -#define RET_ERROR -1 +#include "util.h" +#include "datastack.h" +#include "filedisp.h" +#include "tracer.h" /* Python C API helpers. */ @@ -63,155 +23,49 @@ pyint_as_int(PyObject * pyint, int *pint) } -/* An entry on the data stack. For each call frame, we need to record all - * the information needed for CTracer_handle_line to operate as quickly as - * possible. - */ -typedef struct { - /* The current file_data dictionary. Borrowed, owned by self->data. */ - PyObject * file_data; - - /* The disposition object for this frame. */ - PyObject * disposition; - - /* The FileTracer handling this frame, or None if it's Python. */ - PyObject * file_tracer; - - /* The line number of the last line recorded, for tracing arcs. - -1 means there was no previous line, as when entering a code object. - */ - int last_line; -} DataStackEntry; - -/* A data stack is a dynamically allocated vector of DataStackEntry's. */ -typedef struct { - int depth; /* The index of the last-used entry in stack. */ - int alloc; /* number of entries allocated at stack. */ - /* The file data at each level, or NULL if not recording. */ - DataStackEntry * stack; -} DataStack; - -/* The CTracer type. */ - -typedef struct { - PyObject_HEAD - - /* Python objects manipulated directly by the Collector class. */ - PyObject * should_trace; - PyObject * check_include; - PyObject * warn; - PyObject * concur_id_func; - PyObject * data; - PyObject * plugin_data; - PyObject * should_trace_cache; - PyObject * arcs; - - /* Has the tracer been started? */ - int started; - /* Are we tracing arcs, or just lines? */ - int tracing_arcs; - - /* - The data stack is a stack of dictionaries. Each dictionary collects - 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 - (None). - */ - - DataStack data_stack; /* Used if we aren't doing concurrency. */ - - PyObject * data_stack_index; /* Used if we are doing concurrency. */ - DataStack * data_stacks; - int data_stacks_alloc; - int data_stacks_used; - DataStack * pdata_stack; - - /* The current file's data stack entry, copied from the stack. */ - DataStackEntry cur_entry; +/* Interned strings to speed GetAttr etc. */ - /* The parent frame for the last exception event, to fix missing returns. */ - PyFrameObject * last_exc_back; - int last_exc_firstlineno; +static PyObject *str_trace; +static PyObject *str_file_tracer; +static PyObject *str__coverage_enabled; +static PyObject *str__coverage_plugin; +static PyObject *str__coverage_plugin_name; +static PyObject *str_dynamic_source_filename; +static PyObject *str_line_number_range; -#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 */ -} CTracer; +int +CTracer_intern_strings(void) +{ + int ret = RET_ERROR; +#define INTERN_STRING(v, s) \ + v = MyText_InternFromString(s); \ + if (v == NULL) { \ + goto error; \ + } -#define STACK_DELTA 100 + INTERN_STRING(str_trace, "trace") + INTERN_STRING(str_file_tracer, "file_tracer") + INTERN_STRING(str__coverage_enabled, "_coverage_enabled") + INTERN_STRING(str__coverage_plugin, "_coverage_plugin") + INTERN_STRING(str__coverage_plugin_name, "_coverage_plugin_name") + INTERN_STRING(str_dynamic_source_filename, "dynamic_source_filename") + INTERN_STRING(str_line_number_range, "line_number_range") -static int -DataStack_init(CTracer *self, DataStack *pdata_stack) -{ - pdata_stack->depth = -1; - pdata_stack->stack = NULL; - pdata_stack->alloc = 0; - return RET_OK; -} - -static void -DataStack_dealloc(CTracer *self, DataStack *pdata_stack) -{ - PyMem_Free(pdata_stack->stack); -} + ret = RET_OK; -static int -DataStack_grow(CTracer *self, DataStack *pdata_stack) -{ - pdata_stack->depth++; - if (pdata_stack->depth >= pdata_stack->alloc) { - STATS( self->stats.stack_reallocs++; ) - /* We've outgrown our data_stack array: make it bigger. */ - int bigger = pdata_stack->alloc + STACK_DELTA; - DataStackEntry * bigger_data_stack = PyMem_Realloc(pdata_stack->stack, bigger * sizeof(DataStackEntry)); - if (bigger_data_stack == NULL) { - PyErr_NoMemory(); - pdata_stack->depth--; - return RET_ERROR; - } - pdata_stack->stack = bigger_data_stack; - pdata_stack->alloc = bigger; - } - return RET_OK; +error: + return ret; } - static void CTracer_disable_plugin(CTracer *self, PyObject * disposition); static int CTracer_init(CTracer *self, PyObject *args_unused, PyObject *kwds_unused) { int ret = RET_ERROR; - PyObject * weakref = NULL; - if (DataStack_init(self, &self->data_stack) < 0) { - goto error; - } - - weakref = PyImport_ImportModule("weakref"); - if (weakref == NULL) { - goto error; - } - self->data_stack_index = PyObject_CallMethod(weakref, "WeakKeyDictionary", NULL); - Py_XDECREF(weakref); - - if (self->data_stack_index == NULL) { + if (DataStack_init(&self->stats, &self->data_stack) < 0) { goto error; } @@ -243,13 +97,13 @@ CTracer_dealloc(CTracer *self) Py_XDECREF(self->warn); Py_XDECREF(self->concur_id_func); Py_XDECREF(self->data); - Py_XDECREF(self->plugin_data); + Py_XDECREF(self->file_tracers); Py_XDECREF(self->should_trace_cache); - DataStack_dealloc(self, &self->data_stack); + DataStack_dealloc(&self->stats, &self->data_stack); if (self->data_stacks) { for (i = 0; i < self->data_stacks_used; i++) { - DataStack_dealloc(self, self->data_stacks + i); + DataStack_dealloc(&self->stats, self->data_stacks + i); } PyMem_Free(self->data_stacks); } @@ -345,6 +199,23 @@ CTracer_set_pdata_stack(CTracer *self) if (self->concur_id_func != Py_None) { int the_index = 0; + if (self->data_stack_index == NULL) { + PyObject * weakref = NULL; + + weakref = PyImport_ImportModule("weakref"); + if (weakref == NULL) { + goto error; + } + STATS( self->stats.pycalls++; ) + self->data_stack_index = PyObject_CallMethod(weakref, "WeakKeyDictionary", NULL); + Py_XDECREF(weakref); + + if (self->data_stack_index == NULL) { + goto error; + } + } + + STATS( self->stats.pycalls++; ) co_obj = PyObject_CallObject(self->concur_id_func, NULL); if (co_obj == NULL) { goto error; @@ -374,7 +245,7 @@ CTracer_set_pdata_stack(CTracer *self) self->data_stacks = bigger_stacks; self->data_stacks_alloc = bigger; } - DataStack_init(self, &self->data_stacks[the_index]); + DataStack_init(&self->stats, &self->data_stacks[the_index]); } else { if (pyint_as_int(stack_index, &the_index) < 0) { @@ -451,16 +322,19 @@ CTracer_handle_call(CTracer *self, PyFrameObject *frame) int ret2; /* Owned references that we clean up at the very end of the function. */ - PyObject * tracename = NULL; PyObject * disposition = NULL; - PyObject * disp_trace = NULL; - PyObject * file_tracer = NULL; PyObject * plugin = NULL; PyObject * plugin_name = NULL; - PyObject * has_dynamic_filename = NULL; + PyObject * next_tracename = NULL; /* Borrowed references. */ PyObject * filename = NULL; + PyObject * disp_trace = NULL; + PyObject * tracename = NULL; + PyObject * file_tracer = NULL; + PyObject * has_dynamic_filename = NULL; + + CFileDisposition * pdisp = NULL; STATS( self->stats.calls++; ) @@ -468,7 +342,7 @@ CTracer_handle_call(CTracer *self, PyFrameObject *frame) if (CTracer_set_pdata_stack(self) < 0) { goto error; } - if (DataStack_grow(self, self->pdata_stack) < 0) { + if (DataStack_grow(&self->stats, self->pdata_stack) < 0) { goto error; } @@ -483,8 +357,10 @@ CTracer_handle_call(CTracer *self, PyFrameObject *frame) goto error; } STATS( self->stats.new_files++; ) + /* We've never considered this file before. */ /* Ask should_trace about it. */ + STATS( self->stats.pycalls++; ) disposition = PyObject_CallFunctionObjArgs(self->should_trace, filename, frame, NULL); if (disposition == NULL) { /* An error occurred inside should_trace. */ @@ -498,40 +374,48 @@ CTracer_handle_call(CTracer *self, PyFrameObject *frame) Py_INCREF(disposition); } - disp_trace = PyObject_GetAttrString(disposition, "trace"); - if (disp_trace == NULL) { - goto error; + if (disposition == Py_None) { + /* A later check_include returned false, so don't trace it. */ + disp_trace = Py_False; + } + else { + /* The object we got is a CFileDisposition, use it efficiently. */ + pdisp = (CFileDisposition *) disposition; + disp_trace = pdisp->trace; + if (disp_trace == NULL) { + goto error; + } } if (disp_trace == Py_True) { /* If tracename is a string, then we're supposed to trace. */ - tracename = PyObject_GetAttrString(disposition, "source_filename"); + tracename = pdisp->source_filename; if (tracename == NULL) { goto error; } - file_tracer = PyObject_GetAttrString(disposition, "file_tracer"); + file_tracer = pdisp->file_tracer; if (file_tracer == NULL) { goto error; } if (file_tracer != Py_None) { - plugin = PyObject_GetAttrString(file_tracer, "_coverage_plugin"); + plugin = PyObject_GetAttr(file_tracer, str__coverage_plugin); if (plugin == NULL) { goto error; } - plugin_name = PyObject_GetAttrString(plugin, "_coverage_plugin_name"); + plugin_name = PyObject_GetAttr(plugin, str__coverage_plugin_name); if (plugin_name == NULL) { goto error; } } - has_dynamic_filename = PyObject_GetAttrString(disposition, "has_dynamic_filename"); + has_dynamic_filename = pdisp->has_dynamic_filename; if (has_dynamic_filename == NULL) { goto error; } if (has_dynamic_filename == Py_True) { - PyObject * next_tracename = NULL; - next_tracename = PyObject_CallMethod( - file_tracer, "dynamic_source_filename", - "OO", tracename, frame + STATS( self->stats.pycalls++; ) + next_tracename = PyObject_CallMethodObjArgs( + file_tracer, str_dynamic_source_filename, + tracename, frame, NULL ); if (next_tracename == NULL) { /* An exception from the function. Alert the user with a @@ -541,37 +425,41 @@ CTracer_handle_call(CTracer *self, PyFrameObject *frame) /* Because we handled the error, goto ok. */ goto ok; } - Py_DECREF(tracename); tracename = next_tracename; if (tracename != Py_None) { /* Check the dynamic source filename against the include rules. */ PyObject * included = NULL; + int should_include; included = PyDict_GetItem(self->should_trace_cache, tracename); if (included == NULL) { + PyObject * should_include_bool; if (PyErr_Occurred()) { goto error; } STATS( self->stats.new_files++; ) - included = PyObject_CallFunctionObjArgs(self->check_include, tracename, frame, NULL); - if (included == NULL) { + STATS( self->stats.pycalls++; ) + should_include_bool = PyObject_CallFunctionObjArgs(self->check_include, tracename, frame, NULL); + if (should_include_bool == NULL) { goto error; } - if (PyDict_SetItem(self->should_trace_cache, tracename, included) < 0) { + should_include = (should_include_bool == Py_True); + Py_DECREF(should_include_bool); + if (PyDict_SetItem(self->should_trace_cache, tracename, should_include ? disposition : Py_None) < 0) { goto error; } } - if (included != Py_True) { - Py_DECREF(tracename); + else { + should_include = (included != Py_None); + } + if (!should_include) { tracename = Py_None; - Py_INCREF(tracename); } } } } else { tracename = Py_None; - Py_INCREF(tracename); } if (tracename != Py_None) { @@ -593,7 +481,7 @@ CTracer_handle_call(CTracer *self, PyFrameObject *frame) /* If the disposition mentions a plugin, record that. */ if (file_tracer != Py_None) { - ret2 = PyDict_SetItem(self->plugin_data, tracename, plugin_name); + ret2 = PyDict_SetItem(self->file_tracers, tracename, plugin_name); if (ret2 < 0) { goto error; } @@ -626,13 +514,10 @@ ok: ret = RET_OK; error: - Py_XDECREF(tracename); + Py_XDECREF(next_tracename); Py_XDECREF(disposition); - Py_XDECREF(disp_trace); - Py_XDECREF(file_tracer); Py_XDECREF(plugin); Py_XDECREF(plugin_name); - Py_XDECREF(has_dynamic_filename); return ret; } @@ -647,7 +532,9 @@ CTracer_disable_plugin(CTracer *self, PyObject * disposition) PyObject * msg = NULL; PyObject * ignored = NULL; - file_tracer = PyObject_GetAttrString(disposition, "file_tracer"); + PyErr_Print(); + + file_tracer = PyObject_GetAttr(disposition, str_file_tracer); if (file_tracer == NULL) { goto error; } @@ -655,33 +542,32 @@ CTracer_disable_plugin(CTracer *self, PyObject * disposition) /* This shouldn't happen... */ goto ok; } - plugin = PyObject_GetAttrString(file_tracer, "_coverage_plugin"); + plugin = PyObject_GetAttr(file_tracer, str__coverage_plugin); if (plugin == NULL) { goto error; } - plugin_name = PyObject_GetAttrString(plugin, "_coverage_plugin_name"); + plugin_name = PyObject_GetAttr(plugin, str__coverage_plugin_name); if (plugin_name == NULL) { goto error; } msg = MyText_FromFormat( - "Disabling plugin '%s' due to an exception:", + "Disabling plugin '%s' due to previous exception", MyText_AsString(plugin_name) ); if (msg == NULL) { goto error; } + STATS( self->stats.pycalls++; ) ignored = PyObject_CallFunctionObjArgs(self->warn, msg, NULL); if (ignored == NULL) { goto error; } - PyErr_Print(); - /* Disable the plugin for future files, and stop tracing this file. */ - if (PyObject_SetAttrString(plugin, "_coverage_enabled", Py_False) < 0) { + if (PyObject_SetAttr(plugin, str__coverage_enabled, Py_False) < 0) { goto error; } - if (PyObject_SetAttrString(disposition, "trace", Py_False) < 0) { + if (PyObject_SetAttr(disposition, str_trace, Py_False) < 0) { goto error; } @@ -746,12 +632,14 @@ CTracer_handle_line(CTracer *self, PyFrameObject *frame) if (self->pdata_stack->depth >= 0) { SHOWLOG(self->pdata_stack->depth, frame->f_lineno, frame->f_code->co_filename, "line"); if (self->cur_entry.file_data) { - int lineno_from, lineno_to; + int lineno_from = -1; + int lineno_to = -1; /* We're tracing in this frame: record something. */ if (self->cur_entry.file_tracer != Py_None) { PyObject * from_to = NULL; - from_to = PyObject_CallMethod(self->cur_entry.file_tracer, "line_number_range", "O", frame); + STATS( self->stats.pycalls++; ) + from_to = PyObject_CallMethodObjArgs(self->cur_entry.file_tracer, str_line_number_range, frame, NULL); if (from_to == NULL) { goto error; } @@ -814,8 +702,18 @@ CTracer_handle_return(CTracer *self, PyFrameObject *frame) } if (self->pdata_stack->depth >= 0) { if (self->tracing_arcs && self->cur_entry.file_data) { - /* Need to distinguish between RETURN_VALUE and YIELD_VALUE. */ - int bytecode = MyBytes_AS_STRING(frame->f_code->co_code)[frame->f_lasti]; + /* Need to distinguish between RETURN_VALUE and YIELD_VALUE. Read + * the current bytecode to see what it is. In unusual circumstances + * (Cython code), co_code can be the empty string, so range-check + * f_lasti before reading the byte. + */ + int bytecode = RETURN_VALUE; + PyObject * pCode = frame->f_code->co_code; + int lasti = frame->f_lasti; + + if (lasti < MyBytes_GET_SIZE(pCode)) { + bytecode = MyBytes_AS_STRING(pCode)[lasti]; + } if (bytecode != YIELD_VALUE) { int first = frame->f_code->co_firstlineno; if (CTracer_record_pair(self, self->cur_entry.last_line, -first) < 0) { @@ -873,7 +771,7 @@ CTracer_trace(CTracer *self, PyFrameObject *frame, int what, PyObject *arg_unuse #endif #if WHAT_LOG - if (what <= sizeof(what_sym)/sizeof(const char *)) { + if (what <= (int)(sizeof(what_sym)/sizeof(const char *))) { ascii = MyText_AS_BYTES(frame->f_code->co_filename); printf("trace: %s @ %s %d\n", what_sym[what], MyBytes_AS_STRING(ascii), frame->f_lineno); Py_DECREF(ascii); @@ -964,6 +862,7 @@ CTracer_call(CTracer *self, PyObject *args, PyObject *kwds) int what; int orig_lineno; PyObject *ret = NULL; + PyObject * ascii = NULL; static char *what_names[] = { "call", "exception", "line", "return", @@ -971,10 +870,6 @@ CTracer_call(CTracer *self, PyObject *args, PyObject *kwds) NULL }; - #if WHAT_LOG - printf("pytrace\n"); - #endif - static char *kwlist[] = {"frame", "event", "arg", "lineno", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!O!O|i:Tracer_call", kwlist, @@ -985,14 +880,21 @@ CTracer_call(CTracer *self, PyObject *args, PyObject *kwds) /* In Python, the what argument is a string, we need to find an int for the C function. */ for (what = 0; what_names[what]; what++) { - PyObject *ascii = MyText_AS_BYTES(what_str); - int should_break = !strcmp(MyBytes_AS_STRING(ascii), what_names[what]); + int should_break; + ascii = MyText_AS_BYTES(what_str); + should_break = !strcmp(MyBytes_AS_STRING(ascii), what_names[what]); Py_DECREF(ascii); if (should_break) { break; } } + #if WHAT_LOG + ascii = MyText_AS_BYTES(frame->f_code->co_filename); + printf("pytrace: %s @ %s %d\n", what_sym[what], MyBytes_AS_STRING(ascii), frame->f_lineno); + Py_DECREF(ascii); + #endif + /* Save off the frame's lineno, and use the forced one, if provided. */ orig_lineno = frame->f_lineno; if (lineno > 0) { @@ -1008,6 +910,32 @@ CTracer_call(CTracer *self, PyObject *args, PyObject *kwds) /* Clean up. */ frame->f_lineno = orig_lineno; + /* For better speed, install ourselves the C way so that future calls go + directly to CTracer_trace, without this intermediate function. + + Only do this if this is a CALL event, since new trace functions only + take effect then. If we don't condition it on CALL, then we'll clobber + the new trace function before it has a chance to get called. To + understand why, there are three internal values to track: frame.f_trace, + c_tracefunc, and c_traceobj. They are explained here: + http://nedbatchelder.com/text/trace-function.html + + Without the conditional on PyTrace_CALL, this is what happens: + + def func(): # f_trace c_tracefunc c_traceobj + # -------------- -------------- -------------- + # CTracer CTracer.trace CTracer + sys.settrace(my_func) + # CTracer trampoline my_func + # Now Python calls trampoline(CTracer), which calls this function + # which calls PyEval_SetTrace below, setting us as the tracer again: + # CTracer CTracer.trace CTracer + # and it's as if the settrace never happened. + */ + if (what == PyTrace_CALL) { + PyEval_SetTrace((Py_tracefunc)CTracer_trace, (PyObject*)self); + } + done: return ret; } @@ -1017,7 +945,7 @@ CTracer_start(CTracer *self, PyObject *args_unused) { PyEval_SetTrace((Py_tracefunc)CTracer_trace, (PyObject*)self); self->started = 1; - self->tracing_arcs = self->arcs && PyObject_IsTrue(self->arcs); + self->tracing_arcs = self->trace_arcs && PyObject_IsTrue(self->trace_arcs); self->cur_entry.last_line = -1; /* start() returns a trace function usable with sys.settrace() */ @@ -1041,7 +969,7 @@ CTracer_get_stats(CTracer *self) { #if COLLECT_STATS return Py_BuildValue( - "{sI,sI,sI,sI,sI,sI,sI,sI,si,sI}", + "{sI,sI,sI,sI,sI,sI,sI,sI,si,sI,sI}", "calls", self->stats.calls, "lines", self->stats.lines, "returns", self->stats.returns, @@ -1051,7 +979,8 @@ CTracer_get_stats(CTracer *self) "missed_returns", self->stats.missed_returns, "stack_reallocs", self->stats.stack_reallocs, "stack_alloc", self->pdata_stack->alloc, - "errors", self->stats.errors + "errors", self->stats.errors, + "pycalls", self->stats.pycalls ); #else Py_RETURN_NONE; @@ -1075,13 +1004,13 @@ CTracer_members[] = { { "data", T_OBJECT, offsetof(CTracer, data), 0, PyDoc_STR("The raw dictionary of trace data.") }, - { "plugin_data", T_OBJECT, offsetof(CTracer, plugin_data), 0, - PyDoc_STR("Mapping from filename to plugin name.") }, + { "file_tracers", T_OBJECT, offsetof(CTracer, file_tracers), 0, + PyDoc_STR("Mapping from file name to plugin name.") }, { "should_trace_cache", T_OBJECT, offsetof(CTracer, should_trace_cache), 0, PyDoc_STR("Dictionary caching should_trace results.") }, - { "arcs", T_OBJECT, offsetof(CTracer, arcs), 0, + { "trace_arcs", T_OBJECT, offsetof(CTracer, trace_arcs), 0, PyDoc_STR("Should we trace arcs, or just lines?") }, { NULL } @@ -1101,7 +1030,7 @@ CTracer_methods[] = { { NULL } }; -static PyTypeObject +PyTypeObject CTracerType = { MyType_HEAD_INIT "coverage.CTracer", /*tp_name*/ @@ -1142,70 +1071,3 @@ CTracerType = { 0, /* tp_alloc */ 0, /* tp_new */ }; - -/* Module definition */ - -#define MODULE_DOC PyDoc_STR("Fast coverage tracer.") - -#if PY_MAJOR_VERSION >= 3 - -static PyModuleDef -moduledef = { - PyModuleDef_HEAD_INIT, - "coverage.tracer", - MODULE_DOC, - -1, - NULL, /* methods */ - NULL, - NULL, /* traverse */ - NULL, /* clear */ - NULL -}; - - -PyObject * -PyInit_tracer(void) -{ - PyObject * mod = PyModule_Create(&moduledef); - if (mod == NULL) { - return NULL; - } - - CTracerType.tp_new = PyType_GenericNew; - if (PyType_Ready(&CTracerType) < 0) { - Py_DECREF(mod); - return NULL; - } - - Py_INCREF(&CTracerType); - if (PyModule_AddObject(mod, "CTracer", (PyObject *)&CTracerType) < 0) { - Py_DECREF(mod); - Py_DECREF(&CTracerType); - return NULL; - } - - return mod; -} - -#else - -void -inittracer(void) -{ - PyObject * mod; - - mod = Py_InitModule3("coverage.tracer", NULL, MODULE_DOC); - if (mod == NULL) { - return; - } - - CTracerType.tp_new = PyType_GenericNew; - if (PyType_Ready(&CTracerType) < 0) { - return; - } - - Py_INCREF(&CTracerType); - PyModule_AddObject(mod, "CTracer", (PyObject *)&CTracerType); -} - -#endif /* Py3k */ diff --git a/coverage/ctracer/tracer.h b/coverage/ctracer/tracer.h new file mode 100644 index 00000000..053fbf62 --- /dev/null +++ b/coverage/ctracer/tracer.h @@ -0,0 +1,68 @@ +/* Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 */ +/* For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt */ + +#ifndef _COVERAGE_TRACER_H +#define _COVERAGE_TRACER_H + +#include "util.h" +#include "structmember.h" +#include "frameobject.h" +#include "opcode.h" + +#include "datastack.h" + +/* The CTracer type. */ + +typedef struct CTracer { + PyObject_HEAD + + /* Python objects manipulated directly by the Collector class. */ + PyObject * should_trace; + PyObject * check_include; + PyObject * warn; + PyObject * concur_id_func; + PyObject * data; + PyObject * file_tracers; + PyObject * should_trace_cache; + PyObject * trace_arcs; + + /* Has the tracer been started? */ + int started; + /* Are we tracing arcs, or just lines? */ + int tracing_arcs; + + /* + The data stack is a stack of dictionaries. Each dictionary collects + 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 + (None). + */ + + DataStack data_stack; /* Used if we aren't doing concurrency. */ + + PyObject * data_stack_index; /* Used if we are doing concurrency. */ + DataStack * data_stacks; + int data_stacks_alloc; + int data_stacks_used; + DataStack * pdata_stack; + + /* The current file's data stack entry, copied from the stack. */ + DataStackEntry cur_entry; + + /* The parent frame for the last exception event, to fix missing returns. */ + PyFrameObject * last_exc_back; + int last_exc_firstlineno; + + Stats stats; +} CTracer; + +int CTracer_intern_strings(void); + +extern PyTypeObject CTracerType; + +#endif /* _COVERAGE_TRACER_H */ diff --git a/coverage/ctracer/util.h b/coverage/ctracer/util.h new file mode 100644 index 00000000..bb3ad5a3 --- /dev/null +++ b/coverage/ctracer/util.h @@ -0,0 +1,52 @@ +/* Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 */ +/* For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt */ + +#ifndef _COVERAGE_UTIL_H +#define _COVERAGE_UTIL_H + +#include <Python.h> + +/* 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. */ + +/* Py 2.x and 3.x compatibility */ + +#if PY_MAJOR_VERSION >= 3 + +#define MyText_Type PyUnicode_Type +#define MyText_AS_BYTES(o) PyUnicode_AsASCIIString(o) +#define MyBytes_GET_SIZE(o) PyBytes_GET_SIZE(o) +#define MyBytes_AS_STRING(o) PyBytes_AS_STRING(o) +#define MyText_AsString(o) PyUnicode_AsUTF8(o) +#define MyText_FromFormat PyUnicode_FromFormat +#define MyInt_FromInt(i) PyLong_FromLong((long)i) +#define MyInt_AsInt(o) (int)PyLong_AsLong(o) +#define MyText_InternFromString(s) \ + PyUnicode_InternFromString(s) + +#define MyType_HEAD_INIT PyVarObject_HEAD_INIT(NULL, 0) + +#else + +#define MyText_Type PyString_Type +#define MyText_AS_BYTES(o) (Py_INCREF(o), o) +#define MyBytes_GET_SIZE(o) PyString_GET_SIZE(o) +#define MyBytes_AS_STRING(o) PyString_AS_STRING(o) +#define MyText_AsString(o) PyString_AsString(o) +#define MyText_FromFormat PyUnicode_FromFormat +#define MyInt_FromInt(i) PyInt_FromLong((long)i) +#define MyInt_AsInt(o) (int)PyInt_AsLong(o) +#define MyText_InternFromString(s) \ + PyString_InternFromString(s) + +#define MyType_HEAD_INIT PyObject_HEAD_INIT(NULL) 0, + +#endif /* Py3k */ + +/* The values returned to indicate ok or error. */ +#define RET_OK 0 +#define RET_ERROR -1 + +#endif /* _COVERAGE_UTIL_H */ diff --git a/coverage/data.py b/coverage/data.py index 8a699b5b..17cf73ce 100644 --- a/coverage/data.py +++ b/coverage/data.py @@ -1,305 +1,766 @@ -"""Coverage data for Coverage.""" +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +"""Coverage data for coverage.py.""" import glob +import json +import optparse import os - -from coverage.backward import iitems, pickle +import os.path +import random +import re +import socket + +from coverage import env +from coverage.backward import iitems, string_class +from coverage.debug import _TEST_NAME_FILE from coverage.files import PathAliases -from coverage.misc import file_be_gone +from coverage.misc import CoverageException, file_be_gone, isolate_module + +os = isolate_module(os) class CoverageData(object): """Manages collected coverage data, including file storage. - The data file format is a pickled dict, with these keys: + This class is the public supported API to the data coverage.py collects + during program execution. It includes information about what code was + executed. It does not include information from the analysis phase, to + determine what lines could have been executed, or what lines were not + executed. - * collector: a string identifying the collecting software + .. note:: - * lines: a dict mapping filenames to sorted lists of line numbers - executed: - { 'file1': [17,23,45], 'file2': [1,2,3], ... } + The file format is not documented or guaranteed. It will change in + the future, in possibly complicated ways. Do not read coverage.py + data files directly. Use this API to avoid disruption. - * arcs: a dict mapping filenames to sorted lists of line number pairs: - { 'file1': [(17,23), (17,25), (25,26)], ... } + There are a number of kinds of data that can be collected: - * plugins: a dict mapping filenames to plugin names: - { 'file1': "django.coverage", ... } - # TODO: how to handle the difference between a plugin module - # name, and the class in the module? + * **lines**: the line numbers of source lines that were executed. + These are always available. - """ + * **arcs**: pairs of source and destination line numbers for transitions + between source lines. These are only available if branch coverage was + used. - def __init__(self, basename=None, collector=None, debug=None): - """Create a CoverageData. + * **file tracer names**: the module names of the file tracer plugins that + handled each file in the data. - `basename` is the name of the file to use for storing data. + * **run information**: information about the program execution. This is + written during "coverage run", and then accumulated during "coverage + combine". - `collector` is a string describing the coverage measurement software. + Lines, arcs, and file tracer names are stored for each source file. File + names in this API are case-sensitive, even on platforms with + case-insensitive file systems. - `debug` is a `DebugControl` object for writing debug messages. + To read a coverage.py data file, use :meth:`read_file`, or + :meth:`read_fileobj` if you have an already-opened file. You can then + access the line, arc, or file tracer data with :meth:`lines`, :meth:`arcs`, + or :meth:`file_tracer`. Run information is available with + :meth:`run_infos`. + + The :meth:`has_arcs` method indicates whether arc data is available. You + can get a list of the files in the data with :meth:`measured_files`. + A summary of the line data is available from :meth:`line_counts`. As with + most Python containers, you can determine if there is any data at all by + using this object as a boolean value. - """ - self.collector = collector or 'unknown' - self.debug = debug - self.use_file = True + Most data files will be created by coverage.py itself, but you can use + methods here to create data files if you like. The :meth:`add_lines`, + :meth:`add_arcs`, and :meth:`add_file_tracers` methods add data, in ways + that are convenient for coverage.py. The :meth:`add_run_info` method adds + key-value pairs to the run information. - # Construct the filename that will be used for data file storage, if we - # ever do any file storage. - self.filename = basename or ".coverage" - self.filename = os.path.abspath(self.filename) + To add a file without any measured data, use :meth:`touch_file`. + + You write to a named file with :meth:`write_file`, or to an already opened + file with :meth:`write_fileobj`. + + You can clear the data in memory with :meth:`erase`. Two data collections + can be combined by using :meth:`update` on one :class:`CoverageData`, + passing it the other. + + """ + + # The data file format is JSON, with these keys: + # + # * lines: a dict mapping file names to lists of line numbers + # executed:: + # + # { "file1": [17,23,45], "file2": [1,2,3], ... } + # + # * arcs: a dict mapping file names to lists of line number pairs:: + # + # { "file1": [[17,23], [17,25], [25,26]], ... } + # + # * file_tracers: a dict mapping file names to plugin names:: + # + # { "file1": "django.coverage", ... } + # + # * runs: a list of dicts of information about the coverage.py runs + # contributing to the data:: + # + # [ { "brief_sys": "CPython 2.7.10 Darwin" }, ... ] + # + # Only one of `lines` or `arcs` will be present: with branch coverage, data + # is stored as arcs. Without branch coverage, it is stored as lines. The + # line data is easily recovered from the arcs: it is all the first elements + # of the pairs that are greater than zero. + + def __init__(self, debug=None): + """Create a CoverageData. + + `debug` is a `DebugControl` object for writing debug messages. + + """ + self._debug = debug # A map from canonical Python source file name to a dictionary in # which there's an entry for each line number that has been # executed: # - # { - # 'filename1.py': { 12: None, 47: None, ... }, - # ... - # } + # { 'filename1.py': [12, 47, 1001], ... } # - self.lines = {} + self._lines = None # A map from canonical Python source file name to a dictionary with an # entry for each pair of line numbers forming an arc: # - # { - # 'filename1.py': { (12,14): None, (47,48): None, ... }, - # ... - # } + # { 'filename1.py': [(12,14), (47,48), ... ], ... } # - self.arcs = {} + self._arcs = None # A map from canonical source file name to a plugin module name: # - # { - # 'filename1.py': 'django.coverage', - # ... - # } - self.plugins = {} - - def usefile(self, use_file=True): - """Set whether or not to use a disk file for data.""" - self.use_file = use_file - - def read(self): - """Read coverage data from the coverage data file (if it exists).""" - if self.use_file: - self.lines, self.arcs, self.plugins = self._read_file(self.filename) - else: - self.lines, self.arcs, self.plugins = {}, {}, {} + # { 'filename1.py': 'django.coverage', ... } + # + self._file_tracers = {} - def write(self, suffix=None): - """Write the collected coverage data to a file. + # A list of dicts of information about the coverage.py runs. + self._runs = [] - `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. + def __repr__(self): + return "<{klass} lines={lines} arcs={arcs} tracers={tracers} runs={runs}>".format( + klass=self.__class__.__name__, + lines="None" if self._lines is None else "{{{0}}}".format(len(self._lines)), + arcs="None" if self._arcs is None else "{{{0}}}".format(len(self._arcs)), + tracers="{{{0}}}".format(len(self._file_tracers)), + runs="[{0}]".format(len(self._runs)), + ) + + ## + ## Reading data + ## + + def has_arcs(self): + """Does this data have arcs? + + Arc data is only available if branch coverage was used during + collection. + + Returns a boolean. """ - if self.use_file: - filename = self.filename - if suffix: - filename += "." + suffix - self.write_file(filename) + return self._has_arcs() - def erase(self): - """Erase the data, both in this object, and from its file storage.""" - if self.use_file: - if self.filename: - file_be_gone(self.filename) - self.lines = {} - self.arcs = {} - self.plugins = {} - - def line_data(self): - """Return the map from filenames to lists of line numbers executed.""" - return dict( - (f, sorted(lmap.keys())) for f, lmap in iitems(self.lines) - ) + def lines(self, filename): + """Get the list of lines executed for a file. - def arc_data(self): - """Return the map from filenames to lists of line number pairs.""" - return dict( - (f, sorted(amap.keys())) for f, amap in iitems(self.arcs) - ) + If the file was not measured, returns None. A file might be measured, + and have no lines executed, in which case an empty list is returned. - def plugin_data(self): - return self.plugins + If the file was executed, returns a list of integers, the line numbers + executed in the file. The list is in no particular order. - def write_file(self, filename): - """Write the coverage data to `filename`.""" + """ + if self._arcs is not None: + if filename in self._arcs: + return [s for s, __ in self._arcs[filename] if s > 0] + elif self._lines is not None: + if filename in self._lines: + return self._lines[filename] + return None + + def arcs(self, filename): + """Get the list of arcs executed for a file. + + If the file was not measured, returns None. A file might be measured, + and have no arcs executed, in which case an empty list is returned. + + If the file was executed, returns a list of 2-tuples of integers. Each + pair is a starting line number and an ending line number for a + transition from one line to another. The list is in no particular + order. + + Negative numbers have special meaning. If the starting line number is + -N, it represents an entry to the code object that starts at line N. + If the ending ling number is -N, it's an exit from the code object that + starts at line N. - # Create the file data. - data = {} + """ + if self._arcs is not None: + if filename in self._arcs: + return self._arcs[filename] + return None - data['lines'] = self.line_data() - arcs = self.arc_data() - if arcs: - data['arcs'] = arcs + def file_tracer(self, filename): + """Get the plugin name of the file tracer for a file. - if self.collector: - data['collector'] = self.collector + Returns the name of the plugin that handles this file. If the file was + measured, but didn't use a plugin, then "" is returned. If the file + was not measured, then None is returned. - data['plugins'] = self.plugins + """ + # Because the vast majority of files involve no plugin, we don't store + # them explicitly in self._file_tracers. Check the measured data + # instead to see if it was a known file with no plugin. + if filename in (self._arcs or self._lines or {}): + return self._file_tracers.get(filename, "") + return None - if self.debug and self.debug.should('dataio'): - self.debug.write("Writing data to %r" % (filename,)) + def run_infos(self): + """Return the list of dicts of run information. - # Write the pickle to the file. - with open(filename, 'wb') as fdata: - pickle.dump(data, fdata, 2) + For data collected during a single run, this will be a one-element + list. If data has been combined, there will be one element for each + original data file. - def read_file(self, filename): - """Read the coverage data from `filename`.""" - self.lines, self.arcs, self.plugins = self._read_file(filename) + """ + return self._runs + + def measured_files(self): + """A list of all files that had been measured.""" + return list(self._arcs or self._lines or {}) - def raw_data(self, filename): - """Return the raw pickled data from `filename`.""" - if self.debug and self.debug.should('dataio'): - self.debug.write("Reading data from %r" % (filename,)) - with open(filename, 'rb') as fdata: - data = pickle.load(fdata) - return data + def line_counts(self, fullpath=False): + """Return a dict summarizing the line coverage data. - def _read_file(self, filename): - """Return the stored coverage data from the given file. + Keys are based on the file names, 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. - Returns three values, suitable for assigning to `self.lines`, - `self.arcs`, and `self.plugins`. + Returns a dict mapping file names to counts of lines. """ - lines = {} - arcs = {} - plugins = {} - try: - data = self.raw_data(filename) - if isinstance(data, dict): - # Unpack the 'lines' item. - lines = dict([ - (f, dict.fromkeys(linenos, None)) - for f, linenos in iitems(data.get('lines', {})) - ]) - # Unpack the 'arcs' item. - arcs = dict([ - (f, dict.fromkeys(arcpairs, None)) - for f, arcpairs in iitems(data.get('arcs', {})) - ]) - plugins = data.get('plugins', {}) - except Exception: - pass - return lines, arcs, plugins - - def combine_parallel_data(self, aliases=None, data_dirs=None): - """Combine a number of data files together. + summ = {} + if fullpath: + filename_fn = lambda f: f + else: + filename_fn = os.path.basename + for filename in self.measured_files(): + summ[filename_fn(filename)] = len(self.lines(filename)) + return summ - Treat `self.filename` as a file prefix, and combine the data from all - of the data files starting with that prefix plus a dot. + def __nonzero__(self): + return bool(self._lines or self._arcs) - If `aliases` is provided, it's a `PathAliases` object that is used to - re-map paths to match the local machine's. + __bool__ = __nonzero__ + + def read_fileobj(self, file_obj): + """Read the coverage data from the given file object. - If `data_dirs` is provided, then it combines the data files from each - directory into a single file. + Should only be used on an empty CoverageData object. """ - aliases = aliases or PathAliases() - data_dir, local = os.path.split(self.filename) - localdot = local + '.*' + data = self._read_raw_data(file_obj) - data_dirs = data_dirs or [data_dir] - files_to_combine = [] - for d in data_dirs: - pattern = os.path.join(os.path.abspath(d), localdot) - files_to_combine.extend(glob.glob(pattern)) + self._lines = self._arcs = None - for f in files_to_combine: - new_lines, new_arcs, new_plugins = self._read_file(f) - for filename, file_data in iitems(new_lines): - filename = aliases.map(filename) - self.lines.setdefault(filename, {}).update(file_data) - for filename, file_data in iitems(new_arcs): - filename = aliases.map(filename) - self.arcs.setdefault(filename, {}).update(file_data) - self.plugins.update(new_plugins) - os.remove(f) + if 'lines' in data: + self._lines = data['lines'] + if 'arcs' in data: + self._arcs = dict( + (fname, [tuple(pair) for pair in arcs]) + for fname, arcs in iitems(data['arcs']) + ) + self._file_tracers = data.get('file_tracers', {}) + self._runs = data.get('runs', []) - def add_line_data(self, line_data): - """Add executed line data. + self._validate() - `line_data` is { filename: { lineno: None, ... }, ...} + def read_file(self, filename): + """Read the coverage data from `filename` into this object.""" + if self._debug and self._debug.should('dataio'): + self._debug.write("Reading data from %r" % (filename,)) + try: + with self._open_for_reading(filename) as f: + self.read_fileobj(f) + except Exception as exc: + raise CoverageException( + "Couldn't read data from '%s': %s: %s" % ( + filename, exc.__class__.__name__, exc, + ) + ) + + _GO_AWAY = "!coverage.py: This is a private format, don't read it directly!" + + @classmethod + def _open_for_reading(cls, filename): + """Open a file appropriately for reading data.""" + return open(filename, "r") + + @classmethod + def _read_raw_data(cls, file_obj): + """Read the raw data from a file object.""" + go_away = file_obj.read(len(cls._GO_AWAY)) + if go_away != cls._GO_AWAY: + raise CoverageException("Doesn't seem to be a coverage.py data file") + return json.load(file_obj) + + @classmethod + def _read_raw_data_file(cls, filename): + """Read the raw data from a file, for debugging.""" + with cls._open_for_reading(filename) as f: + return cls._read_raw_data(f) + + ## + ## Writing data + ## + + def add_lines(self, line_data): + """Add measured line data. + + `line_data` is a dictionary mapping file names to dictionaries:: + + { filename: { lineno: None, ... }, ...} """ + if self._debug and self._debug.should('dataop'): + self._debug.write("Adding lines: %d files, %d lines total" % ( + len(line_data), sum(len(lines) for lines in line_data.values()) + )) + if self._has_arcs(): + raise CoverageException("Can't add lines to existing arc data") + + if self._lines is None: + self._lines = {} for filename, linenos in iitems(line_data): - self.lines.setdefault(filename, {}).update(linenos) + if filename in self._lines: + new_linenos = set(self._lines[filename]) + new_linenos.update(linenos) + linenos = new_linenos + self._lines[filename] = list(linenos) - def add_arc_data(self, arc_data): + self._validate() + + def add_arcs(self, arc_data): """Add measured arc data. - `arc_data` is { filename: { (l1,l2): None, ... }, ...} + `arc_data` is a dictionary mapping file names to dictionaries:: + + { filename: { (l1,l2): None, ... }, ...} """ + if self._debug and self._debug.should('dataop'): + self._debug.write("Adding arcs: %d files, %d arcs total" % ( + len(arc_data), sum(len(arcs) for arcs in arc_data.values()) + )) + if self._has_lines(): + raise CoverageException("Can't add arcs to existing line data") + + if self._arcs is None: + self._arcs = {} for filename, arcs in iitems(arc_data): - self.arcs.setdefault(filename, {}).update(arcs) + if filename in self._arcs: + new_arcs = set(self._arcs[filename]) + new_arcs.update(arcs) + arcs = new_arcs + self._arcs[filename] = list(arcs) + + self._validate() - def add_plugin_data(self, plugin_data): - self.plugins.update(plugin_data) + def add_file_tracers(self, file_tracers): + """Add per-file plugin information. + + `file_tracers` is { filename: plugin_name, ... } + + """ + if self._debug and self._debug.should('dataop'): + self._debug.write("Adding file tracers: %d files" % (len(file_tracers),)) + + existing_files = self._arcs or self._lines or {} + for filename, plugin_name in iitems(file_tracers): + if filename not in existing_files: + raise CoverageException( + "Can't add file tracer data for unmeasured file '%s'" % (filename,) + ) + existing_plugin = self._file_tracers.get(filename) + if existing_plugin is not None and plugin_name != existing_plugin: + raise CoverageException( + "Conflicting file tracer name for '%s': %r vs %r" % ( + filename, existing_plugin, plugin_name, + ) + ) + self._file_tracers[filename] = plugin_name + + self._validate() + + def add_run_info(self, **kwargs): + """Add information about the run. + + Keywords are arbitrary, and are stored in the run dictionary. Values + must be JSON serializable. You may use this function more than once, + but repeated keywords overwrite each other. + + """ + if self._debug and self._debug.should('dataop'): + self._debug.write("Adding run info: %r" % (kwargs,)) + if not self._runs: + self._runs = [{}] + self._runs[0].update(kwargs) + self._validate() def touch_file(self, filename): """Ensure that `filename` appears in the data, empty if needed.""" - self.lines.setdefault(filename, {}) + if self._debug and self._debug.should('dataop'): + self._debug.write("Touching %r" % (filename,)) + if not self._has_arcs() and not self._has_lines(): + raise CoverageException("Can't touch files in an empty CoverageData") - def measured_files(self): - """A list of all files that had been measured.""" - return list(self.lines.keys()) + if self._has_arcs(): + where = self._arcs + else: + where = self._lines + where.setdefault(filename, []) - def executed_lines(self, filename): - """A map containing all the line numbers executed in `filename`. + self._validate() - If `filename` hasn't been collected at all (because it wasn't executed) - then return an empty map. + def write_fileobj(self, file_obj): + """Write the coverage data to `file_obj`.""" + + # Create the file data. + file_data = {} + + if self._has_arcs(): + file_data['arcs'] = self._arcs + + if self._has_lines(): + file_data['lines'] = self._lines + + if self._file_tracers: + file_data['file_tracers'] = self._file_tracers + + if self._runs: + file_data['runs'] = self._runs + + # Write the data to the file. + file_obj.write(self._GO_AWAY) + json.dump(file_data, file_obj) + + def write_file(self, filename): + """Write the coverage data to `filename`.""" + if self._debug and self._debug.should('dataio'): + self._debug.write("Writing data to %r" % (filename,)) + with open(filename, 'w') as fdata: + self.write_fileobj(fdata) + + def erase(self): + """Erase the data in this object.""" + self._lines = None + self._arcs = None + self._file_tracers = {} + self._runs = [] + self._validate() + + def update(self, other_data, aliases=None): + """Update this data with data from another `CoverageData`. + + If `aliases` is provided, it's a `PathAliases` object that is used to + re-map paths to match the local machine's. """ - return self.lines.get(filename) or {} + if self._has_lines() and other_data._has_arcs(): + raise CoverageException("Can't combine arc data with line data") + if self._has_arcs() and other_data._has_lines(): + raise CoverageException("Can't combine line data with arc data") - def executed_arcs(self, filename): - """A map containing all the arcs executed in `filename`.""" - return self.arcs.get(filename) or {} + aliases = aliases or PathAliases() - def add_to_hash(self, filename, hasher): - """Contribute `filename`'s data to the Md5Hash `hasher`.""" - hasher.update(self.executed_lines(filename)) - hasher.update(self.executed_arcs(filename)) + # _file_tracers: only have a string, so they have to agree. + # Have to do these first, so that our examination of self._arcs and + # self._lines won't be confused by data updated from other_data. + for filename in other_data.measured_files(): + other_plugin = other_data.file_tracer(filename) + filename = aliases.map(filename) + this_plugin = self.file_tracer(filename) + if this_plugin is None: + if other_plugin: + self._file_tracers[filename] = other_plugin + elif this_plugin != other_plugin: + raise CoverageException( + "Conflicting file tracer name for '%s': %r vs %r" % ( + filename, this_plugin, other_plugin, + ) + ) + + # _runs: add the new runs to these runs. + self._runs.extend(other_data._runs) + + # _lines: merge dicts. + if other_data._has_lines(): + if self._lines is None: + self._lines = {} + for filename, file_lines in iitems(other_data._lines): + filename = aliases.map(filename) + if filename in self._lines: + lines = set(self._lines[filename]) + lines.update(file_lines) + file_lines = list(lines) + self._lines[filename] = file_lines + + # _arcs: merge dicts. + if other_data._has_arcs(): + if self._arcs is None: + self._arcs = {} + for filename, file_arcs in iitems(other_data._arcs): + filename = aliases.map(filename) + if filename in self._arcs: + arcs = set(self._arcs[filename]) + arcs.update(file_arcs) + file_arcs = list(arcs) + self._arcs[filename] = file_arcs + + self._validate() + + ## + ## Miscellaneous + ## + + def _validate(self): + """If we are in paranoid mode, validate that everything is right.""" + if env.TESTING: + self._validate_invariants() + + def _validate_invariants(self): + """Validate internal invariants.""" + # Only one of _lines or _arcs should exist. + assert not(self._has_lines() and self._has_arcs()), ( + "Shouldn't have both _lines and _arcs" + ) + + # _lines should be a dict of lists of ints. + if self._has_lines(): + for fname, lines in iitems(self._lines): + assert isinstance(fname, string_class), "Key in _lines shouldn't be %r" % (fname,) + assert all(isinstance(x, int) for x in lines), ( + "_lines[%r] shouldn't be %r" % (fname, lines) + ) + + # _arcs should be a dict of lists of pairs of ints. + if self._has_arcs(): + for fname, arcs in iitems(self._arcs): + assert isinstance(fname, string_class), "Key in _arcs shouldn't be %r" % (fname,) + assert all(isinstance(x, int) and isinstance(y, int) for x, y in arcs), ( + "_arcs[%r] shouldn't be %r" % (fname, arcs) + ) + + # _file_tracers should have only non-empty strings as values. + for fname, plugin in iitems(self._file_tracers): + assert isinstance(fname, string_class), ( + "Key in _file_tracers shouldn't be %r" % (fname,) + ) + assert plugin and isinstance(plugin, string_class), ( + "_file_tracers[%r] shoudn't be %r" % (fname, plugin) + ) - def summary(self, fullpath=False): - """Return a dict summarizing the coverage data. + # _runs should be a list of dicts. + for val in self._runs: + assert isinstance(val, dict) + for key in val: + assert isinstance(key, string_class), "Key in _runs shouldn't be %r" % (key,) - 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. + def add_to_hash(self, filename, hasher): + """Contribute `filename`'s data to the `hasher`. + + `hasher` is a `coverage.misc.Hasher` instance to be updated with + the file's data. It should only get the results data, not the run + data. """ - summ = {} - if fullpath: - filename_fn = lambda f: f + if self._has_arcs(): + hasher.update(sorted(self.arcs(filename) or [])) else: - filename_fn = os.path.basename - for filename, lines in iitems(self.lines): - summ[filename_fn(filename)] = len(lines) - return summ + hasher.update(sorted(self.lines(filename) or [])) + hasher.update(self.file_tracer(filename)) - def has_arcs(self): - """Does this data have arcs?""" - return bool(self.arcs) + ## + ## Internal + ## + + def _has_lines(self): + """Do we have data in self._lines?""" + return self._lines is not None + + def _has_arcs(self): + """Do we have data in self._arcs?""" + return self._arcs is not None + + +class CoverageDataFiles(object): + """Manage the use of coverage data files.""" + + def __init__(self, basename=None, warn=None): + """Create a CoverageDataFiles to manage data files. + + `warn` is the warning function to use. + + `basename` is the name of the file to use for storing data. + + """ + self.warn = warn + # Construct the file name that will be used for data storage. + self.filename = os.path.abspath(basename or ".coverage") + + def erase(self, parallel=False): + """Erase the data from the file storage. + + If `parallel` is true, then also deletes data files created from the + basename by parallel-mode. + + """ + file_be_gone(self.filename) + if parallel: + data_dir, local = os.path.split(self.filename) + localdot = local + '.*' + pattern = os.path.join(os.path.abspath(data_dir), localdot) + for filename in glob.glob(pattern): + file_be_gone(filename) + + def read(self, data): + """Read the coverage data.""" + if os.path.exists(self.filename): + data.read_file(self.filename) + + def write(self, data, 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. + + """ + filename = self.filename + if suffix is True: + # 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. + extra = "" + if _TEST_NAME_FILE: # pragma: debugging + with open(_TEST_NAME_FILE) as f: + test_name = f.read() + extra = "." + test_name + suffix = "%s%s.%s.%06d" % ( + socket.gethostname(), extra, os.getpid(), + random.randint(0, 999999) + ) + + if suffix: + filename += "." + suffix + data.write_file(filename) + + def combine_parallel_data(self, data, aliases=None, data_paths=None): + """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 plus a dot. + + If `aliases` is provided, it's a `PathAliases` object that is used to + re-map paths to match the local machine's. + + If `data_paths` is provided, it is a list of directories or files to + combine. Directories are searched for files that start with + `self.filename` plus dot as a prefix, and those files are combined. + + If `data_paths` is not provided, then the directory portion of + `self.filename` is used as the directory to search for data files. + + Every data file found and combined is then deleted from disk. If a file + cannot be read, a warning will be issued, and the file will not be + deleted. + + """ + # Because of the os.path.abspath in the constructor, data_dir will + # never be an empty string. + data_dir, local = os.path.split(self.filename) + localdot = local + '.*' + + data_paths = data_paths or [data_dir] + files_to_combine = [] + for p in data_paths: + if os.path.isfile(p): + files_to_combine.append(os.path.abspath(p)) + elif os.path.isdir(p): + pattern = os.path.join(os.path.abspath(p), localdot) + files_to_combine.extend(glob.glob(pattern)) + else: + raise CoverageException("Couldn't combine from non-existent path '%s'" % (p,)) + + for f in files_to_combine: + new_data = CoverageData() + try: + new_data.read_file(f) + except CoverageException as exc: + if self.warn: + # The CoverageException has the file name in it, so just + # use the message as the warning. + self.warn(str(exc)) + else: + data.update(new_data, aliases=aliases) + file_be_gone(f) + + +def canonicalize_json_data(data): + """Canonicalize our JSON data so it can be compared.""" + for fname, lines in iitems(data.get('lines', {})): + data['lines'][fname] = sorted(lines) + for fname, arcs in iitems(data.get('arcs', {})): + data['arcs'][fname] = sorted(arcs) + + +def pretty_data(data): + """Format data as JSON, but as nicely as possible. + + Returns a string. + + """ + # Start with a basic JSON dump. + out = json.dumps(data, indent=4, sort_keys=True) + # But pairs of numbers shouldn't be split across lines... + out = re.sub(r"\[\s+(-?\d+),\s+(-?\d+)\s+]", r"[\1, \2]", out) + # Trailing spaces mess with tests, get rid of them. + out = re.sub(r"(?m)\s+$", "", out) + return out + + +def debug_main(args): + """Dump the raw data from data files. + + Run this as:: + + $ python -m coverage.data [FILE] + + """ + parser = optparse.OptionParser() + parser.add_option( + "-c", "--canonical", action="store_true", + help="Sort data into a canonical order", + ) + options, args = parser.parse_args(args) + + for filename in (args or [".coverage"]): + print("--- {0} ------------------------------".format(filename)) + data = CoverageData._read_raw_data_file(filename) + if options.canonical: + canonicalize_json_data(data) + print(pretty_data(data)) if __name__ == '__main__': - # Ad-hoc: show the raw data in a data file. - import pprint, sys - covdata = CoverageData() - if sys.argv[1:]: - fname = sys.argv[1] - else: - fname = covdata.filename - pprint.pprint(covdata.raw_data(fname)) + import sys + debug_main(sys.argv[1:]) diff --git a/coverage/debug.py b/coverage/debug.py index 5b41bc40..4076b9b2 100644 --- a/coverage/debug.py +++ b/coverage/debug.py @@ -1,6 +1,15 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Control of and utilities for debugging.""" +import inspect import os +import sys + +from coverage.misc import isolate_module + +os = isolate_module(os) # When debugging, it can be helpful to force some options, especially when @@ -8,6 +17,9 @@ import os # This is a list of forced debugging options. FORCED_DEBUG = [] +# A hack for debugging testing in sub-processes. +_TEST_NAME_FILE = "" # "/tmp/covtest.txt" + class DebugControl(object): """Control and output for debugging.""" @@ -18,9 +30,7 @@ class DebugControl(object): self.output = output def __repr__(self): - return "<DebugControl options=%r output=%r>" % ( - self.options, self.output - ) + return "<DebugControl options=%r output=%r>" % (self.options, self.output) def should(self, option): """Decide whether to output debug information in category `option`.""" @@ -31,6 +41,8 @@ class DebugControl(object): if self.should('pid'): msg = "pid %5d: %s" % (os.getpid(), msg) self.output.write(msg+"\n") + if self.should('callers'): + dump_stack_frames(self.output) self.output.flush() def write_formatted_info(self, header, info): @@ -66,3 +78,27 @@ def info_formatter(info): prefix = "" else: yield "%*s: %s" % (label_len, label, data) + + +def short_stack(): # pragma: debugging + """Return a string summarizing the call stack. + + The string is multi-line, with one line per stack frame. Each line shows + the function name, the file name, and the line number: + + ... + start_import_stop : /Users/ned/coverage/trunk/tests/coveragetest.py @95 + import_local_file : /Users/ned/coverage/trunk/tests/coveragetest.py @81 + import_local_file : /Users/ned/coverage/trunk/coverage/backward.py @159 + ... + + """ + stack = inspect.stack()[:0:-1] + return "\n".join("%30s : %s @%d" % (t[3], t[1], t[2]) for t in stack) + + +def dump_stack_frames(out=None): # pragma: debugging + """Print a summary of the stack to stdout, or some place else.""" + out = out or sys.stdout + out.write(short_stack()) + out.write("\n") diff --git a/coverage/env.py b/coverage/env.py index 85ffa5ff..4cd02c04 100644 --- a/coverage/env.py +++ b/coverage/env.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Determine facts about the environment.""" import os @@ -11,11 +14,19 @@ LINUX = sys.platform == "linux2" PYPY = '__pypy__' in sys.builtin_module_names # Python versions. -PY2 = sys.version_info < (3, 0) -PY3 = sys.version_info >= (3, 0) +PYVERSION = sys.version_info +PY2 = PYVERSION < (3, 0) +PY3 = PYVERSION >= (3, 0) # Coverage.py specifics. + # Are we using the C-implemented trace function? C_TRACER = os.getenv('COVERAGE_TEST_TRACER', 'c') == 'c' + # Are we coverage-measuring ourselves? METACOV = os.getenv('COVERAGE_COVERAGE', '') != '' + +# Are we running our test suite? +# Even when running tests, you can use COVERAGE_TESTING=0 to disable the +# test-specific behavior like contracts. +TESTING = os.getenv('COVERAGE_TESTING', '') == 'True' diff --git a/coverage/execfile.py b/coverage/execfile.py index 2d856897..3e20a527 100644 --- a/coverage/execfile.py +++ b/coverage/execfile.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Execute files of Python code.""" import marshal @@ -7,9 +10,12 @@ import types from coverage.backward import BUILTINS from coverage.backward import PYC_MAGIC_NUMBER, imp, importlib_util_find_spec -from coverage.misc import ExceptionDuringRun, NoCode, NoSource +from coverage.misc import ExceptionDuringRun, NoCode, NoSource, isolate_module +from coverage.phystokens import compile_unicode from coverage.python import get_python_source +os = isolate_module(os) + class DummyLoader(object): """A shim for the pep302 __loader__, emulating pkgutil.ImpLoader. @@ -35,7 +41,7 @@ if importlib_util_find_spec: raise NoSource("No module named %r" % (modulename,)) pathname = spec.origin packagename = spec.name - if pathname.endswith("__init__.py"): + if pathname.endswith("__init__.py") and not modulename.endswith("__init__"): mod_main = modulename + ".__main__" spec = importlib_util_find_spec(mod_main) if not spec: @@ -104,10 +110,10 @@ def run_python_module(modulename, args): pathname = os.path.abspath(pathname) args[0] = pathname - run_python_file(pathname, args, package=packagename, modulename=modulename) + run_python_file(pathname, args, package=packagename, modulename=modulename, path0="") -def run_python_file(filename, args, package=None, modulename=None): +def run_python_file(filename, args, package=None, modulename=None, path0=None): """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. @@ -117,6 +123,9 @@ def run_python_file(filename, args, package=None, modulename=None): `modulename` is the name of the module the file was run as. + `path0` is the value to put into sys.path[0]. If it's None, then this + function will decide on a value. + """ if modulename is None and sys.version_info >= (3, 3): modulename = '__main__' @@ -137,6 +146,25 @@ def run_python_file(filename, args, package=None, modulename=None): old_argv = sys.argv sys.argv = args + if os.path.isdir(filename): + # Running a directory means running the __main__.py file in that + # directory. + my_path0 = filename + + for ext in [".py", ".pyc", ".pyo"]: + try_filename = os.path.join(filename, "__main__" + ext) + if os.path.exists(try_filename): + filename = try_filename + break + else: + raise NoSource("Can't find '__main__' module in '%s'" % filename) + else: + my_path0 = os.path.abspath(os.path.dirname(filename)) + + # Set sys.path correctly. + old_path0 = sys.path[0] + sys.path[0] = path0 if path0 is not None else my_path0 + try: # Make a code object somehow. if filename.endswith((".pyc", ".pyo")): @@ -167,11 +195,10 @@ def run_python_file(filename, args, package=None, modulename=None): raise ExceptionDuringRun(typ, err, tb.tb_next) finally: - # Restore the old __main__ + # Restore the old __main__, argv, and path. sys.modules['__main__'] = old_main_mod - - # Restore the old argv and path sys.argv = old_argv + sys.path[0] = old_path0 def make_code_from_py(filename): @@ -182,7 +209,7 @@ def make_code_from_py(filename): except (IOError, NoSource): raise NoSource("No file to run: '%s'" % filename) - code = compile(source, filename, "exec") + code = compile_unicode(source, filename, "exec") return code diff --git a/coverage/files.py b/coverage/files.py index f7fc9693..44997d12 100644 --- a/coverage/files.py +++ b/coverage/files.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """File wrangling.""" import fnmatch @@ -9,100 +12,152 @@ import re import sys from coverage import env -from coverage.misc import CoverageException, join_regex +from coverage.backward import unicode_class +from coverage.misc import contract, CoverageException, join_regex, isolate_module -class FileLocator(object): - """Understand how filenames work.""" +os = isolate_module(os) - def __init__(self): - # The absolute path to our current directory. - self.relative_dir = os.path.normcase(abs_file(os.curdir) + os.sep) - # Cache of results of calling the canonical_filename() method, to - # avoid duplicating work. - self.canonical_filename_cache = {} +def set_relative_directory(): + """Set the directory that `relative_filename` will be relative to.""" + global RELATIVE_DIR, CANONICAL_FILENAME_CACHE - def relative_filename(self, filename): - """Return the relative form of `filename`. + # The absolute path to our current directory. + RELATIVE_DIR = os.path.normcase(abs_file(os.curdir) + os.sep) - The filename will be relative to the current directory when the - `FileLocator` was constructed. + # Cache of results of calling the canonical_filename() method, to + # avoid duplicating work. + CANONICAL_FILENAME_CACHE = {} - """ - fnorm = os.path.normcase(filename) - if fnorm.startswith(self.relative_dir): - filename = filename[len(self.relative_dir):] - return filename - def canonical_filename(self, filename): - """Return a canonical filename for `filename`. +def relative_directory(): + """Return the directory that `relative_filename` is relative to.""" + return RELATIVE_DIR - An absolute path with no redundant components and normalized case. - """ - if filename not in self.canonical_filename_cache: - if not os.path.isabs(filename): - for path in [os.curdir] + sys.path: - if path is None: - continue - f = os.path.join(path, filename) - if os.path.exists(f): - filename = f - break - cf = abs_file(filename) - self.canonical_filename_cache[filename] = cf - return self.canonical_filename_cache[filename] +@contract(returns='unicode') +def relative_filename(filename): + """Return the relative form of `filename`. + + The file name will be relative to the current directory when the + `set_relative_directory` was called. + + """ + fnorm = os.path.normcase(filename) + if fnorm.startswith(RELATIVE_DIR): + filename = filename[len(RELATIVE_DIR):] + return unicode_filename(filename) + + +@contract(returns='unicode') +def canonical_filename(filename): + """Return a canonical file name for `filename`. + + An absolute path with no redundant components and normalized case. + + """ + if filename not in CANONICAL_FILENAME_CACHE: + if not os.path.isabs(filename): + for path in [os.curdir] + sys.path: + if path is None: + continue + f = os.path.join(path, filename) + if os.path.exists(f): + filename = f + break + cf = abs_file(filename) + CANONICAL_FILENAME_CACHE[filename] = cf + return CANONICAL_FILENAME_CACHE[filename] + + +def flat_rootname(filename): + """A base for a flat file name to correspond to this file. + + 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 will return 'a_b_c_py' + + """ + name = ntpath.splitdrive(filename)[1] + return re.sub(r"[\\/.:]", "_", name) if env.WINDOWS: + _ACTUAL_PATH_CACHE = {} + _ACTUAL_PATH_LIST_CACHE = {} + def actual_path(path): """Get the actual path of `path`, including the correct case.""" - if path in actual_path.cache: - return actual_path.cache[path] + if env.PY2 and isinstance(path, unicode_class): + path = path.encode(sys.getfilesystemencoding()) + if path in _ACTUAL_PATH_CACHE: + return _ACTUAL_PATH_CACHE[path] head, tail = os.path.split(path) if not tail: - actpath = head + # This means head is the drive spec: normalize it. + actpath = head.upper() elif not head: actpath = tail else: head = actual_path(head) - if head in actual_path.list_cache: - files = actual_path.list_cache[head] + if head in _ACTUAL_PATH_LIST_CACHE: + files = _ACTUAL_PATH_LIST_CACHE[head] else: try: files = os.listdir(head) except OSError: files = [] - actual_path.list_cache[head] = files + _ACTUAL_PATH_LIST_CACHE[head] = files normtail = os.path.normcase(tail) for f in files: if os.path.normcase(f) == normtail: tail = f break actpath = os.path.join(head, tail) - actual_path.cache[path] = actpath + _ACTUAL_PATH_CACHE[path] = actpath return actpath - actual_path.cache = {} - actual_path.list_cache = {} - else: def actual_path(filename): """The actual path for non-Windows platforms.""" return filename +if env.PY2: + @contract(returns='unicode') + def unicode_filename(filename): + """Return a Unicode version of `filename`.""" + if isinstance(filename, str): + encoding = sys.getfilesystemencoding() or sys.getdefaultencoding() + filename = filename.decode(encoding, "replace") + return filename +else: + @contract(filename='unicode', returns='unicode') + def unicode_filename(filename): + """Return a Unicode version of `filename`.""" + return filename + + +@contract(returns='unicode') def abs_file(filename): """Return the absolute normalized form of `filename`.""" path = os.path.expandvars(os.path.expanduser(filename)) path = os.path.abspath(os.path.realpath(path)) path = actual_path(path) + path = unicode_filename(path) return path +RELATIVE_DIR = None +CANONICAL_FILENAME_CACHE = None +set_relative_directory() + + def isabs_anywhere(filename): """Is `filename` an absolute path on any OS?""" return ntpath.isabs(filename) or posixpath.isabs(filename) @@ -181,7 +236,7 @@ class ModuleMatcher(object): class FnmatchMatcher(object): - """A matcher for files by filename pattern.""" + """A matcher for files by file name pattern.""" def __init__(self, pats): self.pats = pats[:] # fnmatch is platform-specific. On Windows, it does the Windows thing @@ -204,7 +259,7 @@ class FnmatchMatcher(object): return self.pats def match(self, fpath): - """Does `fpath` match one of our filename patterns?""" + """Does `fpath` match one of our file name patterns?""" return self.re.match(fpath) is not None @@ -228,12 +283,9 @@ class PathAliases(object): A `PathAliases` object tracks a list of pattern/result pairs, and can map a path through those aliases to produce a unified path. - `locator` is a FileLocator that is used to canonicalize the results. - """ - def __init__(self, locator=None): + def __init__(self): self.aliases = [] - self.locator = locator def add(self, pattern, result): """Add the `pattern`/`result` pair to the list of aliases. @@ -286,6 +338,10 @@ class PathAliases(object): The separator style in the result is made to match that of the result in the alias. + Returns the mapped path. If a mapping has happened, this is a + canonical path. If no mapping has happened, it is the original value + of `path` unchanged. + """ for regex, result, pattern_sep, result_sep in self.aliases: m = regex.match(path) @@ -293,8 +349,7 @@ class PathAliases(object): new = path.replace(m.group(0), result) if pattern_sep != result_sep: new = new.replace(pattern_sep, result_sep) - if self.locator: - new = self.locator.canonical_filename(new) + new = canonical_filename(new) return new return path diff --git a/coverage/fullcoverage/encodings.py b/coverage/fullcoverage/encodings.py index 6a258d67..699f3863 100644 --- a/coverage/fullcoverage/encodings.py +++ b/coverage/fullcoverage/encodings.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Imposter encodings module that installs a coverage-style tracer. This is NOT the encodings module; it is an imposter that sets up tracing @@ -6,10 +9,10 @@ instrumentation and then replaces itself with the real encodings module. If the directory that holds this file is placed first in the PYTHONPATH when using "coverage" to run Python's tests, then this file will become the very first module imported by the internals of Python 3. It installs a -coverage-compatible trace function that can watch Standard Library modules +coverage.py-compatible trace function that can watch Standard Library modules execute from the very earliest stages of Python's own boot process. This fixes -a problem with coverage - that it starts too late to trace the coverage of many -of the most fundamental modules in the Standard Library. +a problem with coverage.py - that it starts too late to trace the coverage of +many of the most fundamental modules in the Standard Library. """ diff --git a/coverage/html.py b/coverage/html.py index 0b2cc25c..8dca6323 100644 --- a/coverage/html.py +++ b/coverage/html.py @@ -1,6 +1,7 @@ -"""HTML reporting for Coverage.""" +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt -from __future__ import unicode_literals +"""HTML reporting for coverage.py.""" import datetime import json @@ -11,11 +12,14 @@ import shutil import coverage from coverage import env from coverage.backward import iitems -from coverage.misc import CoverageException, Hasher +from coverage.files import flat_rootname +from coverage.misc import CoverageException, Hasher, isolate_module from coverage.report import Reporter from coverage.results import Numbers from coverage.templite import Templite +os = isolate_module(os) + # Static files are looked for in a list of places. STATIC_PATH = [ @@ -26,6 +30,7 @@ STATIC_PATH = [ os.path.join(os.path.dirname(__file__), "htmlfiles"), ] + def data_filename(fname, pkgdir=""): """Return the path to a data file of ours. @@ -36,15 +41,22 @@ def data_filename(fname, pkgdir=""): is provided, at that sub-directory. """ + tried = [] for static_dir in STATIC_PATH: static_filename = os.path.join(static_dir, fname) if os.path.exists(static_filename): return static_filename + else: + tried.append(static_filename) if pkgdir: static_filename = os.path.join(static_dir, pkgdir, fname) if os.path.exists(static_filename): return static_filename - raise CoverageException("Couldn't find static file %r" % fname) + else: + tried.append(static_filename) + raise CoverageException( + "Couldn't find static file %r from %r, tried: %r" % (fname, os.getcwd(), tried) + ) def data(fname): @@ -56,18 +68,19 @@ def data(fname): class HtmlReporter(Reporter): """HTML reporting.""" - # These files will be copied from the htmlfiles dir to the output dir. + # These files will be copied from the htmlfiles directory to the output + # directory. STATIC_FILES = [ - ("style.css", ""), - ("jquery.min.js", "jquery"), - ("jquery.debounce.min.js", "jquery-debounce"), - ("jquery.hotkeys.js", "jquery-hotkeys"), - ("jquery.isonscreen.js", "jquery-isonscreen"), - ("jquery.tablesorter.min.js", "jquery-tablesorter"), - ("coverage_html.js", ""), - ("keybd_closed.png", ""), - ("keybd_open.png", ""), - ] + ("style.css", ""), + ("jquery.min.js", "jquery"), + ("jquery.debounce.min.js", "jquery-debounce"), + ("jquery.hotkeys.js", "jquery-hotkeys"), + ("jquery.isonscreen.js", "jquery-isonscreen"), + ("jquery.tablesorter.min.js", "jquery-tablesorter"), + ("coverage_html.js", ""), + ("keybd_closed.png", ""), + ("keybd_open.png", ""), + ] def __init__(self, cov, config): super(HtmlReporter, self).__init__(cov, config) @@ -81,15 +94,15 @@ class HtmlReporter(Reporter): 'title': title, '__url__': coverage.__url__, '__version__': coverage.__version__, - } + } self.source_tmpl = Templite( data("pyfile.html"), self.template_globals - ) + ) self.coverage = cov self.files = [] - self.arcs = self.coverage.data.has_arcs() + self.has_arcs = self.coverage.data.has_arcs() self.status = HtmlStatus() self.extra_css = None self.totals = Numbers() @@ -98,7 +111,7 @@ class HtmlReporter(Reporter): def report(self, morfs): """Generate an HTML report for `morfs`. - `morfs` is a list of modules or filenames. + `morfs` is a list of modules or file names. """ assert self.config.html_dir, "must give a directory for html reporting" @@ -128,8 +141,7 @@ class HtmlReporter(Reporter): self.index_file() self.make_local_static_report_files() - - return self.totals.pc_covered + return self.totals.n_statements and self.totals.pc_covered def make_local_static_report_files(self): """Make local instances of static files for HTML report.""" @@ -138,14 +150,14 @@ class HtmlReporter(Reporter): shutil.copyfile( data_filename(static, pkgdir), os.path.join(self.directory, static) - ) + ) # The user may have extra CSS they want copied. if self.extra_css: shutil.copyfile( self.config.extra_css, os.path.join(self.directory, self.extra_css) - ) + ) def write_html(self, fname, html): """Write `html` to `fname`, properly encoded.""" @@ -164,20 +176,20 @@ class HtmlReporter(Reporter): source = fr.source() # Find out if the file on disk is already correct. - flat_rootname = fr.flat_rootname() + rootname = flat_rootname(fr.relative_filename()) this_hash = self.file_hash(source.encode('utf-8'), fr) - that_hash = self.status.file_hash(flat_rootname) + that_hash = self.status.file_hash(rootname) if this_hash == that_hash: # Nothing has changed to require the file to be reported again. - self.files.append(self.status.index_info(flat_rootname)) + self.files.append(self.status.index_info(rootname)) return - self.status.set_file_hash(flat_rootname, this_hash) + self.status.set_file_hash(rootname, this_hash) # Get the numbers for this file. nums = analysis.numbers - if self.arcs: + if self.has_arcs: missing_branch_arcs = analysis.missing_branch_arcs() # These classes determine which lines are highlighted by default. @@ -199,23 +211,34 @@ class HtmlReporter(Reporter): line_class.append(c_exc) elif lineno in analysis.missing: line_class.append(c_mis) - elif self.arcs and lineno in missing_branch_arcs: + elif self.has_arcs and lineno in missing_branch_arcs: line_class.append(c_par) - annlines = [] + shorts = [] + longs = [] for b in missing_branch_arcs[lineno]: if b < 0: - annlines.append("exit") + shorts.append("exit") + longs.append("the function 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" + shorts.append(b) + longs.append("line %d" % b) + # 202F is NARROW NO-BREAK SPACE. + # 219B is RIGHTWARDS ARROW WITH STROKE. + short_fmt = "%s ↛ %s" + annotate_html = ", ".join(short_fmt % (lineno, d) for d in shorts) + annotate_html += " [?]" + + annotate_title = "Line %d was executed, but never jumped to " % lineno + if len(longs) == 1: + annotate_title += longs[0] + elif len(longs) == 2: + annotate_title += longs[0] + " or " + longs[1] + else: + annotate_title += ", ".join(longs[:-1]) + ", or " + longs[-1] elif lineno in analysis.statements: line_class.append(c_run) - # Build the HTML for the line + # Build the HTML for the line. html = [] for tok_type, tok_text in line: if tok_type == "ws": @@ -224,7 +247,7 @@ class HtmlReporter(Reporter): tok_html = escape(tok_text) or ' ' html.append( '<span class="%s">%s</span>' % (tok_type, tok_html) - ) + ) lines.append({ 'html': ''.join(html), @@ -237,13 +260,13 @@ class HtmlReporter(Reporter): # Write the HTML page for this file. template_values = { 'c_exc': c_exc, 'c_mis': c_mis, 'c_par': c_par, 'c_run': c_run, - 'arcs': self.arcs, 'extra_css': self.extra_css, + 'has_arcs': self.has_arcs, 'extra_css': self.extra_css, 'fr': fr, 'nums': nums, 'lines': lines, 'time_stamp': self.time_stamp, } html = spaceless(self.source_tmpl.render(template_values)) - html_filename = flat_rootname + ".html" + html_filename = rootname + ".html" html_path = os.path.join(self.directory, html_filename) self.write_html(html_path, html) @@ -251,31 +274,26 @@ class HtmlReporter(Reporter): index_info = { 'nums': nums, 'html_filename': html_filename, - 'name': fr.name, - } + 'relative_filename': fr.relative_filename(), + } self.files.append(index_info) - self.status.set_index_info(flat_rootname, index_info) + self.status.set_index_info(rootname, index_info) def index_file(self): """Write the index.html file for this report.""" - index_tmpl = Templite( - data("index.html"), self.template_globals - ) + index_tmpl = Templite(data("index.html"), self.template_globals) self.totals = sum(f['nums'] for f in self.files) html = index_tmpl.render({ - 'arcs': self.arcs, + 'has_arcs': self.has_arcs, 'extra_css': self.extra_css, 'files': self.files, 'totals': self.totals, 'time_stamp': self.time_stamp, }) - self.write_html( - os.path.join(self.directory, "index.html"), - html - ) + self.write_html(os.path.join(self.directory, "index.html"), html) # Write the latest hashes for next time. self.status.write(self.directory) @@ -292,11 +310,11 @@ class HtmlStatus(object): # # { # 'format': 1, - # 'settings': '\x87\x9cc8\x80\xe5\x97\xb16\xfcv\xa2\x8d\x8a\xbb\xcf', + # 'settings': '540ee119c15d52a68a53fe6f0897346d', # 'version': '4.0a1', # 'files': { # 'cogapp___init__': { - # 'hash': '\x99*\x0e\\\x10\x11O\x06WG/gJ\x83\xdd\x99', + # 'hash': 'e45581a5b48f879f301c0f30bf77a50c', # 'index': { # 'html_filename': 'cogapp___init__.html', # 'name': 'cogapp/__init__', @@ -305,7 +323,7 @@ class HtmlStatus(object): # }, # ... # 'cogapp_whiteutils': { - # 'hash': 'o\xfd\x0e+s2="\xb2\x1c\xd6\xa1\xee\x85\x85\xda', + # 'hash': '8504bb427fc488c4176809ded0277d51', # 'index': { # 'html_filename': 'cogapp_whiteutils.html', # 'name': 'cogapp/whiteutils', @@ -361,10 +379,17 @@ class HtmlStatus(object): 'version': coverage.__version__, 'settings': self.settings, 'files': files, - } + } with open(status_file, "w") as fout: json.dump(status, fout) + # Older versions of ShiningPanda look for the old name, status.dat. + # Accomodate them if we are running under Jenkins. + # https://issues.jenkins-ci.org/browse/JENKINS-28428 + if "JENKINS_URL" in os.environ: + with open(os.path.join(directory, "status.dat"), "w") as dat: + dat.write("https://issues.jenkins-ci.org/browse/JENKINS-28428\n") + def settings_hash(self): """Get the hash of the coverage.py settings.""" return self.settings @@ -394,16 +419,18 @@ class HtmlStatus(object): def escape(t): """HTML-escape the text in `t`.""" - return (t - # Convert HTML special chars into HTML entities. - .replace("&", "&").replace("<", "<").replace(">", ">") - .replace("'", "'").replace('"', """) - # Convert runs of spaces: "......" -> " . . ." - .replace(" ", " ") - # To deal with odd-length runs, convert the final pair of spaces - # so that "....." -> " . ." - .replace(" ", " ") - ) + return ( + t + # Convert HTML special chars into HTML entities. + .replace("&", "&").replace("<", "<").replace(">", ">") + .replace("'", "'").replace('"', """) + # Convert runs of spaces: "......" -> " . . ." + .replace(" ", " ") + # To deal with odd-length runs, convert the final pair of spaces + # so that "....." -> " . ." + .replace(" ", " ") + ) + def spaceless(html): """Squeeze out some annoying extra space from an HTML string. @@ -415,6 +442,7 @@ def spaceless(html): html = re.sub(r">\s+<p ", ">\n<p ", html) return html + def pair(ratio): """Format a pair of numbers so JavaScript can read them in an attribute.""" return "%s %s" % ratio diff --git a/coverage/htmlfiles/coverage_html.js b/coverage/htmlfiles/coverage_html.js index 5ef0ece5..bd6a8753 100644 --- a/coverage/htmlfiles/coverage_html.js +++ b/coverage/htmlfiles/coverage_html.js @@ -1,3 +1,6 @@ +// Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +// For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + // Coverage.py HTML report browser code. /*jslint browser: true, sloppy: true, vars: true, plusplus: true, maxerr: 50, indent: 4 */ /*global coverage: true, document, window, $ */ diff --git a/coverage/htmlfiles/index.html b/coverage/htmlfiles/index.html index 1afc57c9..ee2deab0 100644 --- a/coverage/htmlfiles/index.html +++ b/coverage/htmlfiles/index.html @@ -1,3 +1,6 @@ +{# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 #} +{# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt #} + <!DOCTYPE html> <html> <head> @@ -41,7 +44,7 @@ <span class="key">s</span> <span class="key">m</span> <span class="key">x</span> - {% if arcs %} + {% if has_arcs %} <span class="key">b</span> <span class="key">p</span> {% endif %} @@ -59,7 +62,7 @@ <th class="shortkey_s">statements</th> <th class="shortkey_m">missing</th> <th class="shortkey_x">excluded</th> - {% if arcs %} + {% if has_arcs %} <th class="shortkey_b">branches</th> <th class="shortkey_p">partial</th> {% endif %} @@ -73,7 +76,7 @@ <td>{{totals.n_statements}}</td> <td>{{totals.n_missing}}</td> <td>{{totals.n_excluded}}</td> - {% if arcs %} + {% if has_arcs %} <td>{{totals.n_branches}}</td> <td>{{totals.n_partial_branches}}</td> {% endif %} @@ -83,11 +86,11 @@ <tbody> {% for file in files %} <tr class="file"> - <td class="name left"><a href="{{file.html_filename}}">{{file.name}}</a></td> + <td class="name left"><a href="{{file.html_filename}}">{{file.relative_filename}}</a></td> <td>{{file.nums.n_statements}}</td> <td>{{file.nums.n_missing}}</td> <td>{{file.nums.n_excluded}}</td> - {% if arcs %} + {% if has_arcs %} <td>{{file.nums.n_branches}}</td> <td>{{file.nums.n_partial_branches}}</td> {% endif %} diff --git a/coverage/htmlfiles/pyfile.html b/coverage/htmlfiles/pyfile.html index d78ba536..ad7969db 100644 --- a/coverage/htmlfiles/pyfile.html +++ b/coverage/htmlfiles/pyfile.html @@ -1,3 +1,6 @@ +{# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 #} +{# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt #} + <!DOCTYPE html> <html> <head> @@ -5,7 +8,7 @@ {# 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 {{fr.name|escape}}: {{nums.pc_covered_str}}%</title> + <title>Coverage for {{fr.relative_filename|escape}}: {{nums.pc_covered_str}}%</title> <link rel="stylesheet" href="style.css" type="text/css"> {% if extra_css %} <link rel="stylesheet" href="{{ extra_css }}" type="text/css"> @@ -22,7 +25,7 @@ <div id="header"> <div class="content"> - <h1>Coverage for <b>{{fr.name|escape}}</b> : + <h1>Coverage for <b>{{fr.relative_filename|escape}}</b> : <span class="pc_cov">{{nums.pc_covered_str}}%</span> </h1> @@ -34,7 +37,7 @@ <span class="{{c_mis}} shortkey_m button_toggle_mis">{{nums.n_missing}} missing</span> <span class="{{c_exc}} shortkey_x button_toggle_exc">{{nums.n_excluded}} excluded</span> - {% if arcs %} + {% if has_arcs %} <span class="{{c_par}} shortkey_p button_toggle_par">{{nums.n_partial_branches}} partial</span> {% endif %} </h2> diff --git a/coverage/htmlfiles/style.css b/coverage/htmlfiles/style.css index 038335c1..15b08904 100644 --- a/coverage/htmlfiles/style.css +++ b/coverage/htmlfiles/style.css @@ -1,4 +1,7 @@ -/* CSS styles for Coverage. */ +/* Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 */ +/* For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt */ + +/* CSS styles for coverage.py. */ /* Page-wide styles */ html, body, h1, h2, h3, p, table, td, th { margin: 0; @@ -249,7 +252,6 @@ td.text { .text span.annotate { font-family: georgia; - font-style: italic; color: #666; float: right; padding-right: .5em; diff --git a/coverage/misc.py b/coverage/misc.py index d5197ea3..db6298b6 100644 --- a/coverage/misc.py +++ b/coverage/misc.py @@ -1,12 +1,64 @@ -"""Miscellaneous stuff for Coverage.""" +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +"""Miscellaneous stuff for coverage.py.""" import errno import hashlib import inspect +import locale import os +import sys +import types from coverage import env -from coverage.backward import string_class, to_bytes +from coverage.backward import string_class, to_bytes, unicode_class + +ISOLATED_MODULES = {} + + +def isolate_module(mod): + """Copy a module so that we are isolated from aggressive mocking. + + If a test suite mocks os.path.exists (for example), and then we need to use + it during the test, everything will get tangled up if we use their mock. + Making a copy of the module when we import it will isolate coverage.py from + those complications. + """ + if mod not in ISOLATED_MODULES: + new_mod = types.ModuleType(mod.__name__) + ISOLATED_MODULES[mod] = new_mod + for name in dir(mod): + value = getattr(mod, name) + if isinstance(value, types.ModuleType): + value = isolate_module(value) + setattr(new_mod, name, value) + return ISOLATED_MODULES[mod] + +os = isolate_module(os) + + +# Use PyContracts for assertion testing on parameters and returns, but only if +# we are running our own test suite. +if env.TESTING: + from contracts import contract # pylint: disable=unused-import + from contracts import new_contract + + try: + # Define contract words that PyContract doesn't have. + new_contract('bytes', lambda v: isinstance(v, bytes)) + if env.PY3: + new_contract('unicode', lambda v: isinstance(v, unicode_class)) + except ValueError: + # During meta-coverage, this module is imported twice, and PyContracts + # doesn't like redefining contracts. It's OK. + pass +else: # pragma: not covered + # We aren't using real PyContracts, so just define a no-op decorator as a + # stunt double. + def contract(**unused): + """Dummy no-op implementation of `contract`.""" + return lambda func: func def nice_pair(pair): @@ -56,26 +108,25 @@ def format_lines(statements, lines): return ret -def short_stack(): # pragma: debugging - """Return a string summarizing the call stack.""" - stack = inspect.stack()[:0:-1] - return "\n".join("%30s : %s @%d" % (t[3], t[1], t[2]) for t in stack) - - def expensive(fn): - """A decorator to cache the result of an expensive operation. + """A decorator to indicate that a method shouldn't be called more than once. - Only applies to methods with no arguments. + Normally, this does nothing. During testing, this raises an exception if + called more than once. """ - 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 + if env.TESTING: + attr = "_once_" + fn.__name__ + + def _wrapped(self): + """Inner function that checks the cache.""" + if hasattr(self, attr): + raise Exception("Shouldn't have called %s more than once" % fn.__name__) + setattr(self, attr, True) + return fn(self) + return _wrapped + else: + return fn def bool_or_none(b): @@ -100,6 +151,18 @@ def file_be_gone(path): raise +def output_encoding(outfile=None): + """Determine the encoding to use for output written to `outfile` or stdout.""" + if outfile is None: + outfile = sys.stdout + encoding = ( + getattr(outfile, "encoding", None) or + getattr(sys.__stdout__, "encoding", None) or + locale.getpreferredencoding() + ) + return encoding + + class Hasher(object): """Hashes Python data into md5.""" def __init__(self): @@ -139,30 +202,6 @@ class Hasher(object): return self.md5.hexdigest() -def overrides(obj, method_name, base_class): - """Does `obj` override the `method_name` it got from `base_class`? - - Determine if `obj` implements the method called `method_name`, which it - inherited from `base_class`. - - Returns a boolean. - - """ - klass = obj.__class__ - klass_func = getattr(klass, method_name) - base_func = getattr(base_class, method_name) - - # Python 2/3 compatibility: Python 2 returns an instancemethod object, the - # function is the .im_func attribute. Python 3 returns a plain function - # object already. - if env.PY2: - klass_func = klass_func.im_func - base_func = base_func.im_func - - return klass_func is not base_func - - -# TODO: abc? def _needs_to_implement(that, func_name): """Helper to raise NotImplementedError in interface stubs.""" if hasattr(that, "_coverage_plugin_name"): @@ -181,7 +220,7 @@ def _needs_to_implement(that, func_name): class CoverageException(Exception): - """An exception specific to Coverage.""" + """An exception specific to coverage.py.""" pass diff --git a/coverage/monkey.py b/coverage/monkey.py index ee84d992..c4ec68c6 100644 --- a/coverage/monkey.py +++ b/coverage/monkey.py @@ -1,4 +1,7 @@ -"""Monkey-patching to make coverage work right in some cases.""" +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +"""Monkey-patching to make coverage.py work right in some cases.""" import multiprocessing import multiprocessing.process @@ -6,7 +9,7 @@ import sys # An attribute that will be set on modules to indicate that they have been # monkey-patched. -MARKER = "_coverage$patched" +PATCHED_MARKER = "_coverage$patched" def patch_multiprocessing(): @@ -16,7 +19,7 @@ def patch_multiprocessing(): This is wildly experimental! """ - if hasattr(multiprocessing, MARKER): + if hasattr(multiprocessing, PATCHED_MARKER): return if sys.version_info >= (3, 4): @@ -29,6 +32,7 @@ def patch_multiprocessing(): class ProcessWithCoverage(klass): """A replacement for multiprocess.Process that starts coverage.""" def _bootstrap(self): + """Wrapper around _bootstrap to start coverage.""" from coverage import Coverage cov = Coverage(data_suffix=True) cov.start() @@ -43,4 +47,4 @@ def patch_multiprocessing(): else: multiprocessing.Process = ProcessWithCoverage - setattr(multiprocessing, MARKER, 1) + setattr(multiprocessing, PATCHED_MARKER, True) diff --git a/coverage/parser.py b/coverage/parser.py index fc751eb2..7b8a60f1 100644 --- a/coverage/parser.py +++ b/coverage/parser.py @@ -1,4 +1,7 @@ -"""Code parsing for Coverage.""" +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +"""Code parsing for coverage.py.""" import collections import dis @@ -9,31 +12,15 @@ import tokenize from coverage.backward import range # pylint: disable=redefined-builtin from coverage.backward import bytes_to_ints from coverage.bytecode import ByteCodes, CodeObjects -from coverage.misc import nice_pair, expensive, join_regex +from coverage.misc import contract, nice_pair, join_regex from coverage.misc import CoverageException, NoSource, NotPython -from coverage.phystokens import generate_tokens - +from coverage.phystokens import compile_unicode, generate_tokens -class CodeParser(object): - """ - Base class for any code parser. - """ - def translate_lines(self, lines): - return set(lines) - def translate_arcs(self, arcs): - return arcs - - def exit_counts(self): - return {} - - def arcs(self): - return [] - - -class PythonParser(CodeParser): +class PythonParser(object): """Parse code to find executable lines, excluded lines, etc.""" + @contract(text='unicode|None') def __init__(self, text=None, filename=None, exclude=None): """ Source can be provided as `text`, the text itself, or `filename`, from @@ -51,40 +38,47 @@ class PythonParser(CodeParser): except IOError as err: raise NoSource( "No source for code: '%s': %s" % (self.filename, err) - ) - - if self.text: - assert isinstance(self.text, str) - # Scrap the BOM if it exists. - # (Used to do this, but no longer. Not sure what bad will happen - # if we don't do it.) - # if ord(self.text[0]) == 0xfeff: - # self.text = self.text[1:] + ) self.exclude = exclude - self.show_tokens = False - # The text lines of the parsed code. self.lines = self.text.split('\n') - # The line numbers of excluded lines of code. + # The normalized line numbers of the statements in the code. Exclusions + # are taken into account, and statements are adjusted to their first + # lines. + self.statements = set() + + # The normalized line numbers of the excluded lines in the code, + # adjusted to their first lines. self.excluded = set() - # The line numbers of docstring lines. - self.docstrings = set() + # The raw_* attributes are only used in this class, and in + # lab/parser.py to show how this class is working. + + # The line numbers that start statements, as reported by the line + # number table in the bytecode. + self.raw_statements = set() + + # The raw line numbers of excluded lines of code, as marked by pragmas. + self.raw_excluded = set() # The line numbers of class definitions. - self.classdefs = set() + self.raw_classdefs = set() - # A dict mapping line numbers to (lo,hi) for multi-line statements. - self.multiline = {} + # The line numbers of docstring lines. + self.raw_docstrings = set() - # The line numbers that start statements. - self.statement_starts = set() + # Internal detail, used by lab/parser.py. + self.show_tokens = False - # Lazily-created ByteParser + # A dict mapping line numbers to (lo,hi) for multi-line statements. + self._multiline = {} + + # Lazily-created ByteParser and arc data. self._byte_parser = None + self._all_arcs = None @property def byte_parser(self): @@ -111,21 +105,23 @@ class PythonParser(CodeParser): def _raw_parse(self): """Parse the source to find the interesting facts about its lines. - A handful of member fields are updated. + A handful of attributes are updated. """ # Find lines which match an exclusion pattern. if self.exclude: - self.excluded = self.lines_matching(self.exclude) + self.raw_excluded = self.lines_matching(self.exclude) # Tokenize, to find excluded suites, to find docstrings, and to find # multi-line statements. indent = 0 exclude_indent = 0 excluding = False + excluding_decorators = False prev_toktype = token.INDENT first_line = None empty = True + first_on_line = True tokgen = generate_tokens(self.text) for toktype, ttext, (slineno, _), (elineno, _), ltext in tokgen: @@ -133,37 +129,49 @@ class PythonParser(CodeParser): print("%10s %5s %-20r %r" % ( tokenize.tok_name.get(toktype, toktype), nice_pair((slineno, elineno)), ttext, ltext - )) + )) if toktype == token.INDENT: indent += 1 elif toktype == token.DEDENT: indent -= 1 - elif toktype == token.NAME and ttext == 'class': - # Class definitions look like branches in the byte code, so - # we need to exclude them. The simplest way is to note the - # lines with the 'class' keyword. - self.classdefs.add(slineno) - elif toktype == token.OP and ttext == ':': - if not excluding and elineno in self.excluded: - # Start excluding a suite. We trigger off of the colon - # token so that the #pragma comment will be recognized on - # the same line as the colon. - exclude_indent = indent - excluding = True + elif toktype == token.NAME: + if ttext == 'class': + # Class definitions look like branches in the byte code, so + # we need to exclude them. The simplest way is to note the + # lines with the 'class' keyword. + self.raw_classdefs.add(slineno) + elif toktype == token.OP: + if ttext == ':': + should_exclude = (elineno in self.raw_excluded) or excluding_decorators + if not excluding and should_exclude: + # Start excluding a suite. We trigger off of the colon + # token so that the #pragma comment will be recognized on + # the same line as the colon. + self.raw_excluded.add(elineno) + exclude_indent = indent + excluding = True + excluding_decorators = False + elif ttext == '@' and first_on_line: + # A decorator. + if elineno in self.raw_excluded: + excluding_decorators = True + if excluding_decorators: + self.raw_excluded.add(elineno) 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.) This works for # 99.9999% of cases. For the rest (!) see: # http://stackoverflow.com/questions/1769332/x/1769794#1769794 - self.docstrings.update(range(slineno, elineno+1)) + self.raw_docstrings.update(range(slineno, elineno+1)) elif toktype == token.NEWLINE: if first_line is not None and elineno != first_line: # We're at the end of a line, and we've ended on a # different line than the first line of the statement, # so record a multi-line range. for l in range(first_line, elineno+1): - self.multiline[l] = first_line + self._multiline[l] = first_line first_line = None + first_on_line = True if ttext.strip() and toktype != tokenize.COMMENT: # A non-whitespace token. @@ -176,17 +184,18 @@ class PythonParser(CodeParser): if excluding and indent <= exclude_indent: excluding = False if excluding: - self.excluded.add(elineno) + self.raw_excluded.add(elineno) + first_on_line = False prev_toktype = toktype # Find the starts of the executable statements. if not empty: - self.statement_starts.update(self.byte_parser._find_statements()) + self.raw_statements.update(self.byte_parser._find_statements()) def first_line(self, line): """Return the first line number of the statement including `line`.""" - first_line = self.multiline.get(line) + first_line = self._multiline.get(line) if first_line: return first_line else: @@ -202,83 +211,77 @@ class PythonParser(CodeParser): return set(self.first_line(l) for l in lines) def translate_lines(self, lines): + """Implement `FileReporter.translate_lines`.""" return self.first_lines(lines) def translate_arcs(self, arcs): - return [ - (self.first_line(a), self.first_line(b)) - for (a, b) in arcs - ] + """Implement `FileReporter.translate_arcs`.""" + return [(self.first_line(a), self.first_line(b)) for (a, b) in arcs] def parse_source(self): """Parse source text to find executable lines, excluded lines, etc. - Return values are 1) a set of executable line numbers, and 2) a set of - excluded line numbers. - - Reported line numbers are normalized to the first line of multi-line - statements. + Sets the .excluded and .statements attributes, normalized to the first + line of multi-line statements. """ try: self._raw_parse() - except (tokenize.TokenError, IndentationError) as tokerr: - msg, lineno = tokerr.args # pylint: disable=unpacking-non-sequence + except (tokenize.TokenError, IndentationError) as err: + if hasattr(err, "lineno"): + lineno = err.lineno # IndentationError + else: + lineno = err.args[1][0] # TokenError raise NotPython( - "Couldn't parse '%s' as Python source: '%s' at %s" % - (self.filename, msg, lineno) + u"Couldn't parse '%s' as Python source: '%s' at line %d" % ( + self.filename, err.args[0], lineno ) + ) - excluded_lines = self.first_lines(self.excluded) - ignore = set() - ignore.update(excluded_lines) - ignore.update(self.docstrings) - starts = self.statement_starts - ignore - lines = self.first_lines(starts) - lines -= ignore + self.excluded = self.first_lines(self.raw_excluded) - return lines, excluded_lines + ignore = self.excluded | self.raw_docstrings + starts = self.raw_statements - ignore + self.statements = self.first_lines(starts) - ignore - @expensive 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 multi-line statements. + Returns a set of line number pairs. Line numbers have been normalized + to the first line of multi-line statements. """ - all_arcs = [] - for l1, l2 in self.byte_parser._all_arcs(): - fl1 = self.first_line(l1) - fl2 = self.first_line(l2) - if fl1 != fl2: - all_arcs.append((fl1, fl2)) - return sorted(all_arcs) - - @expensive + if self._all_arcs is None: + self._all_arcs = set() + for l1, l2 in self.byte_parser._all_arcs(): + fl1 = self.first_line(l1) + fl2 = self.first_line(l2) + if fl1 != fl2: + self._all_arcs.add((fl1, fl2)) + return self._all_arcs + def exit_counts(self): - """Get a mapping from line numbers to count of exits from that line. + """Get a count of exits from that each line. Excluded lines are excluded. """ - excluded_lines = self.first_lines(self.excluded) exit_counts = collections.defaultdict(int) for l1, l2 in self.arcs(): if l1 < 0: # Don't ever report -1 as a line number continue - if l1 in excluded_lines: + if l1 in self.excluded: # Don't report excluded lines as line numbers. continue - if l2 in excluded_lines: + if l2 in self.excluded: # Arcs to excluded lines shouldn't count. continue exit_counts[l1] += 1 # Class definitions have one extra exit, so remove one for each: - for l in self.classdefs: - # Ensure key is there: classdefs can include excluded lines. + for l in self.raw_classdefs: + # Ensure key is there: class definitions can include excluded lines. if l in exit_counts: exit_counts[l] -= 1 @@ -309,7 +312,7 @@ OPS_CODE_END = _opcode_set('RETURN_VALUE') OPS_CHUNK_END = _opcode_set( 'JUMP_ABSOLUTE', 'JUMP_FORWARD', 'RETURN_VALUE', 'RAISE_VARARGS', '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 @@ -319,7 +322,7 @@ 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', 'SETUP_WITH' - ) +) # Block types for exception handling. OPS_EXCEPT_BLOCKS = _opcode_set('SETUP_EXCEPT', 'SETUP_FINALLY') @@ -334,7 +337,7 @@ OPS_NO_JUMP = OPS_PUSH_BLOCK 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. +COMPARE_EXCEPTION = 10 # just have to get this constant from the code. OP_LOAD_CONST = _opcode('LOAD_CONST') OP_RETURN_VALUE = _opcode('RETURN_VALUE') @@ -342,16 +345,17 @@ OP_RETURN_VALUE = _opcode('RETURN_VALUE') class ByteParser(object): """Parse byte codes to understand the structure of code.""" + @contract(text='unicode') def __init__(self, text, code=None, filename=None): self.text = text if code: self.code = code else: try: - self.code = compile(text, filename, "exec") + self.code = compile_unicode(text, filename, "exec") except SyntaxError as synerr: raise NotPython( - "Couldn't parse '%s' as Python source: '%s' at line %d" % ( + u"Couldn't parse '%s' as Python source: '%s' at line %d" % ( filename, synerr.msg, synerr.lineno ) ) @@ -361,10 +365,9 @@ class ByteParser(object): for attr in ['co_lnotab', 'co_firstlineno', 'co_consts', 'co_code']: if not hasattr(self.code, attr): raise CoverageException( - "This implementation of Python doesn't support code " - "analysis.\n" + "This implementation of Python doesn't support code analysis.\n" "Run coverage.py under CPython for this command." - ) + ) def child_parsers(self): """Iterate over all the code objects nested within this one. @@ -682,4 +685,4 @@ class Chunk(object): "!" if self.first else "", "v" if self.entrance else "", list(self.exits), - ) + ) diff --git a/coverage/phystokens.py b/coverage/phystokens.py index ed6bd238..b34b1c3b 100644 --- a/coverage/phystokens.py +++ b/coverage/phystokens.py @@ -1,13 +1,18 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Better tokenizing for coverage.py.""" import codecs import keyword import re +import sys import token import tokenize from coverage import env from coverage.backward import iternext +from coverage.misc import contract def phys_tokens(toks): @@ -66,6 +71,7 @@ def phys_tokens(toks): last_lineno = elineno +@contract(source='unicode') def source_token_lines(source): """Generate a series of lines, one for each line in `source`. @@ -104,7 +110,7 @@ def source_token_lines(source): mark_end = False else: if mark_start and scol > col: - line.append(("ws", " " * (scol - col))) + line.append(("ws", u" " * (scol - col))) mark_start = False tok_class = tokenize.tok_name.get(ttype, 'xx').lower()[:3] if ttype == token.NAME and keyword.iskeyword(ttext): @@ -134,11 +140,10 @@ class CachedTokenizer(object): self.last_text = None self.last_tokens = None + @contract(text='unicode') def generate_tokens(self, text): """A stand-in for `tokenize.generate_tokens`.""" - # Check the type first so we don't compare bytes to unicode and get - # warnings. - if type(text) != type(self.last_text) or text != self.last_text: + if text != self.last_text: self.last_text = text readline = iternext(text.splitlines(True)) self.last_tokens = list(tokenize.generate_tokens(readline)) @@ -148,14 +153,15 @@ class CachedTokenizer(object): generate_tokens = CachedTokenizer().generate_tokens +COOKIE_RE = re.compile(r"^[ \t]*#.*coding[:=][ \t]*([-\w.]+)", flags=re.MULTILINE) + +@contract(source='bytes') def _source_encoding_py2(source): """Determine the encoding for `source`, according to PEP 263. - Arguments: - source (byte string): the text of the program. + `source` is a byte string, the text of the program. - Returns: - string: the name of the encoding. + Returns a string, the name of the encoding. """ assert isinstance(source, bytes) @@ -165,8 +171,6 @@ def _source_encoding_py2(source): # This is mostly code adapted from Py3.2's tokenize module. - cookie_re = re.compile(r"^\s*#.*coding[:=]\s*([-\w.]+)") - def _get_normal_name(orig_enc): """Imitates get_normal_name in tokenizer.c.""" # Only care about the first 12 characters. @@ -204,7 +208,7 @@ def _source_encoding_py2(source): except UnicodeDecodeError: return None - matches = cookie_re.findall(line_string) + matches = COOKIE_RE.findall(line_string) if not matches: return None encoding = _get_normal_name(matches[0]) @@ -246,17 +250,15 @@ def _source_encoding_py2(source): return default +@contract(source='bytes') def _source_encoding_py3(source): """Determine the encoding for `source`, according to PEP 263. - Arguments: - source (byte string): the text of the program. + `source` is a byte string: the text of the program. - Returns: - string: the name of the encoding. + Returns a string, the name of the encoding. """ - assert isinstance(source, bytes) readline = iternext(source.splitlines(True)) return tokenize.detect_encoding(readline)[0] @@ -265,3 +267,29 @@ if env.PY3: source_encoding = _source_encoding_py3 else: source_encoding = _source_encoding_py2 + + +@contract(source='unicode') +def compile_unicode(source, filename, mode): + """Just like the `compile` builtin, but works on any Unicode string. + + Python 2's compile() builtin has a stupid restriction: if the source string + is Unicode, then it may not have a encoding declaration in it. Why not? + Who knows! It also decodes to utf8, and then tries to interpret those utf8 + bytes according to the encoding declaration. Why? Who knows! + + This function neuters the coding declaration, and compiles it. + + """ + source = neuter_encoding_declaration(source) + if env.PY2 and isinstance(filename, unicode): + filename = filename.encode(sys.getfilesystemencoding(), "replace") + code = compile(source, filename, mode) + return code + + +@contract(source='unicode', returns='unicode') +def neuter_encoding_declaration(source): + """Return `source`, with any encoding declaration neutered.""" + source = COOKIE_RE.sub("# (deleted declaration)", source, count=1) + return source diff --git a/coverage/pickle2json.py b/coverage/pickle2json.py new file mode 100644 index 00000000..95b42ef3 --- /dev/null +++ b/coverage/pickle2json.py @@ -0,0 +1,47 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +"""Convert pickle to JSON for coverage.py.""" + +from coverage.backward import pickle +from coverage.data import CoverageData + + +def pickle_read_raw_data(cls_unused, file_obj): + """Replacement for CoverageData._read_raw_data.""" + return pickle.load(file_obj) + + +def pickle2json(infile, outfile): + """Convert a coverage.py 3.x pickle data file to a 4.x JSON data file.""" + try: + old_read_raw_data = CoverageData._read_raw_data + CoverageData._read_raw_data = pickle_read_raw_data + + covdata = CoverageData() + + with open(infile, 'rb') as inf: + covdata.read_fileobj(inf) + + covdata.write_file(outfile) + finally: + CoverageData._read_raw_data = old_read_raw_data + + +if __name__ == "__main__": + from optparse import OptionParser + + parser = OptionParser(usage="usage: %s [options]" % __file__) + parser.description = "Convert .coverage files from pickle to JSON format" + parser.add_option( + "-i", "--input-file", action="store", default=".coverage", + help="Name of input file. Default .coverage", + ) + parser.add_option( + "-o", "--output-file", action="store", default=".coverage", + help="Name of output file. Default .coverage", + ) + + (options, args) = parser.parse_args() + + pickle2json(options.input_file, options.output_file) diff --git a/coverage/plugin.py b/coverage/plugin.py index 6648d7a6..f870c254 100644 --- a/coverage/plugin.py +++ b/coverage/plugin.py @@ -1,19 +1,18 @@ -"""Plugin interfaces for coverage.py""" +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt -import os -import re +"""Plugin interfaces for coverage.py""" -from coverage.misc import _needs_to_implement +from coverage import files +from coverage.misc import contract, _needs_to_implement -# TODO: document that the plugin objects may be decorated with attributes with -# named "_coverage_*". class CoveragePlugin(object): """Base class for coverage.py plugins. - To write a coverage.py plugin, create a subclass of `CoveragePlugin`. - You can override methods here to participate in various aspects of - coverage.py's processing. + To write a coverage.py plugin, create a module with a subclass of + :class:`CoveragePlugin`. You will override methods in your class to + participate in various aspects of coverage.py's processing. Currently the only plugin type is a file tracer, for implementing measurement support for non-Python files. File tracer plugins implement @@ -23,122 +22,149 @@ class CoveragePlugin(object): Any plugin can optionally implement :meth:`sys_info` to provide debugging information about their operation. - """ + Coverage.py will store its own information on your plugin object, using + attributes whose names start with ``_coverage_``. Don't be startled. - def __init__(self, options): - """ - When the plugin is constructed, it will be passed a dictionary of - plugin-specific options read from the .coveragerc configuration file. - The base class stores these on the `self.options` attribute. + To register your plugin, define a function called `coverage_init` in your + module:: - Arguments: - options (dict): The plugin-specific options read from the - .coveragerc configuration file. + def coverage_init(reg, options): + reg.add_file_tracer(MyPlugin()) - """ - self.options = options + You use the `reg` parameter passed to your `coverage_init` function to + register your plugin object. It has one method, `add_file_tracer`, which + takes a newly created instance of your plugin. + + If your plugin takes options, the `options` parameter is a dictionary of + your plugin's options from the coverage.py configuration file. Use them + however you want to configure your object before registering it. + + """ def file_tracer(self, filename): # pylint: disable=unused-argument - """Return a FileTracer object for a file. + """Get a :class:`FileTracer` object for a file. - Every source file is offered to the plugin to give it a chance to take - responsibility for tracing the file. If your plugin can handle the - file, then return a :class:`FileTracer` object. Otherwise return None. + Every Python source file is offered to the plugin to give it a chance + to take responsibility for tracing the file. If your plugin can handle + the file, then return a :class:`FileTracer` object. Otherwise return + None. There is no way to register your plugin for particular files. Instead, - this method is invoked for all files, and can decide whether it can - trace the file or not. Be prepared for `filename` to refer to all + this method is invoked for all files, and the plugin decides whether it + can trace the file or not. Be prepared for `filename` to refer to all kinds of files that have nothing to do with your plugin. - Arguments: - filename (str): The path to the file being considered. This is the - absolute real path to the file. If you are comparing to other - paths, be sure to take this into account. + The file name will be a Python file being executed. There are two + broad categories of behavior for a plugin, depending on the kind of + files your plugin supports: + + * Static file names: each of your original source files has been + converted into a distinct Python file. Your plugin is invoked with + the Python file name, and it maps it back to its original source + file. + + * Dynamic file names: all of your source files are executed by the same + Python file. In this case, your plugin implements + :meth:`FileTracer.dynamic_source_filename` to provide the actual + source file for each execution frame. + + `filename` is a string, the path to the file being considered. This is + the absolute real path to the file. If you are comparing to other + paths, be sure to take this into account. - Returns: - FileTracer: the :class:`FileTracer` object to use to trace - `filename`, or None if this plugin cannot trace this file. + Returns a :class:`FileTracer` object to use to trace `filename`, or + None if this plugin cannot trace this file. """ return None def file_reporter(self, filename): # pylint: disable=unused-argument - """Return the FileReporter class to use for filename. + """Get the :class:`FileReporter` class to use for a file. This will only be invoked if `filename` returns non-None from - :meth:`file_tracer`. It's an error to return None. + :meth:`file_tracer`. It's an error to return None from this method. + + Returns a :class:`FileReporter` object to use to report on `filename`. """ _needs_to_implement(self, "file_reporter") def sys_info(self): - """Return a list of information useful for debugging. + """Get a list of information useful for debugging. This method will be invoked for ``--debug=sys``. Your plugin can return any information it wants to be displayed. - The return value is a list of pairs: (name, value). + Returns a list of pairs: `[(name, value), ...]`. """ return [] class FileTracer(object): - """Support needed for files during the tracing phase. + """Support needed for files during the execution phase. You may construct this object from :meth:`CoveragePlugin.file_tracer` any - way you like. A natural choice would be to pass the filename given to + way you like. A natural choice would be to pass the file name given to `file_tracer`. + `FileTracer` objects should only be created in the + :meth:`CoveragePlugin.file_tracer` method. + + See :ref:`howitworks` for details of the different coverage.py phases. + """ def source_filename(self): - """The source filename for this file. + """The source file name for this file. - This may be any filename you like. A key responsibility of a plugin is - to own the mapping from Python execution back to whatever source - filename was originally the source of the code. + This may be any file name you like. A key responsibility of a plugin + is to own the mapping from Python execution back to whatever source + file name was originally the source of the code. - Returns: - The filename to credit with this execution. + See :meth:`CoveragePlugin.file_tracer` for details about static and + dynamic file names. + + Returns the file name to credit with this execution. """ _needs_to_implement(self, "source_filename") def has_dynamic_source_filename(self): - """Does this FileTracer have dynamic source filenames? + """Does this FileTracer have dynamic source file names? - FileTracers can provide dynamically determined filenames by - implementing dynamic_source_filename. Invoking that function is - expensive. To determine whether to invoke it, coverage.py uses - the result of this function to know if it needs to bother invoking + FileTracers can provide dynamically determined file names by + implementing :meth:`dynamic_source_filename`. Invoking that function + is expensive. To determine whether to invoke it, coverage.py uses the + result of this function to know if it needs to bother invoking :meth:`dynamic_source_filename`. - Returns: - boolean: True if :meth:`dynamic_source_filename` should be called - to get dynamic source filenames. + See :meth:`CoveragePlugin.file_tracer` for details about static and + dynamic file names. + + Returns True if :meth:`dynamic_source_filename` should be called to get + dynamic source file names. """ return False def dynamic_source_filename(self, filename, frame): # pylint: disable=unused-argument - """Returns a dynamically computed source filename. + """Get a dynamically computed source file name. - Some plugins need to compute the source filename dynamically for each + Some plugins need to compute the source file name dynamically for each frame. This function will not be invoked if :meth:`has_dynamic_source_filename` returns False. - Returns: - The source filename for this frame, or None if this frame shouldn't - be measured. + Returns the source file name for this frame, or None if this frame + shouldn't be measured. """ return None def line_number_range(self, frame): - """Return the range of source line numbers for a given a call frame. + """Get the range of source line numbers for a given a call frame. The call frame is examined, and the source line number in the original file is returned. The return value is a pair of numbers, the starting @@ -150,103 +176,206 @@ class FileTracer(object): from the source file were executed. Return (-1, -1) in this case to tell coverage.py that no lines should be recorded for this frame. - Arguments: - frame: the call frame to examine. - - Returns: - int, int: a pair of line numbers, the start and end lines - executed in the source, inclusive. - """ lineno = frame.f_lineno return lineno, lineno class FileReporter(object): - """Support needed for files during the reporting phase.""" + """Support needed for files during the analysis and reporting phases. + + See :ref:`howitworks` for details of the different coverage.py phases. + + `FileReporter` objects should only be created in the + :meth:`CoveragePlugin.file_reporter` method. + + There are many methods here, but only :meth:`lines` is required, to provide + the set of executable lines in the file. + + """ + def __init__(self, filename): - # TODO: document that this init happens. + """Simple initialization of a `FileReporter`. + + The `filename` argument is the path to the file being reported. This + will be available as the `.filename` attribute on the object. Other + method implementations on this base class rely on this attribute. + + """ self.filename = filename def __repr__(self): - return ( - # pylint: disable=redundant-keyword-arg - "<{self.__class__.__name__}" - " filename={self.filename!r}>".format(self=self) - ) + return "<{0.__class__.__name__} filename={0.filename!r}>".format(self) - # Annoying comparison operators. Py3k wants __lt__ etc, and Py2k needs all - # of them defined. + def relative_filename(self): + """Get the relative file name for this file. - def __lt__(self, other): - return self.filename < other.filename + This file path will be displayed in reports. The default + implementation will supply the actual project-relative file path. You + only need to supply this method if you have an unusual syntax for file + paths. - def __le__(self, other): - return self.filename <= other.filename + """ + return files.relative_filename(self.filename) - def __eq__(self, other): - return self.filename == other.filename + @contract(returns='unicode') + def source(self): + """Get the source for the file. - def __ne__(self, other): - return self.filename != other.filename + Returns a Unicode string. - def __gt__(self, other): - return self.filename > other.filename + The base implementation simply reads the `self.filename` file and + decodes it as UTF8. Override this method if your file isn't readable + as a text file, or if you need other encoding support. - def __ge__(self, other): - return self.filename >= other.filename + """ + with open(self.filename, "rb") as f: + return f.read().decode("utf8") - def statements(self): - _needs_to_implement(self, "statements") + def lines(self): + """Get the executable lines in this file. - def excluded_statements(self): - return set([]) + Your plugin must determine which lines in the file were possibly + executable. This method returns a set of those line numbers. + + Returns a set of line numbers. + + """ + _needs_to_implement(self, "lines") + + def excluded_lines(self): + """Get the excluded executable lines in this file. + + Your plugin can use any method it likes to allow the user to exclude + executable lines from consideration. + + Returns a set of line numbers. + + The base implementation returns the empty set. + + """ + return set() def translate_lines(self, lines): + """Translate recorded lines into reported lines. + + Some file formats will want to report lines slightly differently than + they are recorded. For example, Python records the last line of a + multi-line statement, but reports are nicer if they mention the first + line. + + Your plugin can optionally define this method to perform these kinds of + adjustment. + + `lines` is a sequence of integers, the recorded line numbers. + + Returns a set of integers, the adjusted line numbers. + + The base implementation returns the numbers unchanged. + + """ return set(lines) - def translate_arcs(self, arcs): - return arcs + def arcs(self): + """Get the executable arcs in this file. + + To support branch coverage, your plugin needs to be able to indicate + possible execution paths, as a set of line number pairs. Each pair is + a `(prev, next)` pair indicating that execution can transition from the + `prev` line number to the `next` line number. + + Returns a set of pairs of line numbers. The default implementation + returns an empty set. + + """ + return set() def no_branch_lines(self): + """Get the lines excused from branch coverage in this file. + + Your plugin can use any method it likes to allow the user to exclude + lines from consideration of branch coverage. + + Returns a set of line numbers. + + The base implementation returns the empty set. + + """ return set() + def translate_arcs(self, arcs): + """Translate recorded arcs into reported arcs. + + Similar to :meth:`translate_lines`, but for arcs. `arcs` is a set of + line number pairs. + + Returns a set of line number pairs. + + The default implementation returns `arcs` unchanged. + + """ + return arcs + def exit_counts(self): - return {} + """Get a count of exits from that each line. - def arcs(self): - return [] + To determine which lines are branches, coverage.py looks for lines that + have more than one exit. This function creates a dict mapping each + executable line number to a count of how many exits it has. - def source(self): - """Return the source for the code, a Unicode string.""" - # A generic implementation: read the text of self.filename - with open(self.filename) as f: - return f.read() + To be honest, this feels wrong, and should be refactored. Let me know + if you attempt to implement this... + + """ + return {} def source_token_lines(self): - """Return the 'tokenized' text for the code.""" - # A generic implementation, each line is one "txt" token. + """Generate a series of tokenized lines, one for each line in `source`. + + These tokens are used for syntax-colored reports. + + 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. The token classes + are: + + * ``'com'``: a comment + * ``'key'``: a keyword + * ``'nam'``: a name, or identifier + * ``'num'``: a number + * ``'op'``: an operator + * ``'str'``: a string literal + * ``'txt'``: some other kind of text + + If you concatenate all the token texts, and then join them with + newlines, you should have your original source back. + + The default implementation simply returns each line tagged as + ``'txt'``. + + """ for line in self.source().splitlines(): yield [('txt', line)] - def should_be_python(self): - """Does it seem like this file should contain Python? + # Annoying comparison operators. Py3k wants __lt__ etc, and Py2k needs all + # of them defined. + + def __eq__(self, other): + return isinstance(other, FileReporter) and self.filename == other.filename - This is used to decide if a file reported as part of the execution of - a program was really likely to have contained Python in the first - place. - """ - return False + def __ne__(self, other): + return not (self == other) - def flat_rootname(self): - """A base for a flat filename to correspond to this file. + def __lt__(self, other): + return self.filename < other.filename - 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. + def __le__(self, other): + return self.filename <= other.filename - For example, the file a/b/c.py will return 'a_b_c_py' + def __gt__(self, other): + return self.filename > other.filename - """ - name = os.path.splitdrive(self.name)[1] - return re.sub(r"[\\/.:]", "_", name) + def __ge__(self, other): + return self.filename >= other.filename diff --git a/coverage/plugin_support.py b/coverage/plugin_support.py new file mode 100644 index 00000000..8a4fbec5 --- /dev/null +++ b/coverage/plugin_support.py @@ -0,0 +1,247 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +"""Support for plugins.""" + +import os +import os.path +import sys + +from coverage.misc import CoverageException, isolate_module +from coverage.plugin import CoveragePlugin, FileTracer, FileReporter + +os = isolate_module(os) + + +class Plugins(object): + """The currently loaded collection of coverage.py plugins.""" + + def __init__(self): + self.order = [] + self.names = {} + self.file_tracers = [] + + self.current_module = None + self.debug = None + + @classmethod + def load_plugins(cls, modules, config, debug=None): + """Load plugins from `modules`. + + Returns a list of loaded and configured plugins. + + """ + plugins = cls() + plugins.debug = debug + + for module in modules: + plugins.current_module = module + __import__(module) + mod = sys.modules[module] + + coverage_init = getattr(mod, "coverage_init", None) + if not coverage_init: + raise CoverageException( + "Plugin module %r didn't define a coverage_init function" % module + ) + + options = config.get_plugin_options(module) + coverage_init(plugins, options) + + plugins.current_module = None + return plugins + + def add_file_tracer(self, plugin): + """Add a file tracer plugin. + + `plugin` is an instance of a third-party plugin class. It must + implement the :meth:`CoveragePlugin.file_tracer` method. + + """ + self._add_plugin(plugin, self.file_tracers) + + def add_noop(self, plugin): + """Add a plugin that does nothing. + + This is only useful for testing the plugin support. + + """ + self._add_plugin(plugin, None) + + def _add_plugin(self, plugin, specialized): + """Add a plugin object. + + `plugin` is a :class:`CoveragePlugin` instance to add. `specialized` + is a list to append the plugin to. + + """ + plugin_name = "%s.%s" % (self.current_module, plugin.__class__.__name__) + if self.debug and self.debug.should('plugin'): + self.debug.write("Loaded plugin %r: %r" % (self.current_module, plugin)) + labelled = LabelledDebug("plugin %r" % (self.current_module,), self.debug) + plugin = DebugPluginWrapper(plugin, labelled) + + # pylint: disable=attribute-defined-outside-init + plugin._coverage_plugin_name = plugin_name + plugin._coverage_enabled = True + self.order.append(plugin) + self.names[plugin_name] = plugin + if specialized is not None: + specialized.append(plugin) + + def __nonzero__(self): + return bool(self.order) + + __bool__ = __nonzero__ + + def __iter__(self): + return iter(self.order) + + def get(self, plugin_name): + """Return a plugin by name.""" + return self.names[plugin_name] + + +class LabelledDebug(object): + """A Debug writer, but with labels for prepending to the messages.""" + + def __init__(self, label, debug, prev_labels=()): + self.labels = list(prev_labels) + [label] + self.debug = debug + + def add_label(self, label): + """Add a label to the writer, and return a new `LabelledDebug`.""" + return LabelledDebug(label, self.debug, self.labels) + + def message_prefix(self): + """The prefix to use on messages, combining the labels.""" + prefixes = self.labels + [''] + return ":\n".join(" "*i+label for i, label in enumerate(prefixes)) + + def write(self, message): + """Write `message`, but with the labels prepended.""" + self.debug.write("%s%s" % (self.message_prefix(), message)) + + +class DebugPluginWrapper(CoveragePlugin): + """Wrap a plugin, and use debug to report on what it's doing.""" + + def __init__(self, plugin, debug): + super(DebugPluginWrapper, self).__init__() + self.plugin = plugin + self.debug = debug + + def file_tracer(self, filename): + tracer = self.plugin.file_tracer(filename) + self.debug.write("file_tracer(%r) --> %r" % (filename, tracer)) + if tracer: + debug = self.debug.add_label("file %r" % (filename,)) + tracer = DebugFileTracerWrapper(tracer, debug) + return tracer + + def file_reporter(self, filename): + reporter = self.plugin.file_reporter(filename) + self.debug.write("file_reporter(%r) --> %r" % (filename, reporter)) + if reporter: + debug = self.debug.add_label("file %r" % (filename,)) + reporter = DebugFileReporterWrapper(filename, reporter, debug) + return reporter + + def sys_info(self): + return self.plugin.sys_info() + + +class DebugFileTracerWrapper(FileTracer): + """A debugging `FileTracer`.""" + + def __init__(self, tracer, debug): + self.tracer = tracer + self.debug = debug + + def _show_frame(self, frame): + """A short string identifying a frame, for debug messages.""" + return "%s@%d" % ( + os.path.basename(frame.f_code.co_filename), + frame.f_lineno, + ) + + def source_filename(self): + sfilename = self.tracer.source_filename() + self.debug.write("source_filename() --> %r" % (sfilename,)) + return sfilename + + def has_dynamic_source_filename(self): + has = self.tracer.has_dynamic_source_filename() + self.debug.write("has_dynamic_source_filename() --> %r" % (has,)) + return has + + def dynamic_source_filename(self, filename, frame): + dyn = self.tracer.dynamic_source_filename(filename, frame) + self.debug.write("dynamic_source_filename(%r, %s) --> %r" % ( + filename, self._show_frame(frame), dyn, + )) + return dyn + + def line_number_range(self, frame): + pair = self.tracer.line_number_range(frame) + self.debug.write("line_number_range(%s) --> %r" % (self._show_frame(frame), pair)) + return pair + + +class DebugFileReporterWrapper(FileReporter): + """A debugging `FileReporter`.""" + + def __init__(self, filename, reporter, debug): + super(DebugFileReporterWrapper, self).__init__(filename) + self.reporter = reporter + self.debug = debug + + def relative_filename(self): + ret = self.reporter.relative_filename() + self.debug.write("relative_filename() --> %r" % (ret,)) + return ret + + def lines(self): + ret = self.reporter.lines() + self.debug.write("lines() --> %r" % (ret,)) + return ret + + def excluded_lines(self): + ret = self.reporter.excluded_lines() + self.debug.write("excluded_lines() --> %r" % (ret,)) + return ret + + def translate_lines(self, lines): + ret = self.reporter.translate_lines(lines) + self.debug.write("translate_lines(%r) --> %r" % (lines, ret)) + return ret + + def translate_arcs(self, arcs): + ret = self.reporter.translate_arcs(arcs) + self.debug.write("translate_arcs(%r) --> %r" % (arcs, ret)) + return ret + + def no_branch_lines(self): + ret = self.reporter.no_branch_lines() + self.debug.write("no_branch_lines() --> %r" % (ret,)) + return ret + + def exit_counts(self): + ret = self.reporter.exit_counts() + self.debug.write("exit_counts() --> %r" % (ret,)) + return ret + + def arcs(self): + ret = self.reporter.arcs() + self.debug.write("arcs() --> %r" % (ret,)) + return ret + + def source(self): + ret = self.reporter.source() + self.debug.write("source() --> %d chars" % (len(ret),)) + return ret + + def source_token_lines(self): + ret = list(self.reporter.source_token_lines()) + self.debug.write("source_token_lines() --> %d tokens" % (len(ret),)) + return ret diff --git a/coverage/python.py b/coverage/python.py index 19212a5b..5e563828 100644 --- a/coverage/python.py +++ b/coverage/python.py @@ -1,37 +1,34 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Python source expertise for coverage.py""" import os.path -import sys -import tokenize import zipimport -from coverage import env -from coverage.backward import unicode_class -from coverage.files import FileLocator -from coverage.misc import NoSource, join_regex +from coverage import env, files +from coverage.misc import contract, expensive, NoSource, join_regex, isolate_module from coverage.parser import PythonParser from coverage.phystokens import source_token_lines, source_encoding from coverage.plugin import FileReporter +os = isolate_module(os) + +@contract(returns='bytes') def read_python_source(filename): """Read the Python source text from `filename`. - Returns a str: unicode on Python 3, bytes on Python 2. + Returns bytes. """ - # Python 3.2 provides `tokenize.open`, the best way to open source files. - if sys.version_info >= (3, 2): - f = tokenize.open(filename) - else: - f = open(filename, "rU") - - with f: - return f.read() + with open(filename, "rb") as f: + return f.read().replace(b"\r\n", b"\n").replace(b"\r", b"\n") +@contract(returns='unicode') def get_python_source(filename): - """Return the source code, as a str.""" + """Return the source code, as unicode.""" base, ext = os.path.splitext(filename) if ext == ".py" and env.WINDOWS: exts = [".py", ".pyw"] @@ -48,13 +45,13 @@ def get_python_source(filename): # Maybe it's in a zip file? source = get_zip_bytes(try_filename) if source is not None: - if env.PY3: - source = source.decode(source_encoding(source)) break else: # Couldn't find source. raise NoSource("No source for code: '%s'." % filename) + source = source.decode(source_encoding(source), "replace") + # Python code should always end with a line with a newline. if source and source[-1] != '\n': source += '\n' @@ -62,6 +59,7 @@ def get_python_source(filename): return source +@contract(returns='bytes|None') def get_zip_bytes(filename): """Get data from `filename` if it is a zip file path. @@ -82,7 +80,6 @@ def get_zip_bytes(filename): data = zi.get_data(parts[1]) except IOError: continue - assert isinstance(data, bytes) return data return None @@ -92,55 +89,57 @@ class PythonFileReporter(FileReporter): def __init__(self, morf, coverage=None): self.coverage = coverage - file_locator = coverage.file_locator if coverage else FileLocator() if hasattr(morf, '__file__'): filename = morf.__file__ else: filename = morf + filename = files.unicode_filename(filename) + # .pyc files should always refer to a .py instead. if filename.endswith(('.pyc', '.pyo')): filename = filename[:-1] elif filename.endswith('$py.class'): # Jython filename = filename[:-9] + ".py" - super(PythonFileReporter, self).__init__( - file_locator.canonical_filename(filename) - ) + super(PythonFileReporter, self).__init__(files.canonical_filename(filename)) if hasattr(morf, '__name__'): name = morf.__name__ name = name.replace(".", os.sep) + ".py" + name = files.unicode_filename(name) else: - name = file_locator.relative_filename(filename) - self.name = name + name = files.relative_filename(filename) + self.relname = name self._source = None self._parser = None self._statements = None self._excluded = None + @contract(returns='unicode') + def relative_filename(self): + return self.relname + @property def parser(self): + """Lazily create a :class:`PythonParser`.""" if self._parser is None: self._parser = PythonParser( filename=self.filename, exclude=self.coverage._exclude_regex('exclude'), ) + self._parser.parse_source() return self._parser - def statements(self): + def lines(self): """Return the line numbers of statements in the file.""" - if self._statements is None: - self._statements, self._excluded = self.parser.parse_source() - return self._statements + return self.parser.statements - def excluded_statements(self): + def excluded_lines(self): """Return the line numbers of statements in the file.""" - if self._excluded is None: - self._statements, self._excluded = self.parser.parse_source() - return self._excluded + return self.parser.excluded def translate_lines(self, lines): return self.parser.translate_lines(lines) @@ -148,6 +147,7 @@ class PythonFileReporter(FileReporter): def translate_arcs(self, arcs): return self.parser.translate_arcs(arcs) + @expensive def no_branch_lines(self): no_branch = self.parser.lines_matching( join_regex(self.coverage.config.partial_list), @@ -155,19 +155,18 @@ class PythonFileReporter(FileReporter): ) return no_branch + @expensive def arcs(self): return self.parser.arcs() + @expensive def exit_counts(self): return self.parser.exit_counts() + @contract(returns='unicode') def source(self): if self._source is None: self._source = get_python_source(self.filename) - if env.PY2: - encoding = source_encoding(self._source) - self._source = self._source.decode(encoding, "replace") - assert isinstance(self._source, unicode_class) return self._source def should_be_python(self): diff --git a/coverage/pytracer.py b/coverage/pytracer.py index 3f03aaf7..cdb3ae70 100644 --- a/coverage/pytracer.py +++ b/coverage/pytracer.py @@ -1,4 +1,7 @@ -"""Raw data collector for Coverage.""" +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +"""Raw data collector for coverage.py.""" import dis import sys @@ -33,7 +36,7 @@ class PyTracer(object): def __init__(self): # Attributes set from the collector: self.data = None - self.arcs = False + self.trace_arcs = False self.should_trace = None self.should_trace_cache = None self.warn = None @@ -65,7 +68,7 @@ class PyTracer(object): if self.last_exc_back: if frame == self.last_exc_back: # Someone forgot a return event. - if self.arcs and self.cur_file_dict: + if self.trace_arcs and self.cur_file_dict: pair = (self.last_line, -self.last_exc_firstlineno) self.cur_file_dict[pair] = None self.cur_file_dict, self.last_line = self.data_stack.pop() @@ -96,13 +99,13 @@ class PyTracer(object): # Record an executed line. if self.cur_file_dict is not None: lineno = frame.f_lineno - if self.arcs: + if self.trace_arcs: self.cur_file_dict[(self.last_line, lineno)] = None else: self.cur_file_dict[lineno] = None self.last_line = lineno elif event == 'return': - if self.arcs and self.cur_file_dict: + if self.trace_arcs and self.cur_file_dict: # Record an arc leaving the function, but beware that a # "return" event might just mean yielding from a generator. bytecode = frame.f_code.co_code[frame.f_lasti] @@ -125,6 +128,7 @@ class PyTracer(object): if self.threading: self.thread = self.threading.currentThread() sys.settrace(self._trace) + self.stopped = False return self._trace def stop(self): diff --git a/coverage/report.py b/coverage/report.py index 33a46070..df34e43f 100644 --- a/coverage/report.py +++ b/coverage/report.py @@ -1,9 +1,14 @@ -"""Reporter foundation for Coverage.""" +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +"""Reporter foundation for coverage.py.""" import os from coverage.files import prep_patterns, FnmatchMatcher -from coverage.misc import CoverageException, NoSource, NotPython +from coverage.misc import CoverageException, NoSource, NotPython, isolate_module + +os = isolate_module(os) class Reporter(object): @@ -29,30 +34,20 @@ class Reporter(object): def find_file_reporters(self, morfs): """Find the FileReporters we'll report on. - `morfs` is a list of modules or filenames. + `morfs` is a list of modules or file names. """ - self.file_reporters = self.coverage._get_file_reporters(morfs) + reporters = self.coverage._get_file_reporters(morfs) if self.config.include: - patterns = prep_patterns(self.config.include) - matcher = FnmatchMatcher(patterns) - filtered = [] - for fr in self.file_reporters: - if matcher.match(fr.filename): - filtered.append(fr) - self.file_reporters = filtered + matcher = FnmatchMatcher(prep_patterns(self.config.include)) + reporters = [fr for fr in reporters if matcher.match(fr.filename)] if self.config.omit: - patterns = prep_patterns(self.config.omit) - matcher = FnmatchMatcher(patterns) - filtered = [] - for fr in self.file_reporters: - if not matcher.match(fr.filename): - filtered.append(fr) - self.file_reporters = filtered + matcher = FnmatchMatcher(prep_patterns(self.config.omit)) + reporters = [fr for fr in reporters if not matcher.match(fr.filename)] - self.file_reporters.sort() + self.file_reporters = sorted(reporters) def report_files(self, report_fn, morfs, directory=None): """Run a reporting function on a number of morfs. @@ -84,5 +79,7 @@ class Reporter(object): except NotPython: # Only report errors for .py files, and only if we didn't # explicitly suppress those errors. + # NotPython is only raised by PythonFileReporter, which has a + # should_be_python() method. if fr.should_be_python() and not self.config.ignore_errors: raise diff --git a/coverage/results.py b/coverage/results.py index 7b621c18..9627373d 100644 --- a/coverage/results.py +++ b/coverage/results.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Results of coverage measurement.""" import collections @@ -9,19 +12,21 @@ from coverage.misc import format_lines class Analysis(object): """The results of analyzing a FileReporter.""" - def __init__(self, cov, file_reporters): - self.coverage = cov - self.file_reporter = file_reporters + def __init__(self, data, file_reporter): + self.data = data + self.file_reporter = file_reporter self.filename = self.file_reporter.filename - self.statements = self.file_reporter.statements() - self.excluded = self.file_reporter.excluded_statements() + self.statements = self.file_reporter.lines() + self.excluded = self.file_reporter.excluded_lines() # Identify missing statements. - executed = self.coverage.data.executed_lines(self.filename) + executed = self.data.lines(self.filename) or [] executed = self.file_reporter.translate_lines(executed) self.missing = self.statements - executed - if self.coverage.data.has_arcs(): + if self.data.has_arcs(): + self._arc_possibilities = sorted(self.file_reporter.arcs()) + self.exit_counts = self.file_reporter.exit_counts() self.no_branch = self.file_reporter.no_branch_lines() n_branches = self.total_branches() mba = self.missing_branch_arcs() @@ -30,8 +35,10 @@ class Analysis(object): ) n_missing_branches = sum(len(v) for k,v in iitems(mba)) else: - n_branches = n_partial_branches = n_missing_branches = 0 + self._arc_possibilities = [] + self.exit_counts = {} self.no_branch = set() + n_branches = n_partial_branches = n_missing_branches = 0 self.numbers = Numbers( n_files=1, @@ -53,15 +60,15 @@ class Analysis(object): def has_arcs(self): """Were arcs measured in this result?""" - return self.coverage.data.has_arcs() + return self.data.has_arcs() def arc_possibilities(self): """Returns a sorted list of the arcs in the code.""" - return self.file_reporter.arcs() + return self._arc_possibilities def arcs_executed(self): """Returns a sorted list of the arcs actually executed in the code.""" - executed = self.coverage.data.executed_arcs(self.filename) + executed = self.data.arcs(self.filename) or [] executed = self.file_reporter.translate_arcs(executed) return sorted(executed) @@ -113,13 +120,11 @@ class Analysis(object): def branch_lines(self): """Returns a list of line numbers that have more than one exit.""" - exit_counts = self.file_reporter.exit_counts() - return [l1 for l1,count in iitems(exit_counts) if count > 1] + return [l1 for l1,count in iitems(self.exit_counts) if count > 1] def total_branches(self): """How many total branches are there?""" - exit_counts = self.file_reporter.exit_counts() - return sum(count for count in exit_counts.values() if count > 1) + return sum(count for count in self.exit_counts.values() if count > 1) def missing_branch_arcs(self): """Return arcs that weren't executed from branch lines. @@ -142,11 +147,10 @@ class Analysis(object): (total_exits, taken_exits). """ - exit_counts = self.file_reporter.exit_counts() missing_arcs = self.missing_branch_arcs() stats = {} for lnum in self.branch_lines(): - exits = exit_counts[lnum] + exits = self.exit_counts[lnum] try: missing = len(missing_arcs[lnum]) except KeyError: diff --git a/coverage/summary.py b/coverage/summary.py index 5b8c903f..5ddbb380 100644 --- a/coverage/summary.py +++ b/coverage/summary.py @@ -1,10 +1,14 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Summary reporting""" import sys +from coverage import env from coverage.report import Reporter from coverage.results import Numbers -from coverage.misc import NotPython +from coverage.misc import NotPython, CoverageException, output_encoding class SummaryReporter(Reporter): @@ -17,55 +21,63 @@ class SummaryReporter(Reporter): def report(self, morfs, outfile=None): """Writes a report summarizing coverage statistics per module. - `outfile` is a file object to write the summary to. + `outfile` is a file object to write the summary to. It must be opened + for native strings (bytes on Python 2, Unicode on Python 3). """ self.find_file_reporters(morfs) # Prepare the formatting strings - max_name = max([len(fr.name) for fr in self.file_reporters] + [5]) - fmt_name = "%%- %ds " % max_name - fmt_err = "%s %s: %s\n" - header = (fmt_name % "Name") + " Stmts Miss" - fmt_coverage = fmt_name + "%6d %6d" + max_name = max([len(fr.relative_filename()) for fr in self.file_reporters] + [5]) + fmt_name = u"%%- %ds " % max_name + fmt_err = u"%s %s: %s\n" + fmt_skip_covered = u"\n%s file%s skipped due to complete coverage.\n" + + header = (fmt_name % "Name") + u" Stmts Miss" + fmt_coverage = fmt_name + u"%6d %6d" if self.branches: - header += " Branch BrPart" - fmt_coverage += " %6d %6d" + header += u" Branch BrPart" + fmt_coverage += u" %6d %6d" width100 = Numbers.pc_str_width() - header += "%*s" % (width100+4, "Cover") - fmt_coverage += "%%%ds%%%%" % (width100+3,) + header += u"%*s" % (width100+4, "Cover") + fmt_coverage += u"%%%ds%%%%" % (width100+3,) if self.config.show_missing: - header += " Missing" - fmt_coverage += " %s" - rule = "-" * len(header) + "\n" - header += "\n" - fmt_coverage += "\n" + header += u" Missing" + fmt_coverage += u" %s" + rule = u"-" * len(header) + u"\n" + header += u"\n" + fmt_coverage += u"\n" - if not outfile: + if outfile is None: outfile = sys.stdout + if env.PY2: + writeout = lambda u: outfile.write(u.encode(output_encoding())) + else: + writeout = outfile.write + # Write the header - outfile.write(header) - outfile.write(rule) + writeout(header) + writeout(rule) total = Numbers() + skipped_count = 0 for fr in self.file_reporters: try: analysis = self.coverage._analyze(fr) nums = analysis.numbers + total += nums if self.config.skip_covered: # Don't report on 100% files. no_missing_lines = (nums.n_missing == 0) - if self.branches: - no_missing_branches = (nums.n_partial_branches == 0) - else: - no_missing_branches = True + no_missing_branches = (nums.n_partial_branches == 0) if no_missing_lines and no_missing_branches: + skipped_count += 1 continue - args = (fr.name, nums.n_statements, nums.n_missing) + args = (fr.relative_filename(), nums.n_statements, nums.n_missing) if self.branches: args += (nums.n_branches, nums.n_partial_branches) args += (nums.pc_covered_str,) @@ -78,25 +90,32 @@ class SummaryReporter(Reporter): missing_fmtd += ", " missing_fmtd += branches_fmtd args += (missing_fmtd,) - outfile.write(fmt_coverage % args) - total += nums + writeout(fmt_coverage % args) except Exception: report_it = not self.config.ignore_errors if report_it: typ, msg = sys.exc_info()[:2] + # NotPython is only raised by PythonFileReporter, which has a + # should_be_python() method. if typ is NotPython and not fr.should_be_python(): report_it = False if report_it: - outfile.write(fmt_err % (fr.name, typ.__name__, msg)) + writeout(fmt_err % (fr.relative_filename(), typ.__name__, msg)) if total.n_files > 1: - outfile.write(rule) + writeout(rule) args = ("TOTAL", total.n_statements, total.n_missing) if self.branches: args += (total.n_branches, total.n_partial_branches) args += (total.pc_covered_str,) if self.config.show_missing: args += ("",) - outfile.write(fmt_coverage % args) + writeout(fmt_coverage % args) + + if not total.n_files and not skipped_count: + raise CoverageException("No data to report.") + + if self.config.skip_covered and skipped_count: + writeout(fmt_skip_covered % (skipped_count, 's' if skipped_count > 1 else '')) - return total.pc_covered + return total.n_statements and total.pc_covered diff --git a/coverage/templite.py b/coverage/templite.py index 9f882cf2..f131f748 100644 --- a/coverage/templite.py +++ b/coverage/templite.py @@ -1,4 +1,12 @@ -"""A simple Python template renderer, for a nano-subset of Django syntax.""" +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +"""A simple Python template renderer, for a nano-subset of Django syntax. + +For a detailed discussion of this code, see this chapter from 500 Lines: +http://aosabook.org/en/500L/a-template-engine.html + +""" # Coincidentally named the same as http://code.activestate.com/recipes/496702/ diff --git a/coverage/test_helpers.py b/coverage/test_helpers.py index 278b0a8a..50cc3298 100644 --- a/coverage/test_helpers.py +++ b/coverage/test_helpers.py @@ -1,7 +1,11 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Mixin classes to help make good tests.""" import atexit import collections +import contextlib import os import random import shutil @@ -39,6 +43,56 @@ class Tee(object): return getattr(self._files[0], name) +@contextlib.contextmanager +def change_dir(new_dir): + """Change directory, and then change back. + + Use as a context manager, it will give you the new directory, and later + restore the old one. + + """ + old_dir = os.getcwd() + os.chdir(new_dir) + try: + yield os.getcwd() + finally: + os.chdir(old_dir) + + +@contextlib.contextmanager +def saved_sys_path(): + """Save sys.path, and restore it later.""" + old_syspath = sys.path[:] + try: + yield + finally: + sys.path = old_syspath + + +def setup_with_context_manager(testcase, cm): + """Use a contextmanager to setUp a test case. + + If you have a context manager you like:: + + with ctxmgr(a, b, c) as v: + # do something with v + + and you want to have that effect for a test case, call this function from + your setUp, and it will start the context manager for your test, and end it + when the test is done:: + + def setUp(self): + self.v = setup_with_context_manager(self, ctxmgr(a, b, c)) + + def test_foo(self): + # do something with self.v + + """ + val = cm.__enter__() + testcase.addCleanup(cm.__exit__, None, None, None) + return val + + class ModuleAwareMixin(TestCase): """A test case mixin that isolates changes to sys.modules.""" @@ -46,7 +100,7 @@ class ModuleAwareMixin(TestCase): super(ModuleAwareMixin, self).setUp() # Record sys.modules here so we can restore it in cleanup_modules. - self.old_modules = dict(sys.modules) + self.old_modules = list(sys.modules) self.addCleanup(self.cleanup_modules) def cleanup_modules(self): @@ -64,13 +118,7 @@ class SysPathAwareMixin(TestCase): def setUp(self): super(SysPathAwareMixin, self).setUp() - - self.old_syspath = sys.path[:] - self.addCleanup(self.cleanup_syspath) - - def cleanup_syspath(self): - """Restore the original sys.path.""" - sys.path = self.old_syspath + setup_with_context_manager(self, saved_sys_path()) class EnvironmentAwareMixin(TestCase): @@ -142,7 +190,7 @@ class TempDirMixin(SysPathAwareMixin, ModuleAwareMixin, TestCase): """A test case mixin that creates a temp directory and files in it. Includes SysPathAwareMixin and ModuleAwareMixin, because making and using - temp dirs like this will also need that kind of isolation. + temp directories like this will also need that kind of isolation. """ @@ -235,7 +283,7 @@ class TempDirMixin(SysPathAwareMixin, ModuleAwareMixin, TestCase): # We run some tests in temporary directories, because they may need to make # files for the tests. But this is expensive, so we can change per-class - # whether a temp dir is used or not. It's easy to forget to set that + # whether a temp directory is used or not. It's easy to forget to set that # option properly, so we track information about what the tests did, and # then report at the end of the process on test classes that were set # wrong. diff --git a/coverage/version.py b/coverage/version.py index 51e1310f..dc4c57c9 100644 --- a/coverage/version.py +++ b/coverage/version.py @@ -1,9 +1,33 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """The version and URL for coverage.py""" # This file is exec'ed in setup.py, don't import anything! -__version__ = "4.0a6" # see detailed history in CHANGES.txt +# Same semantics as sys.version_info. +version_info = (4, 1, 0, 'alpha', 0) + + +def _make_version(major, minor, micro, releaselevel, serial): + """Create a readable version string from version_info tuple components.""" + assert releaselevel in ['alpha', 'beta', 'candidate', 'final'] + version = "%d.%d" % (major, minor) + if micro: + version += ".%d" % (micro,) + if releaselevel != 'final': + short = {'alpha': 'a', 'beta': 'b', 'candidate': 'rc'}[releaselevel] + version += "%s%d" % (short, serial) + return version + + +def _make_url(major, minor, micro, releaselevel, serial): + """Make the URL people should start at for this version of coverage.py.""" + url = "https://coverage.readthedocs.org" + if releaselevel != 'final': + # For pre-releases, use a version-specific URL. + url += "/en/coverage-" + _make_version(major, minor, micro, releaselevel, serial) + return url + -__url__ = "https://coverage.readthedocs.org" -if max(__version__).isalpha(): - # For pre-releases, use a version-specific URL. - __url__ += "/en/" + __version__ +__version__ = _make_version(*version_info) +__url__ = _make_url(*version_info) diff --git a/coverage/xmlreport.py b/coverage/xmlreport.py index 996f19a2..50a46841 100644 --- a/coverage/xmlreport.py +++ b/coverage/xmlreport.py @@ -1,13 +1,28 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """XML reporting for coverage.py""" import os +import os.path import sys import time import xml.dom.minidom -from coverage import __url__, __version__ +from coverage import env +from coverage import __url__, __version__, files +from coverage.misc import isolate_module from coverage.report import Reporter +os = isolate_module(os) + + +DTD_URL = ( + 'https://raw.githubusercontent.com/cobertura/web/' + 'f0366e5e2cf18f111cbd61fc34ef720a6584ba02' + '/htdocs/xml/coverage-03.dtd' +) + def rate(hit, num): """Return the fraction of `hit`/`num`, as a string.""" @@ -20,19 +35,22 @@ def rate(hit, num): class XmlReporter(Reporter): """A reporter for writing Cobertura-style XML coverage results.""" - def __init__(self, coverage, config, file_locator): + def __init__(self, coverage, config): super(XmlReporter, self).__init__(coverage, config) - self.file_locator = file_locator self.source_paths = set() + if config.source: + for src in config.source: + if os.path.exists(src): + self.source_paths.add(files.canonical_filename(src)) self.packages = {} self.xml_out = None - self.arcs = coverage.data.has_arcs() + self.has_arcs = coverage.data.has_arcs() def report(self, morfs, outfile=None): """Generate a Cobertura-compatible XML report for `morfs`. - `morfs` is a list of modules or filenames. + `morfs` is a list of modules or file names. `outfile` is a file object to write the XML to. @@ -42,11 +60,7 @@ class XmlReporter(Reporter): # Create the DOM that will store the data. impl = xml.dom.minidom.getDOMImplementation() - docType = impl.createDocumentType( - "coverage", None, - "http://cobertura.sourceforge.net/xml/coverage-03.dtd" - ) - self.xml_out = impl.createDocument(None, "coverage", docType) + self.xml_out = impl.createDocument(None, "coverage", None) # Write header stuff. xcoverage = self.xml_out.documentElement @@ -55,6 +69,7 @@ class XmlReporter(Reporter): xcoverage.appendChild(self.xml_out.createComment( " Generated by coverage.py: %s " % __url__ )) + xcoverage.appendChild(self.xml_out.createComment(" Based on %s " % DTD_URL)) # Call xml_file for each file in the data. self.report_files(self.xml_file, morfs) @@ -87,7 +102,7 @@ class XmlReporter(Reporter): xclasses.appendChild(class_elts[class_name]) xpackage.setAttribute("name", pkg_name.replace(os.sep, '.')) xpackage.setAttribute("line-rate", rate(lhits, lnum)) - if self.arcs: + if self.has_arcs: branch_rate = rate(bhits, bnum) else: branch_rate = "0" @@ -100,14 +115,17 @@ class XmlReporter(Reporter): bhits_tot += bhits xcoverage.setAttribute("line-rate", rate(lhits_tot, lnum_tot)) - if self.arcs: + if self.has_arcs: branch_rate = rate(bhits_tot, bnum_tot) else: branch_rate = "0" xcoverage.setAttribute("branch-rate", branch_rate) # Use the DOM to write the output file. - outfile.write(self.xml_out.toprettyxml()) + out = self.xml_out.toprettyxml() + if env.PY2: + out = out.encode("utf8") + outfile.write(out) # Return the total percentage. denom = lnum_tot + bnum_tot @@ -122,15 +140,16 @@ class XmlReporter(Reporter): # Create the 'lines' and 'package' XML elements, which # are populated later. Note that a package == a directory. - filename = self.file_locator.relative_filename(fr.filename) + filename = fr.relative_filename() filename = filename.replace("\\", "/") dirname = os.path.dirname(filename) or "." parts = dirname.split("/") dirname = "/".join(parts[:self.config.xml_package_depth]) package_name = dirname.replace("/", ".") - className = fr.name + rel_name = fr.relative_filename() - self.source_paths.add(self.file_locator.relative_dir.rstrip('/')) + if rel_name != fr.filename: + self.source_paths.add(fr.filename[:-len(rel_name)].rstrip(r"\/")) package = self.packages.setdefault(package_name, [{}, 0, 0, 0, 0]) xclass = self.xml_out.createElement("class") @@ -145,6 +164,7 @@ class XmlReporter(Reporter): xclass.setAttribute("complexity", "0") branch_stats = analysis.branch_stats() + missing_branch_arcs = analysis.missing_branch_arcs() # For each statement, create an XML 'line' element. for line in sorted(analysis.statements): @@ -155,7 +175,7 @@ class XmlReporter(Reporter): # executed? If so, that should be recorded here. xline.setAttribute("hits", str(int(line not in analysis.missing))) - if self.arcs: + if self.has_arcs: if line in branch_stats: total, taken = branch_stats[line] xline.setAttribute("branch", "true") @@ -163,12 +183,15 @@ class XmlReporter(Reporter): "condition-coverage", "%d%% (%d/%d)" % (100*taken/total, taken, total) ) + if line in missing_branch_arcs: + annlines = ["exit" if b < 0 else str(b) for b in missing_branch_arcs[line]] + xline.setAttribute("missing-branches", ",".join(annlines)) xlines.appendChild(xline) class_lines = len(analysis.statements) class_hits = class_lines - len(analysis.missing) - if self.arcs: + if self.has_arcs: class_branches = sum(t for t, k in branch_stats.values()) missing_branches = sum(t - k for t, k in branch_stats.values()) class_br_hits = class_branches - missing_branches @@ -178,13 +201,13 @@ class XmlReporter(Reporter): # Finalize the statistics that are collected in the XML DOM. xclass.setAttribute("line-rate", rate(class_hits, class_lines)) - if self.arcs: + if self.has_arcs: branch_rate = rate(class_br_hits, class_branches) else: branch_rate = "0" xclass.setAttribute("branch-rate", branch_rate) - package[0][className] = xclass + package[0][rel_name] = xclass package[1] += class_hits package[2] += class_lines package[3] += class_br_hits diff --git a/doc/_ext/px_cleaner.py b/doc/_ext/px_cleaner.py deleted file mode 100644 index 24541207..00000000 --- a/doc/_ext/px_cleaner.py +++ /dev/null @@ -1,19 +0,0 @@ -"""Clean up .px files created by Sphinx.""" - -import sys - -def clean_px(fname): - """Clean a px file.""" - - with open(fname) as f: - text = f.read() - text = text.lstrip() - with open(fname, "w") as f: - f.write(text) - -def clean_px_files(fnames): - for fname in fnames: - clean_px(fname) - -if __name__ == '__main__': - clean_px_files(sys.argv[1:]) diff --git a/doc/_ext/px_xlator.py b/doc/_ext/px_xlator.py deleted file mode 100644 index e4950d9a..00000000 --- a/doc/_ext/px_xlator.py +++ /dev/null @@ -1,117 +0,0 @@ -from docutils import nodes -from sphinx import addnodes -from sphinx.writers.html import SmartyPantsHTMLTranslator -from sphinx.builders.html import StandaloneHTMLBuilder -import os - -def setup(app): - app.add_builder(PxBuilder) - - -BaseHtmlXlator = SmartyPantsHTMLTranslator -class PxTranslator(BaseHtmlXlator): - """Adjust the HTML translator into a .px translator. - - """ - - def __init__(self, *args, **kwargs): - BaseHtmlXlator.__init__(self, *args, **kwargs) - #self.document.reporter.debug_flag = 1 - # To make the doc title be h0 (skipped), and the next h1. - self.initial_header_level = 0 - - def visit_section(self, node): - self.section_level += 1 - - def depart_section(self, node): - self.section_level -= 1 - - def visit_title(self, node): - if self.section_level == 1: - raise nodes.SkipNode - else: - # The id for the h2 tag is on the parent, move it - # down here so we'll get the right HTML. - if not node['ids'] and len(node.parent['ids']) > 1: - node['ids'] = [node.parent['ids'][1]] - BaseHtmlXlator.visit_title(self, node) - - def visit_field_list(self, node): - self.history = [] - - def depart_field_list(self, node): - if self.history: - self.body.append("<history>\n") - for hist in self.history: - when, what = hist.split(',', 1) - self.body.append("<what when='%s'>%s</what>\n" % (when, self.encode(what.strip()))) - self.body.append("</history>\n") - - prerel = None - if "b" in self.builder.config.release: - prerel = "a beta" - if "a" in self.builder.config.release: - prerel = "an ALPHA" - if prerel: - self.body.append(""" - <box> - These docs are for %s release, %s. - For the latest released version, see <a href='/code/coverage'>coverage.py</a>. - </box> - """ % (prerel, self.builder.config.release)) - - def visit_field(self, node): - if node.children[0].astext() == 'history': - self.history.append(node.children[1].astext()) - raise nodes.SkipChildren - - def depart_field(self, node): - pass - - def visit_literal_block(self, node): - if node.rawsource != node.astext(): - # most probably a parsed-literal block -- don't highlight - return BaseHtmlXlator.visit_literal_block(self, node) - lang = self.highlightlang - if node.has_key('language'): - # code-block directives - lang = node['language'] - self.body.append('<code lang="%s">' % lang) - self.body.append(self.encode(node.rawsource)) - self.body.append('</code>\n') - raise nodes.SkipNode - - def visit_desc_parameterlist(self, node): - # I'm overriding this method so that the base class doesn't write out - # <big>(</big>, but I also have to handle the logic from the base class, - # so most of this is just copied from sphinx/writers/html.py... - self.body.append('(') - self.first_param = 1 - self.optional_param_level = 0 - # How many required parameters are left. - self.required_params_left = sum([isinstance(c, addnodes.desc_parameter) - for c in node.children]) - self.param_separator = node.child_text_separator - def depart_desc_parameterlist(self, node): - self.body.append(')') - - -class PxBuilder(StandaloneHTMLBuilder): - name = 'px' - - def init(self): - self.config.html_theme = 'px' - self.config.html_translator_class = "px_xlator.PxTranslator" - - super(PxBuilder, self).init() - - self.out_suffix = '.px' - self.link_suffix = '.html' - - if max(self.config.release).isalpha(): - self.px_uri = "/code/coverage/beta/" - else: - self.px_uri = "/code/coverage/" - - def get_target_uri(self, docname, typ=None): - return self.px_uri + docname + self.link_suffix diff --git a/doc/_static/coverage.css b/doc/_static/coverage.css new file mode 100644 index 00000000..d32132ef --- /dev/null +++ b/doc/_static/coverage.css @@ -0,0 +1,7 @@ +body { + font-family: Georgia; +} + +h1, h2, h3, h4, h5, h6 { + font-family: Helvetica; +} diff --git a/doc/_templates/px/layout.html b/doc/_templates/px/layout.html deleted file mode 100644 index 01f03ee5..00000000 --- a/doc/_templates/px/layout.html +++ /dev/null @@ -1,17 +0,0 @@ -{%- block doctype -%} -<?xml version="1.0" encoding="utf-8" ?> -{%- endblock %} - -<page title='{{ title|striptags }}' {% if "b" in release %}index='no'{% endif %}> -{% block document -%} - {%- block body %} {% endblock -%} -{%- endblock %} - -{%- if prev or next %} -<p class='pmn pmnbot'> - {% if prev %}<span class='p'>« <i>Previous:</i> <a href="{{ prev.link|e }}" title="previous topic">{{ prev.title }}</a></span>{% endif %} - {% if next %}<span class='n'><i>Next:</i> <a href="{{ next.link|e }}" title="next topic">{{ next.title }}</a> »</span>{% endif %} -</p> -{%- endif %} - -</page> diff --git a/doc/_templates/px/theme.conf b/doc/_templates/px/theme.conf deleted file mode 100644 index 4003c3ab..00000000 --- a/doc/_templates/px/theme.conf +++ /dev/null @@ -1,4 +0,0 @@ -[theme]
-inherit = default
-
-[options]
diff --git a/doc/api.rst b/doc/api.rst index 815b75e0..26db06ef 100644 --- a/doc/api.rst +++ b/doc/api.rst @@ -1,8 +1,11 @@ +.. Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +.. For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + .. _api: -============ -Coverage API -============ +=============== +Coverage.py API +=============== .. :history: 20090524T134300, brand new docs. .. :history: 20090613T164000, final touches for 3.0 @@ -12,10 +15,10 @@ Coverage API .. :history: 20140819T132600, change class name to Coverage -The API to coverage.py is very simple, contained in a single module called -`coverage`. Most of the interface is in a single class, called -`Coverage`. Methods on the Coverage object correspond roughly to operations -available in the command line interface. For example, a simple use would be:: +The API to coverage.py is very simple, contained in a module called `coverage`. +Most of the interface is in the :class:`coverage.Coverage` class. Methods on +the Coverage object correspond roughly to operations available in the command +line interface. For example, a simple use would be:: import coverage @@ -29,20 +32,12 @@ available in the command line interface. For example, a simple use would be:: cov.html_report() +The :class:`coverage.CoverageData` class provides access to coverage data +stored in coverage.py data files. -The coverage module -------------------- - -.. module:: coverage - -.. autoclass:: Coverage - :members: - - -Starting coverage automatically -------------------------------- - -This function is used to start coverage measurement automatically when Python -starts. See :ref:`subprocess` for details. +.. toctree:: + :maxdepth: 1 -.. autofunction:: process_startup + api_coverage + api_coveragedata + api_plugin diff --git a/doc/api_coverage.rst b/doc/api_coverage.rst new file mode 100644 index 00000000..70a57eef --- /dev/null +++ b/doc/api_coverage.rst @@ -0,0 +1,25 @@ +.. Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +.. For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +.. _api_coverage: + +The Coverage class +------------------ + +.. :history: 20150802T174800, new file for 4.0b1 + +.. module:: coverage + +.. autoclass:: Coverage + :members: + :exclude-members: use_cache, sys_info + :special-members: __init__ + + +Starting coverage.py 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/api_coveragedata.rst b/doc/api_coveragedata.rst new file mode 100644 index 00000000..75215a3d --- /dev/null +++ b/doc/api_coveragedata.rst @@ -0,0 +1,17 @@ +.. Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +.. For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +.. _api_coveragedata: + +The CoverageData class +---------------------- + +.. :history: 20150802T174800, new doc for 4.0b1 + +.. versionadded:: 4.0 + +.. module:: coverage + +.. autoclass:: CoverageData + :members: + :special-members: __init__ diff --git a/doc/api_plugin.rst b/doc/api_plugin.rst new file mode 100644 index 00000000..3ab9cb2a --- /dev/null +++ b/doc/api_plugin.rst @@ -0,0 +1,35 @@ +.. Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +.. For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +.. _api_plugin: + +============== +Plugin classes +============== + +.. :history: 20150815T132400, new doc for 4.0b2 + +.. versionadded:: 4.0 + +.. module:: coverage + +The CoveragePlugin class +------------------------ + +.. autoclass:: CoveragePlugin + :members: + :member-order: bysource + +The FileTracer class +-------------------- + +.. autoclass:: FileTracer + :members: + :member-order: bysource + +The FileReporter class +---------------------- + +.. autoclass:: FileReporter + :members: + :member-order: bysource diff --git a/doc/branch.rst b/doc/branch.rst index 2738447e..9cee70bf 100644 --- a/doc/branch.rst +++ b/doc/branch.rst @@ -1,3 +1,6 @@ +.. Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +.. For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + .. _branch: =========================== @@ -13,7 +16,7 @@ Branch coverage measurement :linenothreshold: 5 -In addition to the usual statement coverage, Coverage.py also supports branch +In addition to the usual statement coverage, coverage.py also 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 all of their possible destinations. diff --git a/doc/changes.rst b/doc/changes.rst index c19d42f3..f0b1469a 100644 --- a/doc/changes.rst +++ b/doc/changes.rst @@ -1,3 +1,6 @@ +.. Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +.. For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + .. _changes: ==================================== @@ -28,65 +31,206 @@ Major change history for coverage.py .. :history: 20131005T205700, updated for 3.7 .. :history: 20131212T213100, updated for 3.7.1 .. :history: 20150124T134800, updated for 4.0a4 +.. :history: 20150802T174700, updated for 4.0b1 +.. :history: 20150822T092800, updated for 4.0b2 +.. :history: 20150919T072700, updated for 4.0 +.. :history: 20151013T103000, updated for 4.0.1 +.. :history: 20151104T050900, updated for 4.0.2 +.. :history: 20151124T065800, updated for 4.0.3 + These are the major changes for coverage.py. For a more complete change -history, see the `CHANGES.txt`_ file in the source tree. +history, see the `CHANGES.rst`_ file in the source tree. + +.. _CHANGES.rst: http://bitbucket.org/ned/coveragepy/src/tip/CHANGES.rst + +.. module:: coverage + +.. _changes_403: + +Version 4.0.3 --- 24 November 2015 +---------------------------------- + +- Fixed a mysterious problem that manifested in different ways: sometimes + hanging the process (`issue 420`_), sometimes making database connections + fail (`issue 445`_). + +- The XML report now has correct ``<source>`` elements when using a + ``--source=`` option somewhere besides the current directory. This fixes + `issue 439`_. Thanks, Arcady Ivanov. + +- Fixed an unusual edge case of detecting source encodings, described in + `issue 443`_. + +- Help messages that mention the command to use now properly use the actual + command name, which might be different than "coverage". Thanks to Ben Finney, + this closes `issue 438`_. + +.. _issue 420: https://bitbucket.org/ned/coveragepy/issues/420/coverage-40-hangs-indefinitely-on-python27 +.. _issue 438: https://bitbucket.org/ned/coveragepy/issues/438/parameterise-coverage-command-name +.. _issue 439: https://bitbucket.org/ned/coveragepy/issues/439/incorrect-cobertura-file-sources-generated +.. _issue 443: https://bitbucket.org/ned/coveragepy/issues/443/coverage-gets-confused-when-encoding +.. _issue 445: https://bitbucket.org/ned/coveragepy/issues/445/django-app-cannot-connect-to-cassandra + + +.. _changes_402: + +Version 4.0.2 --- 4 November 2015 +--------------------------------- + +- More work on supporting unusually encoded source. Fixed `issue 431`_. + +- Files or directories with non-ASCII characters are now handled properly, + fixing `issue 432`_. -.. _CHANGES.txt: http://bitbucket.org/ned/coveragepy/src/tip/CHANGES.txt +- Setting a trace function with sys.settrace was broken by a change in 4.0.1, + as reported in `issue 436`_. This is now fixed. + +- Officially support PyPy 4.0, which required no changes, just updates to the + docs. + +.. _issue 431: https://bitbucket.org/ned/coveragepy/issues/431/couldnt-parse-python-file-with-cp1252 +.. _issue 432: https://bitbucket.org/ned/coveragepy/issues/432/path-with-unicode-characters-various +.. _issue 436: https://bitbucket.org/ned/coveragepy/issues/436/disabled-coverage-ctracer-may-rise-from + + +.. _changes_401: + +Version 4.0.1 --- 13 October 2015 +--------------------------------- + +- When combining data files, unreadable files will now generate a warning + instead of failing the command. This is more in line with the older + coverage.py v3.7.1 behavior, which silently ignored unreadable files. + Prompted by `issue 418`_. + +- The --skip-covered option would skip reporting on 100% covered files, but + also skipped them when calculating total coverage. This was wrong, it should + only remove lines from the report, not change the final answer. This is now + fixed, closing `issue 423`_. + +- In 4.0, the data file recorded a summary of the system on which it was run. + Combined data files would keep all of those summaries. This could lead to + enormous data files consisting of mostly repetitive useless information. That + summary is now gone, fixing `issue 415`_. If you want summary information, + get in touch, and we'll figure out a better way to do it. + +- Test suites that mocked os.path.exists would experience strange failures, due + to coverage.py using their mock inadvertently. This is now fixed, closing + `issue 416`_. + +- Importing a ``__init__`` module explicitly would lead to an error: + ``AttributeError: 'module' object has no attribute '__path__'``, as reported + in `issue 410`_. This is now fixed. + +- Code that uses ``sys.settrace(sys.gettrace())`` used to incur a more than 2x + speed penalty. Now there's no penalty at all. Fixes `issue 397`_. + +- Pyexpat C code will no longer be recorded as a source file, fixing + `issue 419`_. + +- The source kit now contains all of the files needed to have a complete source + tree, re-fixing `issue 137`_ and closing `issue 281`_. + +.. _issue 281: https://bitbucket.org/ned/coveragepy/issues/281/supply-scripts-for-testing-in-the +.. _issue 397: https://bitbucket.org/ned/coveragepy/issues/397/stopping-and-resuming-coverage-with +.. _issue 410: https://bitbucket.org/ned/coveragepy/issues/410/attributeerror-module-object-has-no +.. _issue 415: https://bitbucket.org/ned/coveragepy/issues/415/repeated-coveragedataupdates-cause +.. _issue 416: https://bitbucket.org/ned/coveragepy/issues/416/mocking-ospathexists-causes-failures +.. _issue 418: https://bitbucket.org/ned/coveragepy/issues/418/json-parse-error +.. _issue 419: https://bitbucket.org/ned/coveragepy/issues/419/nosource-no-source-for-code-path-to-c +.. _issue 423: https://bitbucket.org/ned/coveragepy/issues/423/skip_covered-changes-reported-total .. _changes_40: -Version 4.0a5 pre-release --- 16 February 2015 ----------------------------------------------- +Version 4.0 --- 20 September 2015 +--------------------------------- + Backward incompatibilities: -- CPython versions supported are now Python 2.6, 2.7, 3.3, 3.4 and 3.5a1. - PyPy2 2.4 and PyPy3 2.4 are also supported. +- Python versions supported are now: + + - CPython 2.6, 2.7, 3.3, 3.4 and 3.5 + - PyPy2 2.4, 2.6 + - PyPy3 2.4 -- The original command line switches (`-x` to run a program, etc) are no +- The original command line switches (``-x`` to run a program, etc) are no longer supported. - The ``COVERAGE_OPTIONS`` environment variable is no longer supported. It was a hack for ``--timid`` before configuration files were available. -Major new features: +- The original module-level function interface to coverage.py is no longer + supported. You must now create a :class:`coverage.Coverage` object, and use + methods on it. -- Gevent, eventlet, and greenlet are now supported, closing `issue 149`_. - The ``concurrency`` setting specifies the concurrency library in use. Huge - thanks to Peter Portante for initial implementation, and to Joe Jevnik for - the final insight that completed the work. +- The ``Coverage.use_cache`` method is no longer supported. -- The HTML report now has filtering. Type text into the Filter box on the - index page, and only modules with that text in the name will be shown. - Thanks, Danny Allen. +- The private method ``Coverage._harvest_data`` is now called + :meth:`Coverage.get_data`, and returns the :class:`CoverageData` containing + the collected data. + +- Coverage.py is now licensed under the Apache 2.0 license. See `NOTICE.txt`_ + for details. + +- Coverage.py kits no longer include tests and docs. If you were using them, + get in touch and let me know how. + +.. _NOTICE.txt: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + + +Major new features: - Plugins: third parties can write plugins to add file support for non-Python files, such as web application templating engines, or languages that compile - down to Python. + down to Python. See :ref:`plugins` for how to use plugins, and + :ref:`api_plugin` for details of how to write them. A plugin for measuring + Django template coverage is available: `django_coverage_plugin`_ + +- Gevent, eventlet, and greenlet are now supported. The ``[run] concurrency`` + setting, or the ``--concurrency`` command line switch, specifies the + concurrency library in use. Huge thanks to Peter Portante for initial + implementation, and to Joe Jevnik for the final insight that completed the + work. + +- The data storage has been re-written, using JSON instead of pickle. The + :class:`.CoverageData` class is a new supported API to the contents of the + data file. Data files from older versions of coverage.py can be converted to + the new format with ``python -m coverage.pickle2json``. - Wildly experimental: support for measuring processes started by the multiprocessing module. To use, set ``--concurrency=multiprocessing``, - either on the command line or in the .coveragerc file (`issue 117`_). Thanks, - Eduardo Schettino. Currently, this does not work on Windows. + either on the command line or in the .coveragerc file. Thanks, Eduardo + Schettino. Currently, this does not work on Windows. + New features: - Options are now also read from a setup.cfg file, if any. Sections are prefixed with "coverage:", so the ``[run]`` options will be read from the - ``[coverage:run]`` section of setup.cfg. Finishes `issue 304`_. + ``[coverage:run]`` section of setup.cfg. -- A new option: `coverage report --skip-covered` will reduce the number of - files reported by skipping files with 100% coverage. Thanks, Krystian - Kichewko. This means that empty `__init__.py` files will be skipped, since - they are 100% covered, closing `issue 315`_. +- The HTML report now has filtering. Type text into the Filter box on the + index page, and only modules with that text in the name will be shown. + Thanks, Danny Allen. + +- A new option: ``coverage report --skip-covered`` (or ``[report] skip_covered``) + will reduce the number of files reported by skipping files with 100% + coverage. Thanks, Krystian Kichewko. This means that empty ``__init__.py`` + files will be skipped, since they are 100% covered. - You can now specify the ``--fail-under`` option in the ``.coveragerc`` file - as the ``[report] fail_under`` options. This closes `issue 314`_. + as the ``[report] fail_under`` option. + +- The ``report -m`` command now shows missing branches when reporting on branch + coverage. Thanks, Steve Leonard. -- The ``report`` command can now show missing branches when reporting on branch - coverage. Thanks, Steve Leonard. Closes `issue 230`_. +- The ``coverage combine`` command now accepts any number of directories or + files as arguments, and will combine all the data from them. This means you + don't have to copy the files to one directory before combining. Thanks, + Christine Lytwynec. - A new configuration option for the XML report: ``[xml] package_depth`` controls which directories are identified as packages in the report. @@ -94,42 +238,70 @@ New features: The default is that all directories are reported as packages. Thanks, Lex Berezhny. +- A new configuration option, ``[run] note``, lets you set a note that will be + stored in the ``runs`` section of the data file. You can use this to + annotate the data file with any information you like. + +- The COVERAGE_DEBUG environment variable can be used to set the ``[run] debug`` + configuration option to control what internal operations are logged. + +- A new version identifier is available, `coverage.version_info`, a plain tuple + of values similar to `sys.version_info`_. + + Improvements: - Coverage.py now always adds the current directory to sys.path, so that - plugins can import files in the current directory (`issue 358`_). + plugins can import files in the current directory. -- The ``--debug`` switch can now be used on any command. +- Coverage.py now accepts a directory name for ``coverage run`` and will run a + ``__main__.py`` found there, just like Python will. Thanks, Dmitry Trofimov. -- The XML report now contains a <source> element, fixing `issue 94`_. Thanks - Stan Hu. +- The ``--debug`` switch can now be used on any command. - Reports now use file names with extensions. Previously, a report would describe a/b/c.py as "a/b/c". Now it is shown as "a/b/c.py". This allows - for better support of non-Python files, and also fixed `issue 69`_. + for better support of non-Python files. + +- Missing branches in the HTML report now have a bit more information in the + right-hand annotations. Hopefully this will make their meaning clearer. + +- The XML report now contains a <source> element. Thanks Stan Hu. + +- The XML report now includes a ``missing-branches`` attribute. Thanks, Steve + Peak. This is not a part of the Cobertura DTD, so the XML report no longer + references the DTD. - The XML report now reports each directory as a package again. This was a bad - regression, I apologize. This was reported in `issue 235`_, which is now - fixed. + regression, I apologize. + +- In parallel mode, ``coverage erase`` will now delete all of the data files. - A new warning is possible, if a desired file isn't measured because it was - imported before coverage was started (`issue 353`_). + imported before coverage.py was started. + +- The :func:`coverage.process_startup` function now will start coverage + measurement only once, no matter how many times it is called. This fixes + problems due to unusual virtualenv configurations. + +- Unrecognized configuration options will now print an error message and stop + coverage.py. This should help prevent configuration mistakes from passing + silently. -- The `coverage.process_startup` function now will start coverage measurement - only once, no matter how many times it is called. This fixes problems due - to unusual virtualenv configurations (`issue 340`_). API changes: - The class defined in the coverage module is now called ``Coverage`` instead of ``coverage``, though the old name still works, for backward compatibility. -- You can now programmatically adjust the configuration of coverage by setting - items on `Coverage.config` after construction. +- You can now programmatically adjust the configuration of coverage.py by + calling :meth:`Coverage.set_option` after construction. + :meth:`Coverage.get_option` reads the configuration values. - If the `config_file` argument to the Coverage constructor is specified as ".coveragerc", it is treated as if it were True. This means setup.cfg is - also examined, and a missing file is not considered an error (`issue 357`_). + also examined, and a missing file is not considered an error. + Bug fixes: @@ -141,38 +313,36 @@ Bug fixes: - The ``fail-under`` value is now rounded the same as reported results, preventing paradoxical results, fixing `issue 284`_. +- Branch coverage couldn't properly handle certain extremely long files. This + is now fixed, closing `issue 359`_. + +- Branch coverage didn't understand yield statements properly. Mickie Betz + persisted in pursuing this despite Ned's pessimism. Fixes `issue 308`_ and + `issue 324`_. + +- Files with incorrect encoding declaration comments are no longer ignored by + the reporting commands. + - Empty files are now reported as 100% covered in the XML report, not 0% - covered (`issue 345`_). + covered. -- The XML report will now create the output directory if need be, fixing - `issue 285`_. Thanks Chris Rose. +- The XML report will now create the output directory if need be. Thanks, Chris + Rose. - HTML reports no longer raise UnicodeDecodeError if a Python file has - undecodable characters, fixing `issue 303`_ and `issue 331`_. + undecodable characters. - The annotate command will now annotate all files, not just ones relative to - the current directory, fixing `issue 57`_. - -.. _issue 57: https://bitbucket.org/ned/coveragepy/issue/57/annotate-command-fails-to-annotate-many -.. _issue 69: https://bitbucket.org/ned/coveragepy/issue/69/coverage-html-overwrite-files-that-doesnt -.. _issue 94: https://bitbucket.org/ned/coveragepy/issue/94/coverage-xml-doesnt-produce-sources -.. _issue 117: https://bitbucket.org/ned/coveragepy/issue/117/enable-coverage-measurement-of-code-run-by -.. _issue 149: https://bitbucket.org/ned/coveragepy/issue/149/coverage-gevent-looks-broken -.. _issue 230: https://bitbucket.org/ned/coveragepy/issue/230/show-line-no-for-missing-branches-in -.. _issue 235: https://bitbucket.org/ned/coveragepy/issue/235/package-name-is-missing-in-xml-report + the current directory. + + +.. _django_coverage_plugin: https://pypi.python.org/pypi/django_coverage_plugin .. _issue 284: https://bitbucket.org/ned/coveragepy/issue/284/fail-under-should-show-more-precision -.. _issue 285: https://bitbucket.org/ned/coveragepy/issue/285/xml-report-fails-if-output-file-directory -.. _issue 303: https://bitbucket.org/ned/coveragepy/issue/303/unicodedecodeerror -.. _issue 304: https://bitbucket.org/ned/coveragepy/issue/304/attempt-to-get-configuration-from-setupcfg -.. _issue 314: https://bitbucket.org/ned/coveragepy/issue/314/fail_under-param-not-working-in-coveragerc -.. _issue 315: https://bitbucket.org/ned/coveragepy/issue/315/option-to-omit-empty-files-eg-__init__py -.. _issue 331: https://bitbucket.org/ned/coveragepy/issue/331/failure-of-encoding-detection-on-python2 -.. _issue 340: https://bitbucket.org/ned/coveragepy/issue/340/keyerror-subpy +.. _issue 308: https://bitbucket.org/ned/coveragepy/issue/308/yield-lambda-branch-coverage +.. _issue 324: https://bitbucket.org/ned/coveragepy/issue/324/yield-in-loop-confuses-branch-coverage .. _issue 342: https://bitbucket.org/ned/coveragepy/issue/342/console-and-html-coverage-reports-differ -.. _issue 345: https://bitbucket.org/ned/coveragepy/issue/345/xml-reports-line-rate-0-for-empty-files -.. _issue 353: https://bitbucket.org/ned/coveragepy/issue/353/40a3-introduces-an-unexpected-third-case -.. _issue 357: https://bitbucket.org/ned/coveragepy/issue/357/behavior-changed-when-coveragerc-is -.. _issue 358: https://bitbucket.org/ned/coveragepy/issue/358/all-coverage-commands-should-adjust +.. _issue 359: https://bitbucket.org/ned/coveragepy/issue/359/xml-report-chunk-error +.. _sys.version_info: https://docs.python.org/3/library/sys.html#sys.version_info .. _changes_371: @@ -200,9 +370,9 @@ Version 3.7 --- 6 October 2013 - Running code with ``coverage run -m`` now behaves more like Python does, setting sys.path properly, which fixes `issue 207`_ and `issue 242`_. -- Coverage can now run .pyc files directly, closing `issue 264`_. +- Coverage.py can now run .pyc files directly, closing `issue 264`_. -- Coverage properly supports .pyw files, fixing `issue 261`_. +- Coverage.py properly supports .pyw files, fixing `issue 261`_. - Omitting files within a tree specified with the ``source`` option would cause them to be incorrectly marked as unexecuted, as described in @@ -218,9 +388,10 @@ Version 3.7 --- 6 October 2013 - Trying to create an XML report with no files to report on, would cause a ZeroDivideError, but no longer does, fixing `issue 250`_. -- When running a threaded program under the Python tracer, coverage no longer - issues a spurious warning about the trace function changing: "Trace function - changed, measurement is likely wrong: None." This fixes `issue 164`_. +- When running a threaded program under the Python tracer, coverage.py no + longer issues a spurious warning about the trace function changing: "Trace + function changed, measurement is likely wrong: None." This fixes + `issue 164`_. - Static files necessary for HTML reports are found in system-installed places, to ease OS-level packaging of coverage.py. Closes `issue 259`_. @@ -316,10 +487,10 @@ Fixes: - ``debug sys`` now shows the configuration file path that was read. - If an oddly-behaved package claims that code came from an empty-string - filename, coverage.py no longer associates it with the directory name, + file name, coverage.py no longer associates it with the directory name, fixing `issue 221`_. -- The XML report now consistently uses filenames for the filename attribute, +- The XML report now consistently uses file names for the filename attribute, rather than sometimes using module names. Fixes `issue 67`_. Thanks, Marcus Cobden. @@ -348,8 +519,9 @@ Fixes: - Jython files now work with the ``--source`` option, fixing `issue 100`_. -- Running coverage under a debugger is unlikely to work, but it shouldn't fail - with "TypeError: 'NoneType' object is not iterable". Fixes `issue 201`_. +- Running coverage.py under a debugger is unlikely to work, but it shouldn't + fail with "TypeError: 'NoneType' object is not iterable". Fixes + `issue 201`_. - On some Linux distributions, when installed with the OS package manager, coverage.py would report its own code as part of the results. Now it won't, @@ -441,7 +613,7 @@ Version 3.5.2 --- 4 May 2012 option, fixing `issue 168`_. - If a file doesn't parse properly as Python, we don't report it as an error - if the filename seems like maybe it wasn't meant to be Python. This is a + if the file name seems like maybe it wasn't meant to be Python. This is a pragmatic fix for `issue 82`_. - The ``-m`` switch on ``coverage report``, which includes missing line numbers @@ -471,10 +643,10 @@ Version 3.5.2 --- 4 May 2012 Version 3.5.1 --- 23 September 2011 ----------------------------------- -- When combining data files from parallel runs, you can now instruct coverage - about which directories are equivalent on different machines. A ``[paths]`` - section in the configuration file lists paths that are to be considered - equivalent. Finishes `issue 17`_. +- When combining data files from parallel runs, you can now instruct + coverage.py about which directories are equivalent on different machines. A + ``[paths]`` section in the configuration file lists paths that are to be + considered equivalent. Finishes `issue 17`_. - for-else constructs are understood better, and don't cause erroneous partial branch warnings. Fixes `issue 122`_. @@ -496,7 +668,7 @@ Version 3.5.1 --- 23 September 2011 - In order to help the core developers measure the test coverage of the standard library, Brandon Rhodes devised an aggressive hack to trick Python - into running some coverage code before anything else in the process. + into running some coverage.py code before anything else in the process. See the coverage/fullcoverage directory if you are interested. .. _issue 17: http://bitbucket.org/ned/coveragepy/issue/17/support-combining-coverage-data-from @@ -585,7 +757,7 @@ Controlling source: file patterns rather than file prefixes, closing `issue 34`_ and `issue 36`_. - BACKWARD INCOMPATIBILITY: the `omit_prefixes` argument is gone throughout - coverage.py, replaced with `omit`, a list of filename patterns suitable for + coverage.py, replaced with `omit`, a list of file name patterns suitable for `fnmatch`. A parallel argument `include` controls what files are included. - The run command now has a ``--source`` switch, a list of directories or @@ -653,7 +825,7 @@ Execution and measurement: - When measuring code running in a virtualenv, most of the system library was being measured when it shouldn't have been. This is now fixed. -- Coverage can now be run as a module: ``python -m coverage``. Thanks, +- Coverage.py can now be run as a module: ``python -m coverage``. Thanks, Brett Cannon. .. _issue 1: http://bitbucket.org/ned/coveragepy/issue/1/empty-__init__py-files-are-reported-as-1-executable @@ -731,7 +903,7 @@ Version 3.2 --- 5 December 2009 - Added a ``--version`` option on the command line. -- Program execution under coverage is a few percent faster. +- Program execution under coverage.py 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`_. @@ -792,7 +964,7 @@ Version 3.0.1 --- 7 July 2009 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. + coverage.py 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 @@ -802,13 +974,13 @@ Version 3.0.1 --- 7 July 2009 Version 3.0 --- 13 June 2009 ---------------------------- -- Coverage is now a package rather than a module. Functionality has been split - into classes. +- Coverage.py 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 +- The trace function is implemented in C for speed. Coverage.py runs are now much faster. Thanks to David Christian for productive micro-sprints and other encouragement. diff --git a/doc/cmd.rst b/doc/cmd.rst index b1eeb633..a66df82d 100644 --- a/doc/cmd.rst +++ b/doc/cmd.rst @@ -1,8 +1,11 @@ +.. Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +.. For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + .. _cmd: -=========================== -Coverage command line usage -=========================== +============================== +Coverage.py command line usage +============================== .. :history: 20090524T134300, brand new docs. .. :history: 20090613T164000, final touches for 3.0 @@ -18,6 +21,7 @@ Coverage command line usage .. :history: 20121003T074600, Fixed an option reference, https://bitbucket.org/ned/coveragepy/issue/200/documentation-mentions-output-xml-instead .. :history: 20121117T091000, Added command aliases. .. :history: 20140924T193000, Added --concurrency +.. :history: 20150802T174700, Updated for 4.0b1 .. highlight:: console @@ -29,7 +33,7 @@ and a ``coverage-X.Y`` alias, depending on the version of Python you're using. For example, when installing on Python 2.7, you will be able to use ``coverage``, ``coverage2``, or ``coverage-2.7`` on the command line. -Coverage has a number of commands which determine the action performed: +Coverage.py has a number of commands which determine the action performed: * **run** -- Run a Python program and collect execution data. @@ -78,7 +82,7 @@ command:: 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 as usual in -``sys.argv``. Rather than providing a filename, you can use the ``-m`` switch +``sys.argv``. Rather than providing a file name, you can use the ``-m`` switch and specify an importable module name instead, just as you can with the Python ``-m`` switch:: @@ -96,22 +100,23 @@ but before the program invocation:: $ coverage run --source=dir1,dir2 my_program.py arg1 arg2 $ coverage run --source=dir1,dir2 -m packagename.modulename arg1 arg2 -Coverage can measure multi-threaded programs by default. If you are using -more exotic concurrency, with the `greenlet`_, `eventlet`_, or `gevent`_ -libraries, then coverage will get very confused. Use the ``--concurrency`` -switch to properly measure programs using these libraries. Give it a value of -``greenlet``, ``eventlet``, or ``gevent``. +Coverage.py can measure multi-threaded programs by default. If you are using +more exotic concurrency, with the `multiprocessing`_, `greenlet`_, `eventlet`_, +or `gevent`_ libraries, then coverage.py will get very confused. Use the +``--concurrency`` switch to properly measure programs using these libraries. +Give it a value of ``greenlet``, ``eventlet``, or ``gevent``. +.. _multiprocessing: https://docs.python.org/2/library/multiprocessing.html .. _greenlet: http://greenlet.readthedocs.org/en/latest/ .. _gevent: http://www.gevent.org/ .. _eventlet: http://eventlet.net/ -By default, coverage does not measure code installed with the Python +By default, coverage.py does not measure code installed with the Python interpreter, for example, the standard library. If you want to measure that code as well as your own, add the ``-L`` flag. If your coverage results seem to be overlooking code that you know has been -executed, try running coverage again with the ``--timid`` flag. This uses a +executed, try running coverage.py again with the ``--timid`` flag. This uses a simpler but slower trace method. Projects that use DecoratorTools, including TurboGears, will need to use ``--timid`` to get correct results. @@ -147,24 +152,11 @@ could affect the measurement process. The possible warnings include: This could be because you asked to measure only modules that never ran, or for other reasons. -.. _cmd_run_debug: - -The ``--debug`` option instructs coverage to log internal details of its -operation, to help with diagnosing problems. It takes a comma-separated list -of options, each indicating a facet of operation to log to stderr: - -* ``trace``: print every decision about whether to trace a file or not. For - files not being traced, the reason is also given. - -* ``config``: before starting, dump all the :ref:`configuration <config>` - values. +* "Module XXX was previously imported, but not measured." -* ``sys``: before starting, dump all the system and environment information, - as with :ref:`coverage debug sys <cmd_debug>`. - -* ``dataio``: log when reading or writing any data file. - -* ``pid``: annotate all debug output with the process id. + You asked coverage.py to measure module XXX, but it had already been imported + when coverage started. This meant coverage.py couldn't monitor its + execution. .. _cmd_datafile: @@ -172,8 +164,9 @@ of options, each indicating a facet of operation to log to stderr: Data file --------- -Coverage collects execution data in a file called ".coverage". If need be, you -can set a new file name with the COVERAGE_FILE environment variable. +Coverage.py collects execution data in a file called ".coverage". If need be, +you can set a new file name with the COVERAGE_FILE environment variable. This +can include a path to another directory. 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 @@ -191,9 +184,7 @@ Combining data files -------------------- If you need to collect coverage data from different machines or processes, -coverage can combine multiple files into one for reporting. Use the ``-p`` flag -during execution to append distinguishing information to the .coverage data -file name. +coverage.py can combine multiple files into one for reporting. Once you have created a number of these files, you can copy them all to a single directory, and use the **combine** command to combine them into one @@ -201,36 +192,54 @@ single directory, and use the **combine** command to combine them into one $ coverage combine -If the different machines run your code from different places in their file -systems, coverage won't know how to combine the data. You can tell coverage -how the different locations correlate with a ``[paths]`` section in your -configuration file. See :ref:`config_paths` for details. +You can also name directories or files on the command line:: + + $ coverage combine data1.dat windows_data_files/ + +Coverage.py will collect the data from those places and combine them. The +current directory isn't searched if you use command-line arguments. If you +also want data from the current directory, name it explicitly on the command +line. -If you are collecting and renaming your own data files, you'll need to name -them properly for **combine** to find them. It looks for files named after -the data file (defaulting to ".coverage", overridable with COVERAGE_FILE), with -a dotted suffix. All such files in the current directory will be combined. -Here are some examples of data files that can be combined:: +When coverage.py looks in directories for data files to combine, even the +current directory, it only reads files with certain names. It looks for files +named the same as the data file (defaulting to ".coverage"), with a dotted +suffix. Here are some examples of data files that can be combined:: .coverage.machine1 .coverage.20120807T212300 .coverage.last_good_run.ok +The ``run --parallel-mode`` switch automatically creates separate data files +for each run which can be combined later. The file names include the machine +name, the process id, and a random number:: + + .coverage.Neds-MacBook-Pro.local.88335.316857 + .coverage.Geometer.8044.799674 + +If the different machines run your code from different places in their file +systems, coverage.py won't know how to combine the data. You can tell +coverage.py how the different locations correlate with a ``[paths]`` section in +your configuration file. See :ref:`config_paths` for details. + +If any data files can't be read, coverage.py will print a warning indicating +the file and the problem. + .. _cmd_reporting: Reporting --------- -Coverage provides a few styles of reporting, with the **report**, **html**, +Coverage.py provides a few styles of reporting, with the **report**, **html**, **annotate**, and **xml** commands. They share a number of common options. The command-line arguments are module or file names to report on, if you'd like to report on a subset of the data collected. -The ``--include`` and ``--omit`` flags specify lists of filename patterns. They -control which files to report on, and are described in more detail -in :ref:`source`. +The ``--include`` and ``--omit`` flags specify lists of file name patterns. +They control which files to report on, and are described in more detail in +:ref:`source`. The ``-i`` or ``--ignore-errors`` switch tells coverage.py to ignore problems encountered trying to find source files to report on. This can be useful if @@ -254,9 +263,9 @@ The simplest reporting is a textual summary produced with **report**:: $ coverage report Name Stmts Miss Cover --------------------------------------------- - my_program 20 4 80% - my_module 15 2 86% - my_other_module 56 6 89% + my_program.py 20 4 80% + my_module.py 15 2 86% + my_other_module.py 56 6 89% --------------------------------------------- TOTAL 91 12 87% @@ -269,9 +278,9 @@ The ``-m`` flag also shows the line numbers of missing statements:: $ coverage report -m Name Stmts Miss Cover Missing ------------------------------------------------------- - my_program 20 4 80% 33-35, 39 - my_module 15 2 86% 8, 12 - my_other_module 56 6 89% 17-23 + my_program.py 20 4 80% 33-35, 39 + my_module.py 15 2 86% 8, 12 + my_other_module.py 56 6 89% 17-23 ------------------------------------------------------- TOTAL 91 12 87% @@ -282,9 +291,9 @@ detail the missed branches:: $ coverage report -m Name Stmts Miss Branch BrPart Cover Missing --------------------------------------------------------------------- - my_program 20 4 10 2 80% 33-35, 36->38, 39 - my_module 15 2 3 0 86% 8, 12 - my_other_module 56 6 5 1 89% 17-23, 40->45 + my_program.py 20 4 10 2 80% 33-35, 36->38, 39 + my_module.py 15 2 3 0 86% 8, 12 + my_other_module.py 56 6 5 1 89% 17-23, 40->45 --------------------------------------------------------------------- TOTAL 91 12 18 3 87% @@ -294,11 +303,14 @@ command line:: $ coverage report -m my_program.py my_other_module.py Name Stmts Miss Cover Missing ------------------------------------------------------- - my_program 20 4 80% 33-35, 39 - my_other_module 56 6 89% 17-23 + my_program.py 20 4 80% 33-35, 39 + my_other_module.py 56 6 89% 17-23 ------------------------------------------------------- TOTAL 76 10 87% +The ``--skip-covered`` switch will leave out any file with 100% coverage, +letting you focus on the files that still need attention. + Other common reporting options are described above in :ref:`cmd_reporting`. @@ -307,14 +319,14 @@ Other common reporting options are described above in :ref:`cmd_reporting`. HTML annotation --------------- -Coverage can annotate your source code for which lines were executed +Coverage.py can annotate your source code for which lines were executed 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 +__ http://nedbatchelder.com/files/sample_coverage_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 @@ -403,3 +415,37 @@ command can often help:: Two types of information are available: ``sys`` to show system configuration, and ``data`` to show a summary of the collected coverage data. + + +.. _cmd_run_debug: + +The ``--debug`` option is available on all commands. It instructs coverage.py +to log internal details of its operation, to help with diagnosing problems. It +takes a comma-separated list of options, each indicating a facet of operation +to log: + +* ``callers``: annotate each debug message with a stack trace of the callers + to that point. + +* ``config``: before starting, dump all the :ref:`configuration <config>` + values. + +* ``dataio``: log when reading or writing any data file. + +* ``dataop``: log when data is added to the CoverageData object. + +* ``pid``: annotate all debug output with the process id. + +* ``plugin``: print information about plugin operations. + +* ``sys``: before starting, dump all the system and environment information, + as with :ref:`coverage debug sys <cmd_debug>`. + +* ``trace``: print every decision about whether to trace a file or not. For + files not being traced, the reason is also given. + +Debug options can also be set with the ``COVERAGE_DEBUG`` environment variable, +a comma-separated list of these options. + +The debug output goes to stderr, unless the ``COVERAGE_DEBUG_FILE`` environment +variable names a different file, which will be appended to. diff --git a/doc/conf.py b/doc/conf.py index 49bcf393..0738e72e 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -1,4 +1,7 @@ # -*- coding: utf-8 -*- +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + # # coverage.py documentation build configuration file, created by # sphinx-quickstart on Wed May 13 22:18:33 2009. @@ -17,8 +20,9 @@ import sys, os # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. #sys.path.append(os.path.abspath('.')) -# Copied from django docs: -sys.path.append(os.path.join(os.path.dirname(__file__), "_ext")) + +# on_rtd is whether we are on readthedocs.org +on_rtd = os.environ.get('READTHEDOCS', None) == 'True' # -- General configuration ----------------------------------------------------- @@ -28,9 +32,7 @@ extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.todo', 'sphinx.ext.ifconfig', - 'sphinxcontrib.napoleon', 'sphinxcontrib.spelling', - 'px_xlator', ] # Add any paths that contain templates here, relative to this directory. @@ -46,7 +48,7 @@ source_suffix = '.rst' master_doc = 'index' # General information about the project. -project = u'coverage.py' +project = u'Coverage.py' copyright = u'2009\N{EN DASH}2015, Ned Batchelder' # The version info for the project you're documenting, acts as replacement for @@ -56,7 +58,7 @@ copyright = u'2009\N{EN DASH}2015, Ned Batchelder' # The short X.Y version. version = '4.0' # The full version, including alpha/beta/rc tags. -release = '4.0a5' +release = '4.0.3' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -97,11 +99,17 @@ pygments_style = 'sphinx' # -- Options for HTML output --------------------------------------------------- -#html_translator_class = "px_xlator.PxTranslator" - # The theme to use for HTML and HTML Help pages. Major themes that come with # Sphinx are currently 'default' and 'sphinxdoc'. -html_theme = 'default' +#html_theme = 'default' + +if not on_rtd: # only import and set the theme if we're building docs locally + import sphinx_rtd_theme + html_theme = 'sphinx_rtd_theme' + html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] + +# otherwise, readthedocs.org uses their theme by default, so no need to specify it + # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the @@ -110,7 +118,7 @@ html_theme = 'default' #html_style = "neds.css" -html_add_permalinks = False +#html_add_permalinks = "" # Add any paths that contain custom themes here, relative to this directory. html_theme_path = ['_templates'] @@ -169,7 +177,7 @@ html_show_sourcelink = False #html_use_opensearch = '' # If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = '.px' +#html_file_suffix = '.htm' # Output file base name for HTML help builder. htmlhelp_basename = 'coveragepydoc' @@ -179,42 +187,10 @@ htmlhelp_basename = 'coveragepydoc' spelling_word_list_filename = 'dict.txt' spelling_show_suggestions = False -# -- Options for LaTeX output -------------------------------------------------- - -# The paper size ('letter' or 'a4'). -#latex_paper_size = 'letter' - -# The font size ('10pt', '11pt' or '12pt'). -#latex_font_size = '10pt' - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass [howto/manual]). -latex_documents = [ - ('index', 'coveragepy.tex', u'coverage.py Documentation', - u'Ned Batchelder', 'manual'), -] - -# The name of an image file (relative to this directory) to place at the top of -# the title page. -#latex_logo = None - -# For "manual" documents, if this is true, then toplevel headings are parts, -# not chapters. -#latex_use_parts = False - -# Additional stuff for the LaTeX preamble. -#latex_preamble = '' - -# Documents to append as an appendix to all manuals. -#latex_appendices = [] - -# If false, no module index is generated. -#latex_use_modindex = True - # When auto-doc'ing a class, write the class' docstring and the __init__ docstring # into the class docs. -autoclass_content = "both" +autoclass_content = "class" @@ -223,5 +199,6 @@ autoclass_content = "both" prerelease = bool(max(release).isalpha()) def setup(app): + app.add_stylesheet('coverage.css') app.add_config_value('prerelease', False, 'env') - print "** Prerelease = %r" % prerelease + app.info("** Prerelease = %r" % prerelease) diff --git a/doc/config.rst b/doc/config.rst index df703ba9..688e8992 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -1,3 +1,6 @@ +.. Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +.. For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + .. _config: =================== @@ -12,10 +15,12 @@ Configuration files .. :history: 20130926T222300, updated for 3.6.1 .. :history: 20140925T064700, updated for 4.0a1 .. :history: 20150124T173400, updated for 4.0a4 +.. :history: 20150802T174600, updated for 4.0b1 +.. module:: coverage 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 +easier to re-run coverage.py with consistent settings, and also allows for specification of options that are otherwise only available in the :ref:`API <api>`. @@ -102,25 +107,33 @@ to more than one command. ``cover_pylib`` (boolean, default False): whether to measure the Python standard library. -``concurrency`` (string, default "thread"): the name of the concurrency -library in use by the product code. If your program uses `gevent`_, -`greenlet`_, or `eventlet`_, you must name that library in this option, or -coverage will produce very wrong results. +``concurrency`` (string, default "thread"): the name of the concurrency library +in use by the product code. If your program uses `multiprocessing`_, +`gevent`_, `greenlet`_, or `eventlet`_, you must name that library in this +option, or coverage.py will produce very wrong results. +.. _multiprocessing: https://docs.python.org/2/library/multiprocessing.html .. _greenlet: http://greenlet.readthedocs.org/en/latest/ .. _gevent: http://www.gevent.org/ .. _eventlet: http://eventlet.net/ +.. versionadded:: 4.0 + ``data_file`` (string, default ".coverage"): the name of the data file to use -for storing or reporting coverage. +for storing or reporting coverage. This value can include a path to another +directory. ``debug`` (multi-string): a list of debug options. See :ref:`the run --debug option <cmd_run_debug>` for details. -``include`` (multi-string): a list of filename patterns, the files to include +``include`` (multi-string): a list of file name patterns, the files to include in measurement or reporting. See :ref:`source` for details. -``omit`` (multi-string): a list of filename patterns, the files to leave out +``note`` (string): an arbitrary string that will be written to the data file. +You can use the :meth:`CoverageData.run_infos` method to retrieve this string +from a data file. + +``omit`` (multi-string): a list of file name patterns, the files to leave out of measurement or reporting. See :ref:`source` for details. ``parallel`` (boolean, default False): append the machine name, process @@ -177,13 +190,16 @@ 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. +``fail_under`` (integer): a target coverage percentage. If the total coverage +measurement is under this value, then exit with a status code of 2. + ``ignore_errors`` (boolean, default False): ignore source code that can't be found. -``include`` (multi-string): a list of filename patterns, the files to include +``include`` (multi-string): a list of file name patterns, the files to include in reporting. See :ref:`source` for details. -``omit`` (multi-string): a list of filename patterns, the files to leave out +``omit`` (multi-string): a list of file name patterns, the files to leave out of reporting. See :ref:`source` for details. ``partial_branches`` (multi-string): a list of regular expressions. Any line @@ -199,8 +215,8 @@ example "87%". A value of 2 will display percentages like "87.32%". ``show_missing`` (boolean, default False): when running a summary report, show missing lines. See :ref:`cmd_summary` for more information. -``skip_covered`` (boolean, default False): when running a summary report, -skip 100% covered files. See :ref:`cmd_summary` for more information. +``skip_covered`` (boolean, default False): Don't include files in the report +that are 100% covered files. See :ref:`cmd_summary` for more information. .. _config_html: @@ -231,3 +247,8 @@ Values particular to XML reporting. The values in the ``[report]`` section also apply to XML output, where appropriate. ``output`` (string, default "coverage.xml"): where to write the XML report. + +``package_depth`` (integer, default 99): controls which directories are +identified as packages in the report. Directories deeper than this depth are +not reported as packages. The default is that all directories are reported as +packages. diff --git a/doc/contributing.rst b/doc/contributing.rst index 32929e0b..dc50202c 100644 --- a/doc/contributing.rst +++ b/doc/contributing.rst @@ -1,3 +1,6 @@ +.. Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +.. For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + .. _contributing: =========================== @@ -42,10 +45,11 @@ these steps: #. Clone the repo:: $ hg clone https://bitbucket.org/ned/coveragepy + $ cd coveragepy #. Install the requirements:: - $ pip install -r requirements.txt + $ pip install -r requirements/dev.pip #. Install a number of versions of Python. Coverage.py supports a wide range of Python versions. The more you can test with, the more easily your code @@ -60,47 +64,50 @@ The tests are written as standard unittest-style tests, and are run with `tox`_:: $ tox - GLOB sdist-make: /home/ned/coverage/setup.py - py25 sdist-reinst: /home/ned/coverage/tox/dist/coverage-3.6b1.zip - py25 runtests: commands[0] - py25 runtests: commands[1] - py25 runtests: commands[2] - py25 runtests: commands[3] - py25 runtests: commands[4] - === Python 2.5.5 with Python tracer (/home/ned/coverage/tox/py25/bin/python) === - ...........................................................................................(etc) + py27 create: /Users/ned/coverage/trunk/.tox/py27 + py27 installdeps: nose==1.3.7, mock==1.3.0, PyContracts==1.7.6, gevent==1.0.2, eventlet==0.17.4, greenlet==0.4.7 + py27 develop-inst: /Users/ned/coverage/trunk + py27 installed: -f /Users/ned/Downloads/local_pypi,-e hg+ssh://hg@bitbucket.org/ned/coveragepy@22fe9a2b7796f6498aa013c860c268ac21651226#egg=coverage-dev,decorator==4.0.2,eventlet==0.17.4,funcsigs==0.4,gevent==1.0.2,greenlet==0.4.7,mock==1.3.0,nose==1.3.7,pbr==1.6.0,PyContracts==1.7.6,pyparsing==2.0.3,six==1.9.0,wheel==0.24.0 + py27 runtests: PYTHONHASHSEED='1294330776' + py27 runtests: commands[0] | python setup.py --quiet clean develop + py27 runtests: commands[1] | python igor.py zip_mods install_egg remove_extension + py27 runtests: commands[2] | python igor.py test_with_tracer py + === CPython 2.7.10 with Python tracer (.tox/py27/bin/python) === + ............................................................................(etc) ---------------------------------------------------------------------- - Ran 360 tests in 10.836s + Ran 592 tests in 65.524s - OK - py25 runtests: commands[5] - py25 runtests: commands[6] - === Python 2.5.5 with C tracer (/home/ned/coverage/tox/py25/bin/python) === - ...........................................................................................(etc) + OK (SKIP=20) + py27 runtests: commands[3] | python setup.py --quiet build_ext --inplace + py27 runtests: commands[4] | python igor.py test_with_tracer c + === CPython 2.7.10 with C tracer (.tox/py27/bin/python) === + ............................................................................(etc) ---------------------------------------------------------------------- - Ran 360 tests in 10.044s - - OK - py26 sdist-reinst: /home/ned/coverage/trunk/.tox/dist/coverage-3.6b1.zip - py26 runtests: commands[0] - py26 runtests: commands[1] - py26 runtests: commands[2] - py26 runtests: commands[3] - py26 runtests: commands[4] - === CPython 2.6.6 with Python tracer (/home/ned/coverage/tox/py26/bin/python) === - ...........................................................................................(etc) + Ran 592 tests in 69.635s + + OK (SKIP=4) + py33 create: /Users/ned/coverage/trunk/.tox/py33 + py33 installdeps: nose==1.3.7, mock==1.3.0, PyContracts==1.7.6, greenlet==0.4.7 + py33 develop-inst: /Users/ned/coverage/trunk + py33 installed: -f /Users/ned/Downloads/local_pypi,-e hg+ssh://hg@bitbucket.org/ned/coveragepy@22fe9a2b7796f6498aa013c860c268ac21651226#egg=coverage-dev,decorator==4.0.2,greenlet==0.4.7,mock==1.3.0,nose==1.3.7,pbr==1.6.0,PyContracts==1.7.6,pyparsing==2.0.3,six==1.9.0,wheel==0.24.0 + py33 runtests: PYTHONHASHSEED='1294330776' + py33 runtests: commands[0] | python setup.py --quiet clean develop + py33 runtests: commands[1] | python igor.py zip_mods install_egg remove_extension + py33 runtests: commands[2] | python igor.py test_with_tracer py + === CPython 3.3.6 with Python tracer (.tox/py33/bin/python) === + ............................................S...............................(etc) ---------------------------------------------------------------------- - Ran 364 tests in 12.572s + Ran 592 tests in 73.007s - OK - py26 runtests: commands[5] - py26 runtests: commands[6] - === CPython 2.6.6 with C tracer (/home/ned/coverage/tox/py26/bin/python) === - ...........................................................................................(etc) + OK (SKIP=22) + py33 runtests: commands[3] | python setup.py --quiet build_ext --inplace + py33 runtests: commands[4] | python igor.py test_with_tracer c + === CPython 3.3.6 with C tracer (.tox/py33/bin/python) === + ............................................S...............................(etc) ---------------------------------------------------------------------- - Ran 364 tests in 11.458s + Ran 592 tests in 72.071s - OK + OK (SKIP=5) (and so on...) Tox runs the complete test suite twice for each version of Python you have @@ -137,6 +144,8 @@ The source is pylint-clean, even if it's because there are pragmas quieting some warnings. Please try to keep it that way, but don't let pylint warnings keep you from sending patches. I can clean them up. +Lines should be kept to a 100-character maximum length. + Coverage testing coverage.py ---------------------------- @@ -144,8 +153,7 @@ Coverage testing coverage.py Coverage.py can measure itself, but it's complicated. The process has been packaged up to make it easier:: - $ COVERAGE_COVERAGE=yes tox - $ python igor.py combine_html + $ make metacov metahtml Then look at htmlcov/index.html. Note that due to the recursive nature of coverage.py measuring itself, there are some parts of the code that will never diff --git a/doc/dict.txt b/doc/dict.txt index db161e03..cdc3fb0e 100644 --- a/doc/dict.txt +++ b/doc/dict.txt @@ -1,21 +1,27 @@ activestate api +apache API args argv +basename +basenames bitbucket BOM bom boolean +booleans BTW btw builtin builtins bytecode bytecodes +bytestring canonicalize canonicalized canonicalizes +chdir'd cmdline Cobertura codecs @@ -31,6 +37,7 @@ covhtml CPython css CTracer +datetime dedent dict dict's @@ -47,13 +54,17 @@ endfor endif eventlet exe +exec'd +exec'ing execfile executable's expr filename filenames +filepath fname fnmatch +fooey fpath fullcoverage getattr @@ -73,13 +84,17 @@ importlib instancemethod int ints +invariants iterable iterables +json jython kwargs matcher matchers merchantability +metadata +meth mixin modulename monkeypatch @@ -88,6 +103,7 @@ morf morfs multi mumbo +mycode namespace namespaces nano @@ -108,9 +124,12 @@ outfile overridable parsable parsers +pathnames pragma pragmas pre +prepended +prepending programmability programmatically py @@ -123,13 +142,17 @@ pythonpath PYTHONPATH pyw rcfile +readme +refactored regex regexes renderer +serializable settrace setuptools sitecustomize sortable +src stackoverflow stderr stdlib @@ -137,6 +160,7 @@ stdout str sys templite +templating timestamp todo TODO @@ -163,12 +187,37 @@ untokenizable URL UTF utf +versionadded virtualenv whitespace wikipedia wildcard wildcards +www xml XML xrange xyzzy +Adi +Berezhny +Berman +Betz +Carballo +Cobden +Danek +Dmitry +Duvall +Finney +Gedminas +Jeanpierre +Jevnik +Kichewko +Krystian +Lex +Lytwynec +Olds +Portante +Roiban +Schettino +Trofimov +Zooko diff --git a/doc/excluding.rst b/doc/excluding.rst index 44c51f96..465afe16 100644 --- a/doc/excluding.rst +++ b/doc/excluding.rst @@ -1,8 +1,11 @@ +.. Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +.. For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + .. _excluding: -============================ -Excluding code from coverage -============================ +=============================== +Excluding code from coverage.py +=============================== .. :history: 20090613T090500, brand new docs. .. :history: 20100224T200900, updated for 3.3. @@ -11,13 +14,13 @@ Excluding code from coverage 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 -that won't be executed during your unit tests. You can tell coverage to exclude -this code during reporting so that it doesn't clutter your reports with noise -about code that you don't need to hear about. +to tell coverage.py to ignore it. For example, you may have debugging-only +code that won't be executed during your unit tests. You can tell coverage.py to +exclude this code during reporting so that it doesn't clutter your reports with +noise about code that you don't need to hear about. -Coverage will look for comments marking clauses for exclusion. In this code, -the "if debug" clause is excluded from reporting:: +Coverage.py will look for comments marking clauses for exclusion. In this +code, the "if debug" clause is excluded from reporting:: a = my_function1() if debug: # pragma: no cover @@ -39,7 +42,7 @@ function is not reported as missing:: return "<MyObject>" Excluded code is executed as usual, and its execution is recorded in the -coverage data as usual. When producing reports though, coverage excludes it +coverage data as usual. When producing reports though, coverage.py excludes it from the list of missing code. @@ -64,7 +67,7 @@ line, so it isn't considered a branch at all. Advanced exclusion ------------------ -Coverage identifies exclusions by matching lines against a list of regular +Coverage.py identifies exclusions by matching lines against a list of regular 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 diff --git a/doc/faq.rst b/doc/faq.rst index 32492532..e8e9c49e 100644 --- a/doc/faq.rst +++ b/doc/faq.rst @@ -1,3 +1,6 @@ +.. Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +.. For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + .. _faq: ================== @@ -26,10 +29,10 @@ the :ref:`command line <cmd>` to create the reports you need from that data. **Q: Why do unexecutable lines show up as executed?** -Usually this is because you've updated your code and run coverage on it again -without erasing the old data. Coverage records line numbers executed, so the -old data may have recorded a line number which has since moved, causing -coverage to claim a line has been executed which cannot be. +Usually this is because you've updated your code and run coverage.py on it +again without erasing the old data. Coverage.py records line numbers executed, +so the old data may have recorded a line number which has since moved, causing +coverage.py to claim a line has been executed which cannot be. If you are using the ``-x`` command line action, it doesn't erase first by default. Switch to the ``coverage run`` command, or use the ``-e`` switch to @@ -39,18 +42,18 @@ erase all data before starting the next run. **Q: Why do the bodies of functions (or classes) show as executed, but the def lines do not?** -This happens because coverage is started after the functions are defined. The -definition lines are executed without coverage measurement, then coverage is -started, then the function is called. This means the body is measured, but -the definition of the function itself is not. +This happens because coverage.py is started after the functions are defined. +The definition lines are executed without coverage measurement, then +coverage.py is started, then the function is called. This means the body is +measured, but the definition of the function itself is not. -To fix this, start coverage earlier. If you use the :ref:`command line <cmd>` -to run your program with coverage, then your entire program will be monitored. -If you are using the :ref:`API <api>`, you need to call coverage.start() before -importing the modules that define your functions. +To fix this, start coverage.py earlier. If you use the :ref:`command line +<cmd>` to run your program with coverage.py, then your entire program will be +monitored. If you are using the :ref:`API <api>`, you need to call +coverage.start() before importing the modules that define your functions. -**Q: Coverage is much slower than I remember, what's going on?** +**Q: Coverage.py is much slower than I remember, what's going on?** Make sure you are using the C trace function. Coverage.py provides two implementations of the trace function. The C implementation runs much faster. diff --git a/doc/howitworks.rst b/doc/howitworks.rst new file mode 100644 index 00000000..74747e80 --- /dev/null +++ b/doc/howitworks.rst @@ -0,0 +1,97 @@ +.. Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +.. For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +.. _howitworks: + +===================== +How Coverage.py works +===================== + +.. :history: 20150812T071000, new page. + +For advanced use of coverage.py, or just because you are curious, it helps to +understand what's happening behind the scenes. Coverage.py works in three +phases: + +* **Execution**: Coverage.py runs your code, and monitors it to see what lines + were executed. + +* **Analysis**: Coverage.py examines your code to determine what lines could + have run. + +* **Reporting**: Coverage.py combines the results of execution and analysis to + produce a coverage number and an indication of missing execution. + +The execution phase is handled by the ``coverage run`` command. The analysis +and reporting phases are handled by the reporting commands like ``coverage +report`` or ``coverage html``. + +Let's look at each phase in more detail. + + +Execution +--------- + +At the heart of the execution phase is a Python trace function. This is a +function that the Python interpreter invokes for each line executed in a program. +Coverage.py implements a trace function that records each file and line number +as it is executed. + +Executing a function for every line in your program can make execution very +slow. Coverage.py's trace function is implemented in C to reduce that +slowdown. It also takes care to not trace code that you aren't interested in. + +When measuring branch coverage, the same trace function is used, but instead of +recording line numbers, coverage.py records pairs of line numbers. Each +invocation of the trace function remembers the line number, then the next +invocation records the pair `(prev, this)` to indicate that execution +transitioned from the previous line to this line. Internally, these are called +arcs. + +For more details of trace functions, see the Python docs for `sys.settrace`_, +or if you are really brave, `How C trace functions really work`_. + +At the end of execution, coverage.py writes the data it collected to a data +file, usually named ``.coverage``. This is a JSON-based file containing all of +the recorded file names and line numbers executed. + +.. _sys.settrace: https://docs.python.org/3/library/sys.html#sys.settrace +.. _How C trace functions really work: http://nedbatchelder.com/text/trace-function.html + + +Analysis +-------- + +After your program has been executed and the line numbers recorded, coverage.py +needs to determine what lines could have been executed. Luckily, compiled +Python files (.pyc files) have a table of line numbers in them. Coverage.py +reads this table to get the set of executable lines, with a little more source +analysis to leave out things like docstrings. + +The data file is read to get the set of lines that were executed. The +difference between the executable lines, and the executed lines, are the lines +that were not executed. + +The same principle applies for branch measurement, though the process for +determining possible branches is more involved. Coverage.py reads the bytecode +of the compiled Python file, and decides on a set of possible branches. +Unfortunately, this process is inexact, and there are some `well-known cases`__ +that aren't correct. + +.. __: https://bitbucket.org/ned/coveragepy/issues?status=new&status=open&component=branch + + +Reporting +--------- + +Once we have the set of executed lines and missing lines, reporting is just a +matter of formatting that information in a useful way. Each reporting method +(text, html, annotated source, xml) has a different output format, but the +process is the same: write out the information in the particular format, +possibly including the source code itself. + + +Plugins +------- + +Plugins interact with these phases. diff --git a/doc/index.rst b/doc/index.rst index 5603a8ac..aea833d9 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -1,5 +1,8 @@ +.. Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +.. For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + =========== -coverage.py +Coverage.py =========== .. :history: 20090524T134300, brand new docs. @@ -34,6 +37,12 @@ coverage.py .. :history: 20140924T073000, Updated for 4.0a1 .. :history: 20150124T023900, Updated for 4.0a4 .. :history: 20150216T201000, Updated for 4.0a5 +.. :history: 20150802T160200, Updated for 4.0b1 +.. :history: 20150822T092900, Updated for 4.0b2 +.. :history: 20150918T072700, Updated for 4.0 +.. :history: 20151013T103200, Updated for 4.0.1 +.. :history: 20151104T050900, updated for 4.0.2 +.. :history: 20151124T065900, updated for 4.0.3 Coverage.py is a tool for measuring code coverage of Python programs. It @@ -46,14 +55,18 @@ not. .. ifconfig:: not prerelease - The latest version is coverage.py 3.7.1, released 13 December 2013. - It is supported on Python versions 2.6 through 3.4, and PyPy 2.2. + The latest version is coverage.py 4.0.3, released 24 November 2015. + It is supported on: + + * Python versions 2.6, 2.7, 3.3, 3.4, and 3.5 + * PyPy 2.4, 2.6, and 4.0 + * PyPy3 2.4 .. ifconfig:: prerelease - The latest version is coverage.py 4.0a5, released 16 February 2015. - It is supported on Python versions 2.6, 2.7, 3.3, 3.4, and 3.5a1, as well - as PyPy 2.4, and PyPy3 2.4. + The latest version is coverage.py 4.0b2, released 22 August 2015. + It is supported on Python versions 2.6, 2.7, 3.3, 3.4, and 3.5c1, as well + as PyPy 2.4 and 2.6, and PyPy3 2.4. **This is a pre-release build. The usual warnings about possible bugs apply.** The latest stable version is coverage.py 3.7.1, `described here`_. @@ -65,7 +78,7 @@ Quick start Getting started is easy: -#. Install coverage.py from the `coverage page on the Python Package Index`_, +#. Install coverage.py from the `coverage.py page on the Python Package Index`_, or by using "pip install coverage". For a few more details, see :ref:`install`. @@ -83,8 +96,8 @@ Getting started is easy: $ coverage report -m Name Stmts Miss Cover Missing ------------------------------------------------------- - my_program 20 4 80% 33-35, 39 - my_other_module 56 6 89% 17-23 + my_program.py 20 4 80% 33-35, 39 + my_other_module.py 56 6 89% 17-23 ------------------------------------------------------- TOTAL 76 10 87% @@ -105,9 +118,9 @@ Getting started is easy: Then visit htmlcov/index.html in your browser, to see a `report like this one`_. -.. _coverage page on the Python Package Index: http://pypi.python.org/pypi/coverage -.. _report like this: http://nedbatchelder.com/code/coverage/sample_html/index.html -.. _report like this one: http://nedbatchelder.com/code/coverage/sample_html_beta/index.html +.. _coverage.py page on the Python Package Index: http://pypi.python.org/pypi/coverage +.. _report like this: http://nedbatchelder.com/files/sample_coverage_html/index.html +.. _report like this one: http://nedbatchelder.com/files/sample_coverage_html_beta/index.html Using coverage.py @@ -118,12 +131,12 @@ There are a few different ways to use coverage.py. The simplest is the 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`_. +Some test runners provide coverage integration to make it easy to use +coverage.py 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:`source` and :ref:`excluding` for -details. +You can fine-tune coverage.py's view of your code by directing it to ignore +parts that you know aren't interesting. See :ref:`source` and :ref:`excluding` +for details. .. _nose: http://somethingaboutorange.com/mrl/projects/nose .. _cover plug-in: https://nose.readthedocs.org/en/latest/plugins/cover.html @@ -168,12 +181,9 @@ More information branch subprocess api + howitworks plugins contributing trouble faq changes - - -.. How it works -.. .coverage file format diff --git a/doc/install.rst b/doc/install.rst index 67af7203..16d44478 100644 --- a/doc/install.rst +++ b/doc/install.rst @@ -1,3 +1,6 @@ +.. Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +.. For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + .. _install: ============ @@ -47,7 +50,7 @@ The alternate old-school technique is: #. Install (or already have installed) `setuptools`_ or `Distribute`_. #. Download the appropriate kit from the - `coverage page on the Python Package Index`__. + `coverage.py page on the Python Package Index`__. #. Run ``python setup.py install``. @@ -82,8 +85,8 @@ the C extension pre-compiled so there's no need to worry about compilers. Checking the installation ------------------------- -If all went well, you should be able to open a command prompt, and see coverage -installed properly: +If all went well, you should be able to open a command prompt, and see +coverage.py installed properly: .. ifconfig:: not prerelease @@ -99,9 +102,9 @@ installed properly: $ coverage --version Coverage.py, version |release|. - Documentation at https://coverage.readthedocs.org/en/|release| + Documentation at https://coverage.readthedocs.org/en/coverage-|release| -You can also invoke coverage as a module: +You can also invoke coverage.py as a module: .. ifconfig:: not prerelease @@ -117,4 +120,4 @@ You can also invoke coverage as a module: $ python -m coverage --version Coverage.py, version |release|. - Documentation at https://coverage.readthedocs.org/en/|release| + Documentation at https://coverage.readthedocs.org/en/coverage-|release| diff --git a/doc/plugins.rst b/doc/plugins.rst index 1fc5c10d..6161f888 100644 --- a/doc/plugins.rst +++ b/doc/plugins.rst @@ -1,3 +1,6 @@ +.. Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +.. For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + .. _plugins: ======= @@ -5,59 +8,63 @@ Plugins ======= .. :history: 20150124T143000, new page. +.. :history: 20150802T174600, updated for 4.0b1 + -Coverage.py's behavior can be extended by writing plugins. A plugin is a +Coverage.py's behavior can be extended with third-party plugins. A plugin is a separately installed Python class that you register in your .coveragerc. Plugins can be used to implement coverage measurement for non-Python files. +Information about using plugins is on this page. To write a plugin, see +:ref:`api_plugin`. + +.. versionadded:: 4.0 + + Using plugins ------------- To use a coverage.py plugin, you install it, and configure it. For this -example, let's say you want to use one called fred_plugin. +example, let's say there's a Python package called ``something`` that provides a +coverage.py plugin called ``something.plugin``. -#. Install the plugin as you would any other Python package:: +#. Install the plugin's package as you would any other Python package:: - pip install fred_plugin + pip install something #. Configure coverage.py to use the plugin. You do this by editing (or creating) your .coveragerc file, as described in :ref:`config`. The - ``plugins`` setting indicates your plugin:: + ``plugins`` setting indicates your plugin. It's a list of importable module + names of plugins:: [run] plugins = - fred_plugin + something.plugin #. If the plugin needs its own configuration, you can add those settings in the .coveragerc file in a section named for the plugin:: - [fred_plugin] + [something.plugin] option1 = True option2 = abc.foo Check the documentation for the plugin to see if it takes any options, and what they are. -#. Run your tests as you usually would. NOTE: You will see a warning when - coverage starts:: - - Coverage.py warning: Setting timid=True to support plugins. +#. Run your tests with coverage.py as you usually would. - This means that coverage will run slower than it usually would. This - limitation is part of the initial alpha release, it will be gone in the - final version. +Available plugins +----------------- -Plugin API ----------- +Some coverage.py plugins you might find useful: -.. module:: coverage.plugin +* `Django template coverage.py plugin`__: for measuring coverage in Django + templates. -.. autoclass:: CoveragePlugin - :members: + .. __: https://pypi.python.org/pypi/django_coverage_plugin -.. autoclass:: FileTracer - :members: +* `Mako template coverage plugin`__: for measuring coverage in Mako templates. + Doesn't work yet, probably needs some changes in Mako itself. -.. autoclass:: FileReporter - :members: + .. __: https://bitbucket.org/ned/coverage-mako-plugin diff --git a/doc/python-coverage.1.txt b/doc/python-coverage.1.txt index f79f33d8..135ccbb2 100644 --- a/doc/python-coverage.1.txt +++ b/doc/python-coverage.1.txt @@ -8,10 +8,10 @@ measure code coverage of Python program execution :Author: Ned Batchelder <ned@nedbatchelder.com> :Author: |author| -:Date: 2014-09-27 -:Copyright: BSD license, attribution and disclaimer required. +:Date: 2015-09-20 +:Copyright: Apache 2.0 license, attribution and disclaimer required. :Manual section: 1 -:Manual group: Coverage +:Manual group: Coverage.py .. |command| replace:: **python-coverage** @@ -66,19 +66,23 @@ GLOBAL OPTIONS ============== **--help**, **-h** - Describe how to use Coverage, in general or a command. + Describe how to use coverage.py, in general or a command. **--rcfile** `RCFILE` Specify configuration file `RCFILE`. Defaults to ``.coveragerc``. **--omit** `PATTERN` [ , ... ] - Omit files when their filename matches one of these PATTERNs. + Omit files when their file name matches one of these PATTERNs. Usually needs quoting on the command line. **--include** `PATTERN` [ , ... ] Include only files whose paths match one of these PATTERNs. Accepts shell-style wildcards, which must be quoted. +**--debug** `DEBUGOPT`,... + Debug options `DEBUGOPT`, separated by commas. + + COMMAND REFERENCE ================= @@ -93,23 +97,22 @@ COMMAND REFERENCE \-i, --ignore-errors Ignore errors while reading source files. -**combine** +**combine** [ `PATH` ... ] 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. + If `PATH` is specified, they are files or directories containing data to + be combined. + **erase** Erase previously collected coverage data. **help** [ `command` ] - Describe how to use Coverage. - -**help** **classic** - - Describe help on older command syntax. + Describe how to use coverage.py. **html** [ `option` ... ] [ `MODULE` ... ] @@ -147,6 +150,9 @@ COMMAND REFERENCE Show line numbers of statements in each module that weren't executed. + \--skip-covered + Skip files with 100% coverage. + **run** [ `options` ... ] `PROGRAMFILE` [ `program_options` ] Run a Python program `PROGRAMFILE`, measuring code execution. @@ -162,10 +168,7 @@ COMMAND REFERENCE \--concurrency `LIB` Properly measure code using a concurrency library. Valid values are: - thread, gevent, greenlet, eventlet. - - \--debug `DEBUGOPT`,... - Debug options `DEBUGOPT`, separated by commas. + thread, gevent, greenlet, eventlet, multiprocessing. \-L, --pylib Measure coverage even inside the Python installed library, which @@ -207,7 +210,6 @@ COVERAGE_FILE Path to the file where coverage measurements are collected to and reported from. Default: ``.coverage`` in the current working directory. - HISTORY ======= diff --git a/doc/requirements.pip b/doc/requirements.pip new file mode 100644 index 00000000..968313ef --- /dev/null +++ b/doc/requirements.pip @@ -0,0 +1,7 @@ +# PyPI requirements for building documentation for coverage.py + +# https://requires.io/github/nedbat/coveragepy/requirements/ + +pyenchant==1.6.6 +sphinx==1.3.1 +sphinxcontrib-spelling==2.1.2 diff --git a/doc/requirements.txt b/doc/requirements.txt deleted file mode 100644 index 3ae49210..00000000 --- a/doc/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -# PyPI requirements for building documentation for coverage.py -pyenchant -sphinx -sphinxcontrib-napoleon -sphinxcontrib-spelling diff --git a/doc/sample_html/README.txt b/doc/sample_html/README.txt deleted file mode 100644 index 30b96b93..00000000 --- a/doc/sample_html/README.txt +++ /dev/null @@ -1,5 +0,0 @@ -This directory was made with:: - - cd C:\ned\cog\trunk - coverage run --branch --source=cogapp cogapp\test_cogapp.py CogTestsInMemory - coverage html diff --git a/doc/sample_html/cogapp___init__.html b/doc/sample_html/cogapp___init__.html deleted file mode 100644 index 1199d7b8..00000000 --- a/doc/sample_html/cogapp___init__.html +++ /dev/null @@ -1,102 +0,0 @@ -<!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 cogapp/__init__: 100%</title> - <link rel='stylesheet' href='style.css' type='text/css'> - - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript' charset='utf-8'> - jQuery(document).ready(coverage.pyfile_ready); - </script> -</head> -<body id='pyfile'> - -<div id='header'> - <div class='content'> - <h1>Coverage for <b>cogapp/__init__</b> : - <span class='pc_cov'>100%</span> - </h1> - <img id='keyboard_icon' src='keybd_closed.png'> - <h2 class='stats'> - 2 statements - <span class='run hide_run shortkey_r button_toggle_run'>2 run</span> - <span class='mis shortkey_m button_toggle_mis'>0 missing</span> - <span class='exc shortkey_x button_toggle_exc'>0 excluded</span> - - <span class='par run hide_run shortkey_p button_toggle_par'>0 partial</span> - - </h2> - </div> -</div> - -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png'> -<p class='legend'>Hot-keys on this page</p> - <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays - </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk - </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page - </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk - </p> - </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='pln'><a href='#n3'>3</a></p> -<p id='n4' class='pln'><a href='#n4'>4</a></p> -<p id='n5' class='pln'><a href='#n5'>5</a></p> -<p id='n6' class='pln'><a href='#n6'>6</a></p> -<p id='n7' class='stm run hide_run'><a href='#n7'>7</a></p> -<p id='n8' class='pln'><a href='#n8'>8</a></p> -<p id='n9' class='stm run hide_run'><a href='#n9'>9</a></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-2012, 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'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>absolute_import</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'>from</span> <span class='op'>.</span><span class='nam'>cogapp</span> <span class='key'>import</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.7.1</a> - </p> - </div> -</div> - -</body> -</html> diff --git a/doc/sample_html/cogapp___init___py.html b/doc/sample_html/cogapp___init___py.html new file mode 100644 index 00000000..4003d77a --- /dev/null +++ b/doc/sample_html/cogapp___init___py.html @@ -0,0 +1,109 @@ + + + +<!DOCTYPE html> +<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 cogapp/__init__.py: 100.00%</title> + <link rel="stylesheet" href="style.css" type="text/css"> + + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> + jQuery(document).ready(coverage.pyfile_ready); + </script> +</head> +<body class="pyfile"> + +<div id="header"> + <div class="content"> + <h1>Coverage for <b>cogapp/__init__.py</b> : + <span class="pc_cov">100.00%</span> + </h1> + + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> + + <h2 class="stats"> + 2 statements + <span class="run hide_run shortkey_r button_toggle_run">2 run</span> + <span class="mis shortkey_m button_toggle_mis">0 missing</span> + <span class="exc shortkey_x button_toggle_exc">0 excluded</span> + + + <span class="par run hide_run shortkey_p button_toggle_par">0 partial</span> + + </h2> + </div> +</div> + +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> + <div> +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays + </p> +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk + </p> +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page + </p> +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk + </p> + </div> +</div> + +<div id="source"> + <table> + <tr> + <td class="linenos"> +<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="pln"><a href="#n4">4</a></p> +<p id="n5" class="pln"><a href="#n5">5</a></p> +<p id="n6" class="pln"><a href="#n6">6</a></p> +<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p> +<p id="n8" class="pln"><a href="#n8">8</a></p> +<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p> + + </td> + <td class="text"> +<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="strut"> </span></p> +<p id="t4" class="pln"><span class="str"> Copyright 2004-2015, 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">from</span> <span class="nam">__future__</span> <span class="key">import</span> <span class="nam">absolute_import</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">from</span> <span class="op">.</span><span class="nam">cogapp</span> <span class="key">import</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="https://coverage.readthedocs.org">coverage.py v4.0.3</a>, + created at 2015-11-24 07:02 + </p> + </div> +</div> + +</body> +</html> diff --git a/doc/sample_html/cogapp___main__.html b/doc/sample_html/cogapp___main__.html deleted file mode 100644 index 23c3d5ec..00000000 --- a/doc/sample_html/cogapp___main__.html +++ /dev/null @@ -1,94 +0,0 @@ -<!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 cogapp/__main__: 0%</title> - <link rel='stylesheet' href='style.css' type='text/css'> - - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript' charset='utf-8'> - jQuery(document).ready(coverage.pyfile_ready); - </script> -</head> -<body id='pyfile'> - -<div id='header'> - <div class='content'> - <h1>Coverage for <b>cogapp/__main__</b> : - <span class='pc_cov'>0%</span> - </h1> - <img id='keyboard_icon' src='keybd_closed.png'> - <h2 class='stats'> - 3 statements - <span class='run hide_run shortkey_r button_toggle_run'>0 run</span> - <span class='mis shortkey_m button_toggle_mis'>3 missing</span> - <span class='exc shortkey_x button_toggle_exc'>0 excluded</span> - - <span class='par run hide_run shortkey_p button_toggle_par'>0 partial</span> - - </h2> - </div> -</div> - -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png'> -<p class='legend'>Hot-keys on this page</p> - <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays - </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk - </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page - </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk - </p> - </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='stm mis'><a href='#n2'>2</a></p> -<p id='n3' class='stm mis'><a href='#n3'>3</a></p> -<p id='n4' class='pln'><a href='#n4'>4</a></p> -<p id='n5' class='stm mis'><a href='#n5'>5</a></p> - - </td> - <td class='text' valign='top'> -<p id='t1' class='pln'><span class='str'>"""Make Cog runnable directly from the module."""</span><span class='strut'> </span></p> -<p id='t2' class='stm mis'><span class='key'>import</span> <span class='nam'>sys</span><span class='strut'> </span></p> -<p id='t3' class='stm mis'><span class='key'>from</span> <span class='nam'>cogapp</span> <span class='key'>import</span> <span class='nam'>Cog</span><span class='strut'> </span></p> -<p id='t4' class='pln'><span class='strut'> </span></p> -<p id='t5' class='stm mis'><span class='nam'>sys</span><span class='op'>.</span><span class='nam'>exit</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'>main</span><span class='op'>(</span><span class='nam'>sys</span><span class='op'>.</span><span class='nam'>argv</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.7.1</a> - </p> - </div> -</div> - -</body> -</html> diff --git a/doc/sample_html/cogapp___main___py.html b/doc/sample_html/cogapp___main___py.html new file mode 100644 index 00000000..c805cbee --- /dev/null +++ b/doc/sample_html/cogapp___main___py.html @@ -0,0 +1,101 @@ + + + +<!DOCTYPE html> +<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 cogapp/__main__.py: 0.00%</title> + <link rel="stylesheet" href="style.css" type="text/css"> + + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> + jQuery(document).ready(coverage.pyfile_ready); + </script> +</head> +<body class="pyfile"> + +<div id="header"> + <div class="content"> + <h1>Coverage for <b>cogapp/__main__.py</b> : + <span class="pc_cov">0.00%</span> + </h1> + + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> + + <h2 class="stats"> + 3 statements + <span class="run hide_run shortkey_r button_toggle_run">0 run</span> + <span class="mis shortkey_m button_toggle_mis">3 missing</span> + <span class="exc shortkey_x button_toggle_exc">0 excluded</span> + + + <span class="par run hide_run shortkey_p button_toggle_par">0 partial</span> + + </h2> + </div> +</div> + +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> + <div> +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays + </p> +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk + </p> +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page + </p> +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk + </p> + </div> +</div> + +<div id="source"> + <table> + <tr> + <td class="linenos"> +<p id="n1" class="pln"><a href="#n1">1</a></p> +<p id="n2" class="stm mis"><a href="#n2">2</a></p> +<p id="n3" class="stm mis"><a href="#n3">3</a></p> +<p id="n4" class="pln"><a href="#n4">4</a></p> +<p id="n5" class="stm mis"><a href="#n5">5</a></p> + + </td> + <td class="text"> +<p id="t1" class="pln"><span class="str">"""Make Cog runnable directly from the module."""</span><span class="strut"> </span></p> +<p id="t2" class="stm mis"><span class="key">import</span> <span class="nam">sys</span><span class="strut"> </span></p> +<p id="t3" class="stm mis"><span class="key">from</span> <span class="nam">cogapp</span> <span class="key">import</span> <span class="nam">Cog</span><span class="strut"> </span></p> +<p id="t4" class="pln"><span class="strut"> </span></p> +<p id="t5" class="stm mis"><span class="nam">sys</span><span class="op">.</span><span class="nam">exit</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">main</span><span class="op">(</span><span class="nam">sys</span><span class="op">.</span><span class="nam">argv</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="https://coverage.readthedocs.org">coverage.py v4.0.3</a>, + created at 2015-11-24 07:02 + </p> + </div> +</div> + +</body> +</html> diff --git a/doc/sample_html/cogapp_backward.html b/doc/sample_html/cogapp_backward.html deleted file mode 100644 index 0ab8e96d..00000000 --- a/doc/sample_html/cogapp_backward.html +++ /dev/null @@ -1,148 +0,0 @@ -<!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 cogapp/backward: 52%</title> - <link rel='stylesheet' href='style.css' type='text/css'> - - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript' charset='utf-8'> - jQuery(document).ready(coverage.pyfile_ready); - </script> -</head> -<body id='pyfile'> - -<div id='header'> - <div class='content'> - <h1>Coverage for <b>cogapp/backward</b> : - <span class='pc_cov'>52%</span> - </h1> - <img id='keyboard_icon' src='keybd_closed.png'> - <h2 class='stats'> - 25 statements - <span class='run hide_run shortkey_r button_toggle_run'>13 run</span> - <span class='mis shortkey_m button_toggle_mis'>12 missing</span> - <span class='exc shortkey_x button_toggle_exc'>0 excluded</span> - - <span class='par run hide_run shortkey_p button_toggle_par'>1 partial</span> - - </h2> - </div> -</div> - -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png'> -<p class='legend'>Hot-keys on this page</p> - <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays - </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk - </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page - </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk - </p> - </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 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 par run hide_run'><a href='#n7'>7</a></p> -<p id='n8' class='stm mis'><a href='#n8'>8</a></p> -<p id='n9' class='stm mis'><a href='#n9'>9</a></p> -<p id='n10' class='stm mis'><a href='#n10'>10</a></p> -<p id='n11' class='stm mis'><a href='#n11'>11</a></p> -<p id='n12' class='stm mis'><a href='#n12'>12</a></p> -<p id='n13' class='stm mis'><a href='#n13'>13</a></p> -<p id='n14' class='stm mis'><a href='#n14'>14</a></p> -<p id='n15' class='stm mis'><a href='#n15'>15</a></p> -<p id='n16' class='stm mis'><a href='#n16'>16</a></p> -<p id='n17' class='pln'><a href='#n17'>17</a></p> -<p id='n18' class='stm run hide_run'><a href='#n18'>18</a></p> -<p id='n19' class='stm run hide_run'><a href='#n19'>19</a></p> -<p id='n20' class='stm run hide_run'><a href='#n20'>20</a></p> -<p id='n21' class='stm 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='stm mis'><a href='#n24'>24</a></p> -<p id='n25' class='stm run hide_run'><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='pln'><a href='#n28'>28</a></p> -<p id='n29' class='stm run hide_run'><a href='#n29'>29</a></p> -<p id='n30' class='stm run hide_run'><a href='#n30'>30</a></p> -<p id='n31' class='stm mis'><a href='#n31'>31</a></p> -<p id='n32' class='stm mis'><a href='#n32'>32</a></p> - - </td> - <td class='text' valign='top'> -<p id='t1' class='pln'><span class='str'>"""Compatibility between Py2 and Py3."""</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'>sys</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'>PY3</span> <span class='op'>=</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>version_info</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span> <span class='op'>==</span> <span class='num'>3</span><span class='strut'> </span></p> -<p id='t6' class='pln'><span class='strut'> </span></p> -<p id='t7' 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'>PY3</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t8' class='stm mis'> <span class='nam'>string_types</span> <span class='op'>=</span> <span class='op'>(</span><span class='nam'>str</span><span class='op'>,</span><span class='nam'>bytes</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t9' class='stm mis'> <span class='nam'>text_types</span> <span class='op'>=</span> <span class='op'>(</span><span class='nam'>str</span><span class='op'>,</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t10' class='stm mis'> <span class='nam'>bytes_types</span> <span class='op'>=</span> <span class='op'>(</span><span class='nam'>bytes</span><span class='op'>,</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t11' class='stm mis'> <span class='key'>def</span> <span class='nam'>b</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='t12' class='stm mis'> <span class='key'>return</span> <span class='nam'>s</span><span class='op'>.</span><span class='nam'>encode</span><span class='op'>(</span><span class='str'>"latin-1"</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t13' class='stm mis'> <span class='key'>def</span> <span class='nam'>u</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='t14' class='stm mis'> <span class='key'>return</span> <span class='nam'>s</span><span class='strut'> </span></p> -<p id='t15' class='stm mis'> <span class='key'>def</span> <span class='nam'>to_bytes</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='t16' class='stm mis'> <span class='key'>return</span> <span class='nam'>s</span><span class='op'>.</span><span class='nam'>encode</span><span class='op'>(</span><span class='str'>'utf8'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t17' class='pln'><span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t18' class='stm run hide_run'> <span class='nam'>string_types</span> <span class='op'>=</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='t19' class='stm run hide_run'> <span class='nam'>text_types</span> <span class='op'>=</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='t20' class='stm run hide_run'> <span class='nam'>bytes_types</span> <span class='op'>=</span> <span class='op'>(</span><span class='nam'>str</span><span class='op'>,</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t21' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>b</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='t22' class='stm run hide_run'> <span class='key'>return</span> <span class='nam'>s</span><span class='strut'> </span></p> -<p id='t23' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>u</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='t24' class='stm mis'> <span class='key'>return</span> <span class='nam'>unicode</span><span class='op'>(</span><span class='nam'>s</span><span class='op'>,</span> <span class='str'>"unicode_escape"</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t25' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>to_bytes</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='t26' class='stm run hide_run'> <span class='key'>return</span> <span class='nam'>s</span><span class='strut'> </span></p> -<p id='t27' class='pln'><span class='strut'> </span></p> -<p id='t28' class='pln'><span class='com'># Pythons 2 and 3 differ on where to get StringIO</span><span class='strut'> </span></p> -<p id='t29' class='stm run hide_run'><span class='key'>try</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t30' 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='t31' class='stm mis'><span class='key'>except</span> <span class='nam'>ImportError</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t32' class='stm mis'> <span class='key'>from</span> <span class='nam'>io</span> <span class='key'>import</span> <span class='nam'>StringIO</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.7.1</a> - </p> - </div> -</div> - -</body> -</html> diff --git a/doc/sample_html/cogapp_backward_py.html b/doc/sample_html/cogapp_backward_py.html new file mode 100644 index 00000000..c0eb8cc2 --- /dev/null +++ b/doc/sample_html/cogapp_backward_py.html @@ -0,0 +1,143 @@ + + + +<!DOCTYPE html> +<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 cogapp/backward.py: 57.14%</title> + <link rel="stylesheet" href="style.css" type="text/css"> + + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> + jQuery(document).ready(coverage.pyfile_ready); + </script> +</head> +<body class="pyfile"> + +<div id="header"> + <div class="content"> + <h1>Coverage for <b>cogapp/backward.py</b> : + <span class="pc_cov">57.14%</span> + </h1> + + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> + + <h2 class="stats"> + 19 statements + <span class="run hide_run shortkey_r button_toggle_run">11 run</span> + <span class="mis shortkey_m button_toggle_mis">8 missing</span> + <span class="exc shortkey_x button_toggle_exc">0 excluded</span> + + + <span class="par run hide_run shortkey_p button_toggle_par">1 partial</span> + + </h2> + </div> +</div> + +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> + <div> +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays + </p> +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk + </p> +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page + </p> +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk + </p> + </div> +</div> + +<div id="source"> + <table> + <tr> + <td class="linenos"> +<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 par run hide_run"><a href="#n7">7</a></p> +<p id="n8" class="stm mis"><a href="#n8">8</a></p> +<p id="n9" class="stm mis"><a href="#n9">9</a></p> +<p id="n10" class="stm mis"><a href="#n10">10</a></p> +<p id="n11" class="stm mis"><a href="#n11">11</a></p> +<p id="n12" class="stm mis"><a href="#n12">12</a></p> +<p id="n13" class="stm mis"><a href="#n13">13</a></p> +<p id="n14" class="pln"><a href="#n14">14</a></p> +<p id="n15" class="stm run hide_run"><a href="#n15">15</a></p> +<p id="n16" class="stm run hide_run"><a href="#n16">16</a></p> +<p id="n17" class="stm run hide_run"><a href="#n17">17</a></p> +<p id="n18" class="stm run hide_run"><a href="#n18">18</a></p> +<p id="n19" class="stm run hide_run"><a href="#n19">19</a></p> +<p id="n20" class="stm run hide_run"><a href="#n20">20</a></p> +<p id="n21" class="pln"><a href="#n21">21</a></p> +<p id="n22" class="pln"><a href="#n22">22</a></p> +<p id="n23" class="stm run hide_run"><a href="#n23">23</a></p> +<p id="n24" class="stm run hide_run"><a href="#n24">24</a></p> +<p id="n25" class="stm mis"><a href="#n25">25</a></p> +<p id="n26" class="stm mis"><a href="#n26">26</a></p> + + </td> + <td class="text"> +<p id="t1" class="pln"><span class="str">"""Compatibility between Py2 and Py3."""</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">sys</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">PY3</span> <span class="op">=</span> <span class="nam">sys</span><span class="op">.</span><span class="nam">version_info</span><span class="op">[</span><span class="num">0</span><span class="op">]</span> <span class="op">==</span> <span class="num">3</span><span class="strut"> </span></p> +<p id="t6" class="pln"><span class="strut"> </span></p> +<p id="t7" class="stm par run hide_run"><span class="annotate" title="Line 7 was executed, but never jumped to line 8">7 ↛ 8 [?]</span><span class="key">if</span> <span class="nam">PY3</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t8" class="stm mis"> <span class="nam">string_types</span> <span class="op">=</span> <span class="op">(</span><span class="nam">str</span><span class="op">,</span><span class="nam">bytes</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t9" class="stm mis"> <span class="nam">bytes_types</span> <span class="op">=</span> <span class="op">(</span><span class="nam">bytes</span><span class="op">,</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t10" class="stm mis"> <span class="key">def</span> <span class="nam">b</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="t11" class="stm mis"> <span class="key">return</span> <span class="nam">s</span><span class="op">.</span><span class="nam">encode</span><span class="op">(</span><span class="str">"latin-1"</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t12" class="stm mis"> <span class="key">def</span> <span class="nam">to_bytes</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="t13" class="stm mis"> <span class="key">return</span> <span class="nam">s</span><span class="op">.</span><span class="nam">encode</span><span class="op">(</span><span class="str">'utf8'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t14" class="pln"><span class="key">else</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t15" class="stm run hide_run"> <span class="nam">string_types</span> <span class="op">=</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="t16" class="stm run hide_run"> <span class="nam">bytes_types</span> <span class="op">=</span> <span class="op">(</span><span class="nam">str</span><span class="op">,</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t17" class="stm run hide_run"> <span class="key">def</span> <span class="nam">b</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="t18" class="stm run hide_run"> <span class="key">return</span> <span class="nam">s</span><span class="strut"> </span></p> +<p id="t19" class="stm run hide_run"> <span class="key">def</span> <span class="nam">to_bytes</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="t20" class="stm run hide_run"> <span class="key">return</span> <span class="nam">s</span><span class="strut"> </span></p> +<p id="t21" class="pln"><span class="strut"> </span></p> +<p id="t22" class="pln"><span class="com"># Pythons 2 and 3 differ on where to get StringIO</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="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="t25" class="stm mis"><span class="key">except</span> <span class="nam">ImportError</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t26" class="stm mis"> <span class="key">from</span> <span class="nam">io</span> <span class="key">import</span> <span class="nam">StringIO</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="https://coverage.readthedocs.org">coverage.py v4.0.3</a>, + created at 2015-11-24 07:02 + </p> + </div> +</div> + +</body> +</html> diff --git a/doc/sample_html/cogapp_cogapp.html b/doc/sample_html/cogapp_cogapp.html deleted file mode 100644 index bfac946a..00000000 --- a/doc/sample_html/cogapp_cogapp.html +++ /dev/null @@ -1,1550 +0,0 @@ -<!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 cogapp/cogapp: 49%</title> - <link rel='stylesheet' href='style.css' type='text/css'> - - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript' charset='utf-8'> - jQuery(document).ready(coverage.pyfile_ready); - </script> -</head> -<body id='pyfile'> - -<div id='header'> - <div class='content'> - <h1>Coverage for <b>cogapp/cogapp</b> : - <span class='pc_cov'>49%</span> - </h1> - <img id='keyboard_icon' src='keybd_closed.png'> - <h2 class='stats'> - 403 statements - <span class='run hide_run shortkey_r button_toggle_run'>223 run</span> - <span class='mis shortkey_m button_toggle_mis'>180 missing</span> - <span class='exc shortkey_x button_toggle_exc'>3 excluded</span> - - <span class='par run hide_run shortkey_p button_toggle_par'>26 partial</span> - - </h2> - </div> -</div> - -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png'> -<p class='legend'>Hot-keys on this page</p> - <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays - </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk - </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page - </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk - </p> - </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='pln'><a href='#n3'>3</a></p> -<p id='n4' class='pln'><a href='#n4'>4</a></p> -<p id='n5' class='pln'><a href='#n5'>5</a></p> -<p id='n6' class='pln'><a href='#n6'>6</a></p> -<p id='n7' class='stm run hide_run'><a href='#n7'>7</a></p> -<p id='n8' class='pln'><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> -<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 run hide_run'><a href='#n14'>14</a></p> -<p id='n15' class='pln'><a href='#n15'>15</a></p> -<p id='n16' class='stm run hide_run'><a href='#n16'>16</a></p> -<p id='n17' class='pln'><a href='#n17'>17</a></p> -<p id='n18' class='pln'><a href='#n18'>18</a></p> -<p id='n19' class='pln'><a href='#n19'>19</a></p> -<p id='n20' class='pln'><a href='#n20'>20</a></p> -<p id='n21' class='pln'><a href='#n21'>21</a></p> -<p id='n22' class='pln'><a href='#n22'>22</a></p> -<p id='n23' class='pln'><a href='#n23'>23</a></p> -<p id='n24' class='pln'><a href='#n24'>24</a></p> -<p id='n25' class='pln'><a href='#n25'>25</a></p> -<p id='n26' class='pln'><a href='#n26'>26</a></p> -<p id='n27' class='pln'><a href='#n27'>27</a></p> -<p id='n28' class='pln'><a href='#n28'>28</a></p> -<p id='n29' class='pln'><a href='#n29'>29</a></p> -<p id='n30' class='pln'><a href='#n30'>30</a></p> -<p id='n31' class='pln'><a href='#n31'>31</a></p> -<p id='n32' class='pln'><a href='#n32'>32</a></p> -<p id='n33' class='pln'><a href='#n33'>33</a></p> -<p id='n34' class='pln'><a href='#n34'>34</a></p> -<p id='n35' class='pln'><a href='#n35'>35</a></p> -<p id='n36' class='pln'><a href='#n36'>36</a></p> -<p id='n37' class='pln'><a href='#n37'>37</a></p> -<p id='n38' class='pln'><a href='#n38'>38</a></p> -<p id='n39' class='pln'><a href='#n39'>39</a></p> -<p id='n40' class='pln'><a href='#n40'>40</a></p> -<p id='n41' class='pln'><a href='#n41'>41</a></p> -<p id='n42' class='pln'><a href='#n42'>42</a></p> -<p id='n43' class='pln'><a href='#n43'>43</a></p> -<p id='n44' class='stm run hide_run'><a href='#n44'>44</a></p> -<p id='n45' class='pln'><a href='#n45'>45</a></p> -<p id='n46' class='stm run hide_run'><a href='#n46'>46</a></p> -<p id='n47' class='pln'><a href='#n47'>47</a></p> -<p id='n48' class='pln'><a href='#n48'>48</a></p> -<p id='n49' class='stm run hide_run'><a href='#n49'>49</a></p> -<p id='n50' class='stm par run hide_run'><a href='#n50'>50</a></p> -<p id='n51' class='stm run hide_run'><a href='#n51'>51</a></p> -<p id='n52' class='pln'><a href='#n52'>52</a></p> -<p id='n53' class='stm mis'><a href='#n53'>53</a></p> -<p id='n54' class='pln'><a href='#n54'>54</a></p> -<p id='n55' class='stm run hide_run'><a href='#n55'>55</a></p> -<p id='n56' class='pln'><a href='#n56'>56</a></p> -<p id='n57' class='pln'><a href='#n57'>57</a></p> -<p id='n58' class='exc'><a href='#n58'>58</a></p> -<p id='n59' class='pln'><a href='#n59'>59</a></p> -<p id='n60' class='stm run hide_run'><a href='#n60'>60</a></p> -<p id='n61' class='pln'><a href='#n61'>61</a></p> -<p id='n62' class='pln'><a href='#n62'>62</a></p> -<p id='n63' class='exc'><a href='#n63'>63</a></p> -<p id='n64' class='pln'><a href='#n64'>64</a></p> -<p id='n65' class='stm run hide_run'><a href='#n65'>65</a></p> -<p id='n66' class='pln'><a href='#n66'>66</a></p> -<p id='n67' class='pln'><a href='#n67'>67</a></p> -<p id='n68' class='exc'><a href='#n68'>68</a></p> -<p id='n69' class='pln'><a href='#n69'>69</a></p> -<p id='n70' class='stm run hide_run'><a href='#n70'>70</a></p> -<p id='n71' class='pln'><a href='#n71'>71</a></p> -<p id='n72' class='pln'><a href='#n72'>72</a></p> -<p id='n73' class='stm run hide_run'><a href='#n73'>73</a></p> -<p id='n74' class='stm run hide_run'><a href='#n74'>74</a></p> -<p id='n75' class='stm run hide_run'><a href='#n75'>75</a></p> -<p id='n76' class='pln'><a href='#n76'>76</a></p> -<p id='n77' class='stm run hide_run'><a href='#n77'>77</a></p> -<p id='n78' class='pln'><a href='#n78'>78</a></p> -<p id='n79' class='pln'><a href='#n79'>79</a></p> -<p id='n80' class='stm par run hide_run'><a href='#n80'>80</a></p> -<p id='n81' class='stm run hide_run'><a href='#n81'>81</a></p> -<p id='n82' class='stm par run hide_run'><a href='#n82'>82</a></p> -<p id='n83' class='stm mis'><a href='#n83'>83</a></p> -<p id='n84' class='pln'><a href='#n84'>84</a></p> -<p id='n85' class='stm run hide_run'><a href='#n85'>85</a></p> -<p id='n86' class='stm mis'><a href='#n86'>86</a></p> -<p id='n87' class='pln'><a href='#n87'>87</a></p> -<p id='n88' class='stm run hide_run'><a href='#n88'>88</a></p> -<p id='n89' class='stm mis'><a href='#n89'>89</a></p> -<p id='n90' class='pln'><a href='#n90'>90</a></p> -<p id='n91' class='pln'><a href='#n91'>91</a></p> -<p id='n92' class='stm run hide_run'><a href='#n92'>92</a></p> -<p id='n93' class='pln'><a href='#n93'>93</a></p> -<p id='n94' class='pln'><a href='#n94'>94</a></p> -<p id='n95' class='stm run hide_run'><a href='#n95'>95</a></p> -<p id='n96' class='stm run hide_run'><a href='#n96'>96</a></p> -<p id='n97' class='stm run hide_run'><a href='#n97'>97</a></p> -<p id='n98' class='stm run hide_run'><a href='#n98'>98</a></p> -<p id='n99' class='pln'><a href='#n99'>99</a></p> -<p id='n100' class='stm run hide_run'><a href='#n100'>100</a></p> -<p id='n101' class='stm run hide_run'><a href='#n101'>101</a></p> -<p id='n102' class='pln'><a href='#n102'>102</a></p> -<p id='n103' class='stm run hide_run'><a href='#n103'>103</a></p> -<p id='n104' class='stm run hide_run'><a href='#n104'>104</a></p> -<p id='n105' class='pln'><a href='#n105'>105</a></p> -<p id='n106' class='stm run hide_run'><a href='#n106'>106</a></p> -<p id='n107' class='pln'><a href='#n107'>107</a></p> -<p id='n108' class='pln'><a href='#n108'>108</a></p> -<p id='n109' class='pln'><a href='#n109'>109</a></p> -<p id='n110' class='pln'><a href='#n110'>110</a></p> -<p id='n111' class='pln'><a href='#n111'>111</a></p> -<p id='n112' class='stm run hide_run'><a href='#n112'>112</a></p> -<p id='n113' class='stm run hide_run'><a href='#n113'>113</a></p> -<p id='n114' class='stm run hide_run'><a href='#n114'>114</a></p> -<p id='n115' class='stm run hide_run'><a href='#n115'>115</a></p> -<p id='n116' class='pln'><a href='#n116'>116</a></p> -<p id='n117' class='stm run hide_run'><a href='#n117'>117</a></p> -<p id='n118' class='pln'><a href='#n118'>118</a></p> -<p id='n119' class='stm run hide_run'><a href='#n119'>119</a></p> -<p id='n120' class='pln'><a href='#n120'>120</a></p> -<p id='n121' class='stm run hide_run'><a href='#n121'>121</a></p> -<p id='n122' class='pln'><a href='#n122'>122</a></p> -<p id='n123' class='stm run hide_run'><a href='#n123'>123</a></p> -<p id='n124' class='stm run hide_run'><a href='#n124'>124</a></p> -<p id='n125' class='stm run hide_run'><a href='#n125'>125</a></p> -<p id='n126' class='pln'><a href='#n126'>126</a></p> -<p id='n127' class='pln'><a href='#n127'>127</a></p> -<p id='n128' class='stm run hide_run'><a href='#n128'>128</a></p> -<p id='n129' class='stm run hide_run'><a href='#n129'>129</a></p> -<p id='n130' class='pln'><a href='#n130'>130</a></p> -<p id='n131' class='pln'><a href='#n131'>131</a></p> -<p id='n132' class='stm run hide_run'><a href='#n132'>132</a></p> -<p id='n133' class='stm run hide_run'><a href='#n133'>133</a></p> -<p id='n134' class='stm run hide_run'><a href='#n134'>134</a></p> -<p id='n135' class='stm run hide_run'><a href='#n135'>135</a></p> -<p id='n136' class='pln'><a href='#n136'>136</a></p> -<p id='n137' class='stm run hide_run'><a href='#n137'>137</a></p> -<p id='n138' class='stm run hide_run'><a href='#n138'>138</a></p> -<p id='n139' class='pln'><a href='#n139'>139</a></p> -<p id='n140' class='pln'><a href='#n140'>140</a></p> -<p id='n141' class='pln'><a href='#n141'>141</a></p> -<p id='n142' class='pln'><a href='#n142'>142</a></p> -<p id='n143' class='stm run hide_run'><a href='#n143'>143</a></p> -<p id='n144' class='stm run hide_run'><a href='#n144'>144</a></p> -<p id='n145' class='pln'><a href='#n145'>145</a></p> -<p id='n146' class='stm run hide_run'><a href='#n146'>146</a></p> -<p id='n147' class='pln'><a href='#n147'>147</a></p> -<p id='n148' class='stm run hide_run'><a href='#n148'>148</a></p> -<p id='n149' class='stm mis'><a href='#n149'>149</a></p> -<p id='n150' class='pln'><a href='#n150'>150</a></p> -<p id='n151' class='stm run hide_run'><a href='#n151'>151</a></p> -<p id='n152' class='pln'><a href='#n152'>152</a></p> -<p id='n153' class='pln'><a href='#n153'>153</a></p> -<p id='n154' class='stm run hide_run'><a href='#n154'>154</a></p> -<p id='n155' class='stm run hide_run'><a href='#n155'>155</a></p> -<p id='n156' class='stm run hide_run'><a href='#n156'>156</a></p> -<p id='n157' class='stm run hide_run'><a href='#n157'>157</a></p> -<p id='n158' class='stm par run hide_run'><a href='#n158'>158</a></p> -<p id='n159' class='stm run hide_run'><a href='#n159'>159</a></p> -<p id='n160' class='stm run hide_run'><a href='#n160'>160</a></p> -<p id='n161' class='stm run hide_run'><a href='#n161'>161</a></p> -<p id='n162' class='stm run hide_run'><a href='#n162'>162</a></p> -<p id='n163' class='stm run hide_run'><a href='#n163'>163</a></p> -<p id='n164' class='pln'><a href='#n164'>164</a></p> -<p id='n165' class='stm run hide_run'><a href='#n165'>165</a></p> -<p id='n166' class='pln'><a href='#n166'>166</a></p> -<p id='n167' class='pln'><a href='#n167'>167</a></p> -<p id='n168' class='stm run hide_run'><a href='#n168'>168</a></p> -<p id='n169' class='stm run hide_run'><a href='#n169'>169</a></p> -<p id='n170' class='pln'><a href='#n170'>170</a></p> -<p id='n171' class='stm run hide_run'><a href='#n171'>171</a></p> -<p id='n172' class='pln'><a href='#n172'>172</a></p> -<p id='n173' class='pln'><a href='#n173'>173</a></p> -<p id='n174' class='pln'><a href='#n174'>174</a></p> -<p id='n175' class='pln'><a href='#n175'>175</a></p> -<p id='n176' class='pln'><a href='#n176'>176</a></p> -<p id='n177' class='stm mis'><a href='#n177'>177</a></p> -<p id='n178' class='pln'><a href='#n178'>178</a></p> -<p id='n179' class='pln'><a href='#n179'>179</a></p> -<p id='n180' class='stm run hide_run'><a href='#n180'>180</a></p> -<p id='n181' class='pln'><a href='#n181'>181</a></p> -<p id='n182' class='pln'><a href='#n182'>182</a></p> -<p id='n183' class='stm run hide_run'><a href='#n183'>183</a></p> -<p id='n184' class='stm run hide_run'><a href='#n184'>184</a></p> -<p id='n185' class='stm run hide_run'><a href='#n185'>185</a></p> -<p id='n186' class='pln'><a href='#n186'>186</a></p> -<p id='n187' class='stm run hide_run'><a href='#n187'>187</a></p> -<p id='n188' class='stm run hide_run'><a href='#n188'>188</a></p> -<p id='n189' class='stm run hide_run'><a href='#n189'>189</a></p> -<p id='n190' class='stm run hide_run'><a href='#n190'>190</a></p> -<p id='n191' class='stm run hide_run'><a href='#n191'>191</a></p> -<p id='n192' class='pln'><a href='#n192'>192</a></p> -<p id='n193' class='stm run hide_run'><a href='#n193'>193</a></p> -<p id='n194' class='stm run hide_run'><a href='#n194'>194</a></p> -<p id='n195' class='pln'><a href='#n195'>195</a></p> -<p id='n196' class='pln'><a href='#n196'>196</a></p> -<p id='n197' class='stm run hide_run'><a href='#n197'>197</a></p> -<p id='n198' class='pln'><a href='#n198'>198</a></p> -<p id='n199' class='pln'><a href='#n199'>199</a></p> -<p id='n200' class='stm run hide_run'><a href='#n200'>200</a></p> -<p id='n201' class='pln'><a href='#n201'>201</a></p> -<p id='n202' class='stm run hide_run'><a href='#n202'>202</a></p> -<p id='n203' class='stm run hide_run'><a href='#n203'>203</a></p> -<p id='n204' class='stm run hide_run'><a href='#n204'>204</a></p> -<p id='n205' class='stm run hide_run'><a href='#n205'>205</a></p> -<p id='n206' class='stm run hide_run'><a href='#n206'>206</a></p> -<p id='n207' class='stm run hide_run'><a href='#n207'>207</a></p> -<p id='n208' class='stm run hide_run'><a href='#n208'>208</a></p> -<p id='n209' class='stm run hide_run'><a href='#n209'>209</a></p> -<p id='n210' class='stm run hide_run'><a href='#n210'>210</a></p> -<p id='n211' class='stm run hide_run'><a href='#n211'>211</a></p> -<p id='n212' class='stm run hide_run'><a href='#n212'>212</a></p> -<p id='n213' class='stm run hide_run'><a href='#n213'>213</a></p> -<p id='n214' class='stm run hide_run'><a href='#n214'>214</a></p> -<p id='n215' class='stm run hide_run'><a href='#n215'>215</a></p> -<p id='n216' class='pln'><a href='#n216'>216</a></p> -<p id='n217' class='stm run hide_run'><a href='#n217'>217</a></p> -<p id='n218' class='pln'><a href='#n218'>218</a></p> -<p id='n219' class='pln'><a href='#n219'>219</a></p> -<p id='n220' class='stm mis'><a href='#n220'>220</a></p> -<p id='n221' class='pln'><a href='#n221'>221</a></p> -<p id='n222' class='stm run hide_run'><a href='#n222'>222</a></p> -<p id='n223' class='pln'><a href='#n223'>223</a></p> -<p id='n224' class='pln'><a href='#n224'>224</a></p> -<p id='n225' class='stm mis'><a href='#n225'>225</a></p> -<p id='n226' class='pln'><a href='#n226'>226</a></p> -<p id='n227' class='stm run hide_run'><a href='#n227'>227</a></p> -<p id='n228' class='pln'><a href='#n228'>228</a></p> -<p id='n229' class='pln'><a href='#n229'>229</a></p> -<p id='n230' class='stm mis'><a href='#n230'>230</a></p> -<p id='n231' class='stm mis'><a href='#n231'>231</a></p> -<p id='n232' class='pln'><a href='#n232'>232</a></p> -<p id='n233' class='stm run hide_run'><a href='#n233'>233</a></p> -<p id='n234' class='pln'><a href='#n234'>234</a></p> -<p id='n235' class='stm mis'><a href='#n235'>235</a></p> -<p id='n236' class='stm mis'><a href='#n236'>236</a></p> -<p id='n237' class='stm mis'><a href='#n237'>237</a></p> -<p id='n238' class='stm mis'><a href='#n238'>238</a></p> -<p id='n239' class='pln'><a href='#n239'>239</a></p> -<p id='n240' class='pln'><a href='#n240'>240</a></p> -<p id='n241' class='stm mis'><a href='#n241'>241</a></p> -<p id='n242' class='stm mis'><a href='#n242'>242</a></p> -<p id='n243' class='stm mis'><a href='#n243'>243</a></p> -<p id='n244' class='stm mis'><a href='#n244'>244</a></p> -<p id='n245' class='stm mis'><a href='#n245'>245</a></p> -<p id='n246' class='stm mis'><a href='#n246'>246</a></p> -<p id='n247' class='stm mis'><a href='#n247'>247</a></p> -<p id='n248' class='stm mis'><a href='#n248'>248</a></p> -<p id='n249' class='stm mis'><a href='#n249'>249</a></p> -<p id='n250' class='stm mis'><a href='#n250'>250</a></p> -<p id='n251' class='stm mis'><a href='#n251'>251</a></p> -<p id='n252' class='stm mis'><a href='#n252'>252</a></p> -<p id='n253' class='stm mis'><a href='#n253'>253</a></p> -<p id='n254' class='stm mis'><a href='#n254'>254</a></p> -<p id='n255' class='stm mis'><a href='#n255'>255</a></p> -<p id='n256' class='stm mis'><a href='#n256'>256</a></p> -<p id='n257' class='stm mis'><a href='#n257'>257</a></p> -<p id='n258' class='stm mis'><a href='#n258'>258</a></p> -<p id='n259' class='stm mis'><a href='#n259'>259</a></p> -<p id='n260' class='stm mis'><a href='#n260'>260</a></p> -<p id='n261' class='stm mis'><a href='#n261'>261</a></p> -<p id='n262' class='stm mis'><a href='#n262'>262</a></p> -<p id='n263' class='stm mis'><a href='#n263'>263</a></p> -<p id='n264' class='stm mis'><a href='#n264'>264</a></p> -<p id='n265' class='stm mis'><a href='#n265'>265</a></p> -<p id='n266' class='stm mis'><a href='#n266'>266</a></p> -<p id='n267' class='stm mis'><a href='#n267'>267</a></p> -<p id='n268' class='stm mis'><a href='#n268'>268</a></p> -<p id='n269' class='stm mis'><a href='#n269'>269</a></p> -<p id='n270' class='stm mis'><a href='#n270'>270</a></p> -<p id='n271' class='pln'><a href='#n271'>271</a></p> -<p id='n272' class='pln'><a href='#n272'>272</a></p> -<p id='n273' class='pln'><a href='#n273'>273</a></p> -<p id='n274' class='stm mis'><a href='#n274'>274</a></p> -<p id='n275' class='pln'><a href='#n275'>275</a></p> -<p id='n276' class='stm run hide_run'><a href='#n276'>276</a></p> -<p id='n277' class='pln'><a href='#n277'>277</a></p> -<p id='n278' class='pln'><a href='#n278'>278</a></p> -<p id='n279' class='stm mis'><a href='#n279'>279</a></p> -<p id='n280' class='stm mis'><a href='#n280'>280</a></p> -<p id='n281' class='pln'><a href='#n281'>281</a></p> -<p id='n282' class='stm mis'><a href='#n282'>282</a></p> -<p id='n283' class='stm mis'><a href='#n283'>283</a></p> -<p id='n284' class='pln'><a href='#n284'>284</a></p> -<p id='n285' class='pln'><a href='#n285'>285</a></p> -<p id='n286' class='stm run hide_run'><a href='#n286'>286</a></p> -<p id='n287' class='pln'><a href='#n287'>287</a></p> -<p id='n288' class='pln'><a href='#n288'>288</a></p> -<p id='n289' class='stm run hide_run'><a href='#n289'>289</a></p> -<p id='n290' class='stm run hide_run'><a href='#n290'>290</a></p> -<p id='n291' class='stm run hide_run'><a href='#n291'>291</a></p> -<p id='n292' class='stm run hide_run'><a href='#n292'>292</a></p> -<p id='n293' class='stm run hide_run'><a href='#n293'>293</a></p> -<p id='n294' class='stm run hide_run'><a href='#n294'>294</a></p> -<p id='n295' class='stm run hide_run'><a href='#n295'>295</a></p> -<p id='n296' class='pln'><a href='#n296'>296</a></p> -<p id='n297' class='stm run hide_run'><a href='#n297'>297</a></p> -<p id='n298' class='pln'><a href='#n298'>298</a></p> -<p id='n299' class='stm run hide_run'><a href='#n299'>299</a></p> -<p id='n300' class='pln'><a href='#n300'>300</a></p> -<p id='n301' class='stm run hide_run'><a href='#n301'>301</a></p> -<p id='n302' class='stm mis'><a href='#n302'>302</a></p> -<p id='n303' class='pln'><a href='#n303'>303</a></p> -<p id='n304' class='stm run hide_run'><a href='#n304'>304</a></p> -<p id='n305' class='stm run hide_run'><a href='#n305'>305</a></p> -<p id='n306' class='pln'><a href='#n306'>306</a></p> -<p id='n307' class='stm run hide_run'><a href='#n307'>307</a></p> -<p id='n308' class='stm run hide_run'><a href='#n308'>308</a></p> -<p id='n309' class='pln'><a href='#n309'>309</a></p> -<p id='n310' class='stm run hide_run'><a href='#n310'>310</a></p> -<p id='n311' class='stm run hide_run'><a href='#n311'>311</a></p> -<p id='n312' class='pln'><a href='#n312'>312</a></p> -<p id='n313' class='stm run hide_run'><a href='#n313'>313</a></p> -<p id='n314' class='pln'><a href='#n314'>314</a></p> -<p id='n315' class='pln'><a href='#n315'>315</a></p> -<p id='n316' class='pln'><a href='#n316'>316</a></p> -<p id='n317' class='stm run hide_run'><a href='#n317'>317</a></p> -<p id='n318' class='stm run hide_run'><a href='#n318'>318</a></p> -<p id='n319' class='stm run hide_run'><a href='#n319'>319</a></p> -<p id='n320' class='pln'><a href='#n320'>320</a></p> -<p id='n321' class='stm run hide_run'><a href='#n321'>321</a></p> -<p id='n322' class='pln'><a href='#n322'>322</a></p> -<p id='n323' class='pln'><a href='#n323'>323</a></p> -<p id='n324' class='stm mis'><a href='#n324'>324</a></p> -<p id='n325' class='stm mis'><a href='#n325'>325</a></p> -<p id='n326' class='stm mis'><a href='#n326'>326</a></p> -<p id='n327' class='stm mis'><a href='#n327'>327</a></p> -<p id='n328' class='stm mis'><a href='#n328'>328</a></p> -<p id='n329' class='stm mis'><a href='#n329'>329</a></p> -<p id='n330' class='stm mis'><a href='#n330'>330</a></p> -<p id='n331' class='pln'><a href='#n331'>331</a></p> -<p id='n332' class='stm mis'><a href='#n332'>332</a></p> -<p id='n333' class='stm mis'><a href='#n333'>333</a></p> -<p id='n334' class='pln'><a href='#n334'>334</a></p> -<p id='n335' class='stm run hide_run'><a href='#n335'>335</a></p> -<p id='n336' class='pln'><a href='#n336'>336</a></p> -<p id='n337' class='stm mis'><a href='#n337'>337</a></p> -<p id='n338' class='stm mis'><a href='#n338'>338</a></p> -<p id='n339' class='pln'><a href='#n339'>339</a></p> -<p id='n340' class='stm mis'><a href='#n340'>340</a></p> -<p id='n341' class='stm mis'><a href='#n341'>341</a></p> -<p id='n342' class='stm mis'><a href='#n342'>342</a></p> -<p id='n343' class='stm mis'><a href='#n343'>343</a></p> -<p id='n344' class='pln'><a href='#n344'>344</a></p> -<p id='n345' class='stm run hide_run'><a href='#n345'>345</a></p> -<p id='n346' class='pln'><a href='#n346'>346</a></p> -<p id='n347' class='pln'><a href='#n347'>347</a></p> -<p id='n348' class='pln'><a href='#n348'>348</a></p> -<p id='n349' class='pln'><a href='#n349'>349</a></p> -<p id='n350' class='stm run hide_run'><a href='#n350'>350</a></p> -<p id='n351' class='stm run hide_run'><a href='#n351'>351</a></p> -<p id='n352' class='stm run hide_run'><a href='#n352'>352</a></p> -<p id='n353' class='pln'><a href='#n353'>353</a></p> -<p id='n354' class='stm par run hide_run'><a href='#n354'>354</a></p> -<p id='n355' class='pln'><a href='#n355'>355</a></p> -<p id='n356' class='stm mis'><a href='#n356'>356</a></p> -<p id='n357' class='stm mis'><a href='#n357'>357</a></p> -<p id='n358' class='stm par run hide_run'><a href='#n358'>358</a></p> -<p id='n359' class='pln'><a href='#n359'>359</a></p> -<p id='n360' class='stm mis'><a href='#n360'>360</a></p> -<p id='n361' class='stm mis'><a href='#n361'>361</a></p> -<p id='n362' class='pln'><a href='#n362'>362</a></p> -<p id='n363' class='stm run hide_run'><a href='#n363'>363</a></p> -<p id='n364' class='stm run hide_run'><a href='#n364'>364</a></p> -<p id='n365' class='pln'><a href='#n365'>365</a></p> -<p id='n366' class='stm run hide_run'><a href='#n366'>366</a></p> -<p id='n367' class='pln'><a href='#n367'>367</a></p> -<p id='n368' class='stm run hide_run'><a href='#n368'>368</a></p> -<p id='n369' class='stm run hide_run'><a href='#n369'>369</a></p> -<p id='n370' class='pln'><a href='#n370'>370</a></p> -<p id='n371' class='pln'><a href='#n371'>371</a></p> -<p id='n372' class='stm par run hide_run'><a href='#n372'>372</a></p> -<p id='n373' class='stm run hide_run'><a href='#n373'>373</a></p> -<p id='n374' class='pln'><a href='#n374'>374</a></p> -<p id='n375' class='pln'><a href='#n375'>375</a></p> -<p id='n376' class='stm run hide_run'><a href='#n376'>376</a></p> -<p id='n377' class='pln'><a href='#n377'>377</a></p> -<p id='n378' class='pln'><a href='#n378'>378</a></p> -<p id='n379' class='stm run hide_run'><a href='#n379'>379</a></p> -<p id='n380' class='stm run hide_run'><a href='#n380'>380</a></p> -<p id='n381' class='pln'><a href='#n381'>381</a></p> -<p id='n382' class='stm run hide_run'><a href='#n382'>382</a></p> -<p id='n383' class='stm par run hide_run'><a href='#n383'>383</a></p> -<p id='n384' class='stm mis'><a href='#n384'>384</a></p> -<p id='n385' class='pln'><a href='#n385'>385</a></p> -<p id='n386' class='stm par run hide_run'><a href='#n386'>386</a></p> -<p id='n387' class='stm mis'><a href='#n387'>387</a></p> -<p id='n388' class='pln'><a href='#n388'>388</a></p> -<p id='n389' class='stm run hide_run'><a href='#n389'>389</a></p> -<p id='n390' class='stm run hide_run'><a href='#n390'>390</a></p> -<p id='n391' class='stm run hide_run'><a href='#n391'>391</a></p> -<p id='n392' class='stm run hide_run'><a href='#n392'>392</a></p> -<p id='n393' class='stm par run hide_run'><a href='#n393'>393</a></p> -<p id='n394' class='stm run hide_run'><a href='#n394'>394</a></p> -<p id='n395' class='pln'><a href='#n395'>395</a></p> -<p id='n396' class='pln'><a href='#n396'>396</a></p> -<p id='n397' class='stm run hide_run'><a href='#n397'>397</a></p> -<p id='n398' class='stm run hide_run'><a href='#n398'>398</a></p> -<p id='n399' class='stm run hide_run'><a href='#n399'>399</a></p> -<p id='n400' class='stm run hide_run'><a href='#n400'>400</a></p> -<p id='n401' class='stm run hide_run'><a href='#n401'>401</a></p> -<p id='n402' class='pln'><a href='#n402'>402</a></p> -<p id='n403' class='pln'><a href='#n403'>403</a></p> -<p id='n404' class='pln'><a href='#n404'>404</a></p> -<p id='n405' class='stm run hide_run'><a href='#n405'>405</a></p> -<p id='n406' class='stm run hide_run'><a href='#n406'>406</a></p> -<p id='n407' class='stm run hide_run'><a href='#n407'>407</a></p> -<p id='n408' class='stm run hide_run'><a href='#n408'>408</a></p> -<p id='n409' class='stm run hide_run'><a href='#n409'>409</a></p> -<p id='n410' class='pln'><a href='#n410'>410</a></p> -<p id='n411' class='pln'><a href='#n411'>411</a></p> -<p id='n412' class='stm run hide_run'><a href='#n412'>412</a></p> -<p id='n413' class='stm run hide_run'><a href='#n413'>413</a></p> -<p id='n414' class='pln'><a href='#n414'>414</a></p> -<p id='n415' class='pln'><a href='#n415'>415</a></p> -<p id='n416' class='stm run hide_run'><a href='#n416'>416</a></p> -<p id='n417' class='pln'><a href='#n417'>417</a></p> -<p id='n418' class='pln'><a href='#n418'>418</a></p> -<p id='n419' class='stm run hide_run'><a href='#n419'>419</a></p> -<p id='n420' class='stm par run hide_run'><a href='#n420'>420</a></p> -<p id='n421' class='stm mis'><a href='#n421'>421</a></p> -<p id='n422' class='pln'><a href='#n422'>422</a></p> -<p id='n423' class='stm par run hide_run'><a href='#n423'>423</a></p> -<p id='n424' class='stm mis'><a href='#n424'>424</a></p> -<p id='n425' class='pln'><a href='#n425'>425</a></p> -<p id='n426' class='stm par run hide_run'><a href='#n426'>426</a></p> -<p id='n427' class='stm run hide_run'><a href='#n427'>427</a></p> -<p id='n428' class='stm run hide_run'><a href='#n428'>428</a></p> -<p id='n429' class='stm run hide_run'><a href='#n429'>429</a></p> -<p id='n430' class='stm par run hide_run'><a href='#n430'>430</a></p> -<p id='n431' class='stm mis'><a href='#n431'>431</a></p> -<p id='n432' class='pln'><a href='#n432'>432</a></p> -<p id='n433' class='pln'><a href='#n433'>433</a></p> -<p id='n434' class='pln'><a href='#n434'>434</a></p> -<p id='n435' class='stm par run hide_run'><a href='#n435'>435</a></p> -<p id='n436' class='stm run hide_run'><a href='#n436'>436</a></p> -<p id='n437' class='stm run hide_run'><a href='#n437'>437</a></p> -<p id='n438' class='pln'><a href='#n438'>438</a></p> -<p id='n439' class='stm run hide_run'><a href='#n439'>439</a></p> -<p id='n440' class='pln'><a href='#n440'>440</a></p> -<p id='n441' class='pln'><a href='#n441'>441</a></p> -<p id='n442' class='pln'><a href='#n442'>442</a></p> -<p id='n443' class='stm run hide_run'><a href='#n443'>443</a></p> -<p id='n444' class='stm run hide_run'><a href='#n444'>444</a></p> -<p id='n445' class='stm run hide_run'><a href='#n445'>445</a></p> -<p id='n446' class='stm par run hide_run'><a href='#n446'>446</a></p> -<p id='n447' class='stm mis'><a href='#n447'>447</a></p> -<p id='n448' class='pln'><a href='#n448'>448</a></p> -<p id='n449' class='stm par run hide_run'><a href='#n449'>449</a></p> -<p id='n450' class='stm mis'><a href='#n450'>450</a></p> -<p id='n451' class='pln'><a href='#n451'>451</a></p> -<p id='n452' class='stm run hide_run'><a href='#n452'>452</a></p> -<p id='n453' class='stm run hide_run'><a href='#n453'>453</a></p> -<p id='n454' class='stm run hide_run'><a href='#n454'>454</a></p> -<p id='n455' class='stm run hide_run'><a href='#n455'>455</a></p> -<p id='n456' class='pln'><a href='#n456'>456</a></p> -<p id='n457' class='stm par run hide_run'><a href='#n457'>457</a></p> -<p id='n458' class='pln'><a href='#n458'>458</a></p> -<p id='n459' class='stm mis'><a href='#n459'>459</a></p> -<p id='n460' class='pln'><a href='#n460'>460</a></p> -<p id='n461' class='pln'><a href='#n461'>461</a></p> -<p id='n462' class='pln'><a href='#n462'>462</a></p> -<p id='n463' class='stm run hide_run'><a href='#n463'>463</a></p> -<p id='n464' class='pln'><a href='#n464'>464</a></p> -<p id='n465' class='pln'><a href='#n465'>465</a></p> -<p id='n466' class='pln'><a href='#n466'>466</a></p> -<p id='n467' class='stm run hide_run'><a href='#n467'>467</a></p> -<p id='n468' class='stm par run hide_run'><a href='#n468'>468</a></p> -<p id='n469' class='stm run hide_run'><a href='#n469'>469</a></p> -<p id='n470' class='stm run hide_run'><a href='#n470'>470</a></p> -<p id='n471' class='stm run hide_run'><a href='#n471'>471</a></p> -<p id='n472' class='stm run hide_run'><a href='#n472'>472</a></p> -<p id='n473' class='stm run hide_run'><a href='#n473'>473</a></p> -<p id='n474' class='stm run hide_run'><a href='#n474'>474</a></p> -<p id='n475' class='pln'><a href='#n475'>475</a></p> -<p id='n476' class='stm run hide_run'><a href='#n476'>476</a></p> -<p id='n477' class='pln'><a href='#n477'>477</a></p> -<p id='n478' class='pln'><a href='#n478'>478</a></p> -<p id='n479' class='stm run hide_run'><a href='#n479'>479</a></p> -<p id='n480' class='stm par run hide_run'><a href='#n480'>480</a></p> -<p id='n481' class='stm mis'><a href='#n481'>481</a></p> -<p id='n482' class='stm mis'><a href='#n482'>482</a></p> -<p id='n483' class='stm mis'><a href='#n483'>483</a></p> -<p id='n484' class='stm mis'><a href='#n484'>484</a></p> -<p id='n485' class='pln'><a href='#n485'>485</a></p> -<p id='n486' class='pln'><a href='#n486'>486</a></p> -<p id='n487' class='stm mis'><a href='#n487'>487</a></p> -<p id='n488' class='pln'><a href='#n488'>488</a></p> -<p id='n489' class='pln'><a href='#n489'>489</a></p> -<p id='n490' class='stm mis'><a href='#n490'>490</a></p> -<p id='n491' class='stm mis'><a href='#n491'>491</a></p> -<p id='n492' class='pln'><a href='#n492'>492</a></p> -<p id='n493' class='pln'><a href='#n493'>493</a></p> -<p id='n494' class='pln'><a href='#n494'>494</a></p> -<p id='n495' class='stm par run hide_run'><a href='#n495'>495</a></p> -<p id='n496' class='stm mis'><a href='#n496'>496</a></p> -<p id='n497' class='pln'><a href='#n497'>497</a></p> -<p id='n498' class='stm par run hide_run'><a href='#n498'>498</a></p> -<p id='n499' class='stm run hide_run'><a href='#n499'>499</a></p> -<p id='n500' class='stm run hide_run'><a href='#n500'>500</a></p> -<p id='n501' class='pln'><a href='#n501'>501</a></p> -<p id='n502' class='stm par run hide_run'><a href='#n502'>502</a></p> -<p id='n503' class='stm mis'><a href='#n503'>503</a></p> -<p id='n504' class='pln'><a href='#n504'>504</a></p> -<p id='n505' class='stm par run hide_run'><a href='#n505'>505</a></p> -<p id='n506' class='stm mis'><a href='#n506'>506</a></p> -<p id='n507' class='stm par run hide_run'><a href='#n507'>507</a></p> -<p id='n508' class='stm mis'><a href='#n508'>508</a></p> -<p id='n509' class='pln'><a href='#n509'>509</a></p> -<p id='n510' class='pln'><a href='#n510'>510</a></p> -<p id='n511' class='pln'><a href='#n511'>511</a></p> -<p id='n512' class='stm run hide_run'><a href='#n512'>512</a></p> -<p id='n513' class='pln'><a href='#n513'>513</a></p> -<p id='n514' class='stm run hide_run'><a href='#n514'>514</a></p> -<p id='n515' class='pln'><a href='#n515'>515</a></p> -<p id='n516' class='pln'><a href='#n516'>516</a></p> -<p id='n517' class='pln'><a href='#n517'>517</a></p> -<p id='n518' class='stm par run hide_run'><a href='#n518'>518</a></p> -<p id='n519' class='pln'><a href='#n519'>519</a></p> -<p id='n520' class='stm mis'><a href='#n520'>520</a></p> -<p id='n521' class='stm mis'><a href='#n521'>521</a></p> -<p id='n522' class='stm run hide_run'><a href='#n522'>522</a></p> -<p id='n523' class='pln'><a href='#n523'>523</a></p> -<p id='n524' class='stm run hide_run'><a href='#n524'>524</a></p> -<p id='n525' class='pln'><a href='#n525'>525</a></p> -<p id='n526' class='pln'><a href='#n526'>526</a></p> -<p id='n527' class='pln'><a href='#n527'>527</a></p> -<p id='n528' class='stm run hide_run'><a href='#n528'>528</a></p> -<p id='n529' class='stm run hide_run'><a href='#n529'>529</a></p> -<p id='n530' class='stm run hide_run'><a href='#n530'>530</a></p> -<p id='n531' class='stm run hide_run'><a href='#n531'>531</a></p> -<p id='n532' class='pln'><a href='#n532'>532</a></p> -<p id='n533' class='stm run hide_run'><a href='#n533'>533</a></p> -<p id='n534' class='pln'><a href='#n534'>534</a></p> -<p id='n535' class='pln'><a href='#n535'>535</a></p> -<p id='n536' class='stm mis'><a href='#n536'>536</a></p> -<p id='n537' class='pln'><a href='#n537'>537</a></p> -<p id='n538' class='stm mis'><a href='#n538'>538</a></p> -<p id='n539' class='pln'><a href='#n539'>539</a></p> -<p id='n540' class='stm mis'><a href='#n540'>540</a></p> -<p id='n541' class='stm mis'><a href='#n541'>541</a></p> -<p id='n542' class='stm mis'><a href='#n542'>542</a></p> -<p id='n543' class='stm mis'><a href='#n543'>543</a></p> -<p id='n544' class='pln'><a href='#n544'>544</a></p> -<p id='n545' class='pln'><a href='#n545'>545</a></p> -<p id='n546' class='stm mis'><a href='#n546'>546</a></p> -<p id='n547' class='stm mis'><a href='#n547'>547</a></p> -<p id='n548' class='stm mis'><a href='#n548'>548</a></p> -<p id='n549' class='stm mis'><a href='#n549'>549</a></p> -<p id='n550' class='pln'><a href='#n550'>550</a></p> -<p id='n551' class='stm run hide_run'><a href='#n551'>551</a></p> -<p id='n552' class='stm mis'><a href='#n552'>552</a></p> -<p id='n553' class='stm mis'><a href='#n553'>553</a></p> -<p id='n554' class='pln'><a href='#n554'>554</a></p> -<p id='n555' class='stm run hide_run'><a href='#n555'>555</a></p> -<p id='n556' class='stm mis'><a href='#n556'>556</a></p> -<p id='n557' class='stm mis'><a href='#n557'>557</a></p> -<p id='n558' class='stm mis'><a href='#n558'>558</a></p> -<p id='n559' class='pln'><a href='#n559'>559</a></p> -<p id='n560' class='stm run hide_run'><a href='#n560'>560</a></p> -<p id='n561' class='stm mis'><a href='#n561'>561</a></p> -<p id='n562' class='stm mis'><a href='#n562'>562</a></p> -<p id='n563' class='pln'><a href='#n563'>563</a></p> -<p id='n564' class='stm run hide_run'><a href='#n564'>564</a></p> -<p id='n565' class='pln'><a href='#n565'>565</a></p> -<p id='n566' class='pln'><a href='#n566'>566</a></p> -<p id='n567' class='pln'><a href='#n567'>567</a></p> -<p id='n568' class='stm mis'><a href='#n568'>568</a></p> -<p id='n569' class='pln'><a href='#n569'>569</a></p> -<p id='n570' class='stm mis'><a href='#n570'>570</a></p> -<p id='n571' class='stm mis'><a href='#n571'>571</a></p> -<p id='n572' class='pln'><a href='#n572'>572</a></p> -<p id='n573' class='pln'><a href='#n573'>573</a></p> -<p id='n574' class='stm mis'><a href='#n574'>574</a></p> -<p id='n575' class='pln'><a href='#n575'>575</a></p> -<p id='n576' class='pln'><a href='#n576'>576</a></p> -<p id='n577' class='stm mis'><a href='#n577'>577</a></p> -<p id='n578' class='stm mis'><a href='#n578'>578</a></p> -<p id='n579' class='stm mis'><a href='#n579'>579</a></p> -<p id='n580' class='pln'><a href='#n580'>580</a></p> -<p id='n581' class='pln'><a href='#n581'>581</a></p> -<p id='n582' class='stm mis'><a href='#n582'>582</a></p> -<p id='n583' class='stm mis'><a href='#n583'>583</a></p> -<p id='n584' class='pln'><a href='#n584'>584</a></p> -<p id='n585' class='stm mis'><a href='#n585'>585</a></p> -<p id='n586' class='stm mis'><a href='#n586'>586</a></p> -<p id='n587' class='stm mis'><a href='#n587'>587</a></p> -<p id='n588' class='stm mis'><a href='#n588'>588</a></p> -<p id='n589' class='stm mis'><a href='#n589'>589</a></p> -<p id='n590' class='stm mis'><a href='#n590'>590</a></p> -<p id='n591' class='stm mis'><a href='#n591'>591</a></p> -<p id='n592' class='stm mis'><a href='#n592'>592</a></p> -<p id='n593' class='stm mis'><a href='#n593'>593</a></p> -<p id='n594' class='pln'><a href='#n594'>594</a></p> -<p id='n595' class='pln'><a href='#n595'>595</a></p> -<p id='n596' class='pln'><a href='#n596'>596</a></p> -<p id='n597' class='pln'><a href='#n597'>597</a></p> -<p id='n598' class='pln'><a href='#n598'>598</a></p> -<p id='n599' class='stm mis'><a href='#n599'>599</a></p> -<p id='n600' class='stm mis'><a href='#n600'>600</a></p> -<p id='n601' class='pln'><a href='#n601'>601</a></p> -<p id='n602' class='stm mis'><a href='#n602'>602</a></p> -<p id='n603' class='pln'><a href='#n603'>603</a></p> -<p id='n604' class='stm mis'><a href='#n604'>604</a></p> -<p id='n605' class='pln'><a href='#n605'>605</a></p> -<p id='n606' class='stm run hide_run'><a href='#n606'>606</a></p> -<p id='n607' class='pln'><a href='#n607'>607</a></p> -<p id='n608' class='pln'><a href='#n608'>608</a></p> -<p id='n609' class='stm mis'><a href='#n609'>609</a></p> -<p id='n610' class='stm mis'><a href='#n610'>610</a></p> -<p id='n611' class='stm mis'><a href='#n611'>611</a></p> -<p id='n612' class='stm mis'><a href='#n612'>612</a></p> -<p id='n613' class='pln'><a href='#n613'>613</a></p> -<p id='n614' class='stm mis'><a href='#n614'>614</a></p> -<p id='n615' class='stm mis'><a href='#n615'>615</a></p> -<p id='n616' class='stm mis'><a href='#n616'>616</a></p> -<p id='n617' class='pln'><a href='#n617'>617</a></p> -<p id='n618' class='stm mis'><a href='#n618'>618</a></p> -<p id='n619' class='stm mis'><a href='#n619'>619</a></p> -<p id='n620' class='stm mis'><a href='#n620'>620</a></p> -<p id='n621' class='stm mis'><a href='#n621'>621</a></p> -<p id='n622' class='pln'><a href='#n622'>622</a></p> -<p id='n623' class='stm run hide_run'><a href='#n623'>623</a></p> -<p id='n624' class='pln'><a href='#n624'>624</a></p> -<p id='n625' class='pln'><a href='#n625'>625</a></p> -<p id='n626' class='stm mis'><a href='#n626'>626</a></p> -<p id='n627' class='stm mis'><a href='#n627'>627</a></p> -<p id='n628' class='pln'><a href='#n628'>628</a></p> -<p id='n629' class='stm mis'><a href='#n629'>629</a></p> -<p id='n630' class='stm mis'><a href='#n630'>630</a></p> -<p id='n631' class='pln'><a href='#n631'>631</a></p> -<p id='n632' class='stm mis'><a href='#n632'>632</a></p> -<p id='n633' class='stm mis'><a href='#n633'>633</a></p> -<p id='n634' class='stm mis'><a href='#n634'>634</a></p> -<p id='n635' class='stm mis'><a href='#n635'>635</a></p> -<p id='n636' class='pln'><a href='#n636'>636</a></p> -<p id='n637' class='stm mis'><a href='#n637'>637</a></p> -<p id='n638' class='pln'><a href='#n638'>638</a></p> -<p id='n639' class='stm mis'><a href='#n639'>639</a></p> -<p id='n640' class='pln'><a href='#n640'>640</a></p> -<p id='n641' class='stm run hide_run'><a href='#n641'>641</a></p> -<p id='n642' class='pln'><a href='#n642'>642</a></p> -<p id='n643' class='pln'><a href='#n643'>643</a></p> -<p id='n644' class='pln'><a href='#n644'>644</a></p> -<p id='n645' class='pln'><a href='#n645'>645</a></p> -<p id='n646' class='stm mis'><a href='#n646'>646</a></p> -<p id='n647' class='stm mis'><a href='#n647'>647</a></p> -<p id='n648' class='pln'><a href='#n648'>648</a></p> -<p id='n649' class='pln'><a href='#n649'>649</a></p> -<p id='n650' class='stm mis'><a href='#n650'>650</a></p> -<p id='n651' class='stm mis'><a href='#n651'>651</a></p> -<p id='n652' class='stm mis'><a href='#n652'>652</a></p> -<p id='n653' class='pln'><a href='#n653'>653</a></p> -<p id='n654' class='stm mis'><a href='#n654'>654</a></p> -<p id='n655' class='stm mis'><a href='#n655'>655</a></p> -<p id='n656' class='pln'><a href='#n656'>656</a></p> -<p id='n657' class='stm mis'><a href='#n657'>657</a></p> -<p id='n658' class='stm mis'><a href='#n658'>658</a></p> -<p id='n659' class='stm mis'><a href='#n659'>659</a></p> -<p id='n660' class='pln'><a href='#n660'>660</a></p> -<p id='n661' class='stm mis'><a href='#n661'>661</a></p> -<p id='n662' class='stm mis'><a href='#n662'>662</a></p> -<p id='n663' class='stm mis'><a href='#n663'>663</a></p> -<p id='n664' class='pln'><a href='#n664'>664</a></p> -<p id='n665' class='stm mis'><a href='#n665'>665</a></p> -<p id='n666' class='pln'><a href='#n666'>666</a></p> -<p id='n667' class='stm run hide_run'><a href='#n667'>667</a></p> -<p id='n668' class='pln'><a href='#n668'>668</a></p> -<p id='n669' class='pln'><a href='#n669'>669</a></p> -<p id='n670' class='pln'><a href='#n670'>670</a></p> -<p id='n671' class='stm mis'><a href='#n671'>671</a></p> -<p id='n672' class='stm mis'><a href='#n672'>672</a></p> -<p id='n673' class='stm mis'><a href='#n673'>673</a></p> -<p id='n674' class='stm mis'><a href='#n674'>674</a></p> -<p id='n675' class='stm mis'><a href='#n675'>675</a></p> -<p id='n676' class='stm mis'><a href='#n676'>676</a></p> -<p id='n677' class='stm mis'><a href='#n677'>677</a></p> -<p id='n678' class='stm mis'><a href='#n678'>678</a></p> -<p id='n679' class='stm mis'><a href='#n679'>679</a></p> -<p id='n680' class='stm mis'><a href='#n680'>680</a></p> -<p id='n681' class='stm mis'><a href='#n681'>681</a></p> -<p id='n682' class='stm mis'><a href='#n682'>682</a></p> -<p id='n683' class='stm mis'><a href='#n683'>683</a></p> -<p id='n684' class='stm mis'><a href='#n684'>684</a></p> -<p id='n685' class='stm mis'><a href='#n685'>685</a></p> -<p id='n686' class='stm mis'><a href='#n686'>686</a></p> -<p id='n687' class='pln'><a href='#n687'>687</a></p> -<p id='n688' class='pln'><a href='#n688'>688</a></p> -<p id='n689' class='pln'><a href='#n689'>689</a></p> -<p id='n690' class='pln'><a href='#n690'>690</a></p> -<p id='n691' class='pln'><a href='#n691'>691</a></p> -<p id='n692' class='pln'><a href='#n692'>692</a></p> -<p id='n693' class='pln'><a href='#n693'>693</a></p> -<p id='n694' class='pln'><a href='#n694'>694</a></p> -<p id='n695' class='pln'><a href='#n695'>695</a></p> -<p id='n696' class='pln'><a href='#n696'>696</a></p> -<p id='n697' class='pln'><a href='#n697'>697</a></p> -<p id='n698' class='pln'><a href='#n698'>698</a></p> -<p id='n699' class='pln'><a href='#n699'>699</a></p> -<p id='n700' class='pln'><a href='#n700'>700</a></p> -<p id='n701' class='pln'><a href='#n701'>701</a></p> -<p id='n702' class='pln'><a href='#n702'>702</a></p> -<p id='n703' class='pln'><a href='#n703'>703</a></p> -<p id='n704' class='pln'><a href='#n704'>704</a></p> -<p id='n705' class='pln'><a href='#n705'>705</a></p> -<p id='n706' class='pln'><a href='#n706'>706</a></p> -<p id='n707' class='pln'><a href='#n707'>707</a></p> -<p id='n708' class='pln'><a href='#n708'>708</a></p> -<p id='n709' class='pln'><a href='#n709'>709</a></p> -<p id='n710' class='pln'><a href='#n710'>710</a></p> -<p id='n711' class='pln'><a href='#n711'>711</a></p> -<p id='n712' class='pln'><a href='#n712'>712</a></p> -<p id='n713' class='pln'><a href='#n713'>713</a></p> -<p id='n714' class='pln'><a href='#n714'>714</a></p> -<p id='n715' class='pln'><a href='#n715'>715</a></p> -<p id='n716' class='pln'><a href='#n716'>716</a></p> -<p id='n717' class='pln'><a href='#n717'>717</a></p> -<p id='n718' class='pln'><a href='#n718'>718</a></p> -<p id='n719' class='pln'><a href='#n719'>719</a></p> -<p id='n720' class='pln'><a href='#n720'>720</a></p> -<p id='n721' class='pln'><a href='#n721'>721</a></p> -<p id='n722' class='pln'><a href='#n722'>722</a></p> -<p id='n723' class='pln'><a href='#n723'>723</a></p> -<p id='n724' class='pln'><a href='#n724'>724</a></p> -<p id='n725' class='pln'><a href='#n725'>725</a></p> -<p id='n726' class='pln'><a href='#n726'>726</a></p> -<p id='n727' class='pln'><a href='#n727'>727</a></p> -<p id='n728' class='pln'><a href='#n728'>728</a></p> -<p id='n729' class='pln'><a href='#n729'>729</a></p> -<p id='n730' class='pln'><a href='#n730'>730</a></p> -<p id='n731' class='pln'><a href='#n731'>731</a></p> -<p id='n732' class='pln'><a href='#n732'>732</a></p> -<p id='n733' class='pln'><a href='#n733'>733</a></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-2012, 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'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>absolute_import</span><span class='op'>,</span> <span class='nam'>print_function</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'>import</span> <span class='nam'>copy</span><span class='op'>,</span> <span class='nam'>getopt</span><span class='op'>,</span> <span class='nam'>hashlib</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'>sys</span><span class='op'>,</span> <span class='nam'>traceback</span><span class='strut'> </span></p> -<p id='t10' class='stm run hide_run'><span class='key'>from</span> <span class='op'>.</span><span class='nam'>backward</span> <span class='key'>import</span> <span class='nam'>PY3</span><span class='op'>,</span> <span class='nam'>StringIO</span><span class='op'>,</span> <span class='nam'>string_types</span><span class='op'>,</span> <span class='nam'>to_bytes</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='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='t13' class='pln'><span class='strut'> </span></p> -<p id='t14' class='stm run hide_run'><span class='nam'>__version__</span> <span class='op'>=</span> <span class='str'>'2.3'</span> <span class='com'># History at the end of the file.</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='nam'>usage</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t17' class='pln'><span class='str'>cog - generate code with inlined Python code.</span><span class='strut'> </span></p> -<p id='t18' class='pln'><span class='strut'> </span></p> -<p id='t19' class='pln'><span class='str'>cog [OPTIONS] [INFILE | @FILELIST] ...</span><span class='strut'> </span></p> -<p id='t20' class='pln'><span class='strut'> </span></p> -<p id='t21' class='pln'><span class='str'>INFILE is the name of an input file, '-' will read from stdin.</span><span class='strut'> </span></p> -<p id='t22' 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='t23' class='pln'><span class='str'> other @FILELISTs.</span><span class='strut'> </span></p> -<p id='t24' class='pln'><span class='strut'> </span></p> -<p id='t25' class='pln'><span class='str'>OPTIONS:</span><span class='strut'> </span></p> -<p id='t26' class='pln'><span class='str'> -c Checksum the output to protect it against accidental change.</span><span class='strut'> </span></p> -<p id='t27' class='pln'><span class='str'> -d Delete the generator code from the output file.</span><span class='strut'> </span></p> -<p id='t28' 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='t29' class='pln'><span class='str'> -e Warn if a file has no cog code in it.</span><span class='strut'> </span></p> -<p id='t30' 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='t31' class='pln'><span class='str'> -o OUTNAME Write the output to OUTNAME.</span><span class='strut'> </span></p> -<p id='t32' class='pln'><span class='str'> -r Replace the input file with the output.</span><span class='strut'> </span></p> -<p id='t33' class='pln'><span class='str'> -s STRING Suffix all generated output lines with STRING.</span><span class='strut'> </span></p> -<p id='t34' class='pln'><span class='str'> -U Write the output with Unix newlines (only LF line-endings).</span><span class='strut'> </span></p> -<p id='t35' 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='t36' class='pln'><span class='str'> A %s in the CMD will be filled with the filename.</span><span class='strut'> </span></p> -<p id='t37' class='pln'><span class='str'> -x Excise all the generated output without running the generators.</span><span class='strut'> </span></p> -<p id='t38' 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='t39' class='pln'><span class='str'> -v Print the version of cog and exit.</span><span class='strut'> </span></p> -<p id='t40' class='pln'><span class='str'> -h Print this help.</span><span class='strut'> </span></p> -<p id='t41' class='pln'><span class='str'>"""</span><span class='strut'> </span></p> -<p id='t42' class='pln'><span class='strut'> </span></p> -<p id='t43' class='pln'><span class='com'># Other package modules</span><span class='strut'> </span></p> -<p id='t44' class='stm run hide_run'><span class='key'>from</span> <span class='op'>.</span><span class='nam'>whiteutils</span> <span class='key'>import</span> <span class='op'>*</span><span class='strut'> </span></p> -<p id='t45' class='pln'><span class='strut'> </span></p> -<p id='t46' 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='t47' class='pln'> <span class='str'>""" Any exception raised by Cog.</span><span class='strut'> </span></p> -<p id='t48' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t49' 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='t50' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>53</span> <span class='key'>if</span> <span class='nam'>file</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t51' 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='t52' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t53' 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='t54' class='pln'><span class='strut'> </span></p> -<p id='t55' 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='t56' class='pln'> <span class='str'>""" An error in usage of command-line arguments in cog.</span><span class='strut'> </span></p> -<p id='t57' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t58' class='exc'> <span class='key'>pass</span> <span class='com'>#pragma: no cover</span><span class='strut'> </span></p> -<p id='t59' class='pln'><span class='strut'> </span></p> -<p id='t60' 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='t61' class='pln'> <span class='str'>""" An error in the coding of Cog. Should never happen.</span><span class='strut'> </span></p> -<p id='t62' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t63' class='exc'> <span class='key'>pass</span> <span class='com'>#pragma: no cover</span><span class='strut'> </span></p> -<p id='t64' class='pln'><span class='strut'> </span></p> -<p id='t65' 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='t66' class='pln'> <span class='str'>""" An error raised by a user's cog generator.</span><span class='strut'> </span></p> -<p id='t67' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t68' class='exc'> <span class='key'>pass</span> <span class='com'>#pragma: no cover</span><span class='strut'> </span></p> -<p id='t69' class='pln'><span class='strut'> </span></p> -<p id='t70' 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='t71' class='pln'> <span class='str'>""" An object with its own stdout and stderr files.</span><span class='strut'> </span></p> -<p id='t72' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t73' 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='t74' 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='t75' 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='t76' class='pln'><span class='strut'> </span></p> -<p id='t77' 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='t78' class='pln'> <span class='str'>""" Assign new files for standard out and/or standard error.</span><span class='strut'> </span></p> -<p id='t79' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t80' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>82</span> <span class='key'>if</span> <span class='nam'>stdout</span><span class='op'>:</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'>stdout</span> <span class='op'>=</span> <span class='nam'>stdout</span><span class='strut'> </span></p> -<p id='t82' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>83</span> <span class='key'>if</span> <span class='nam'>stderr</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t83' 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='t84' class='pln'><span class='strut'> </span></p> -<p id='t85' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>prout</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='nam'>end</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='t86' class='stm mis'> <span class='key'>print</span><span class='op'>(</span><span class='nam'>s</span><span class='op'>,</span> <span class='nam'>file</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'>end</span><span class='op'>=</span><span class='nam'>end</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'>prerr</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='nam'>end</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='t89' class='stm mis'> <span class='key'>print</span><span class='op'>(</span><span class='nam'>s</span><span class='op'>,</span> <span class='nam'>file</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'>end</span><span class='op'>=</span><span class='nam'>end</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t90' class='pln'><span class='strut'> </span></p> -<p id='t91' class='pln'><span class='strut'> </span></p> -<p id='t92' 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='t93' class='pln'> <span class='str'>""" A generator pulled from a source file.</span><span class='strut'> </span></p> -<p id='t94' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t95' 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='t96' 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='t97' 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='t98' 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='t99' class='pln'><span class='strut'> </span></p> -<p id='t100' 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='t101' 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='t102' class='pln'><span class='strut'> </span></p> -<p id='t103' 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='t104' 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='t105' class='pln'><span class='strut'> </span></p> -<p id='t106' 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='t107' class='pln'> <span class='str'>""" Extract the executable Python code from the generator.</span><span class='strut'> </span></p> -<p id='t108' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t109' class='pln'> <span class='com'># If the markers and lines all have the same prefix</span><span class='strut'> </span></p> -<p id='t110' class='pln'> <span class='com'># (end-of-line comment chars, for example),</span><span class='strut'> </span></p> -<p id='t111' class='pln'> <span class='com'># then remove it from all the lines.</span><span class='strut'> </span></p> -<p id='t112' 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='t113' 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='t114' 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='t115' 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='t116' class='pln'><span class='strut'> </span></p> -<p id='t117' 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='t118' class='pln'><span class='strut'> </span></p> -<p id='t119' 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='t120' class='pln'> <span class='com'># figure out the right whitespace prefix for the output</span><span class='strut'> </span></p> -<p id='t121' 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='t122' class='pln'><span class='strut'> </span></p> -<p id='t123' 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='t124' 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='t125' class='stm run hide_run'> <span class='key'>return</span> <span class='str'>''</span><span class='strut'> </span></p> -<p id='t126' class='pln'><span class='strut'> </span></p> -<p id='t127' 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='t128' 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='t129' 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='t130' class='pln'><span class='strut'> </span></p> -<p id='t131' class='pln'> <span class='com'># Make sure the "cog" module has our state.</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'>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='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'>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='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'>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='t135' 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='t136' class='pln'><span class='strut'> </span></p> -<p id='t137' 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='t138' 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='t139' class='pln'><span class='strut'> </span></p> -<p id='t140' 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='t141' class='pln'> <span class='com'># ends with a newline, or it will be joined to the</span><span class='strut'> </span></p> -<p id='t142' class='pln'> <span class='com'># end-output line, ruining cog's idempotency.</span><span class='strut'> </span></p> -<p id='t143' 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='t144' 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='t145' class='pln'><span class='strut'> </span></p> -<p id='t146' 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='t147' class='pln'><span class='strut'> </span></p> -<p id='t148' 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='t149' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>prout</span><span class='op'>(</span><span class='str'>"Message: "</span><span class='op'>+</span><span class='nam'>s</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t150' class='pln'><span class='strut'> </span></p> -<p id='t151' 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='t152' class='pln'> <span class='str'>""" The cog.out function.</span><span class='strut'> </span></p> -<p id='t153' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t154' 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='t155' 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='t156' 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='t157' 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='t158' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>160</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='t159' 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='t160' 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='t161' 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='t162' 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='t163' 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='t164' class='pln'><span class='strut'> </span></p> -<p id='t165' 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='t166' class='pln'> <span class='str'>""" The cog.outl function.</span><span class='strut'> </span></p> -<p id='t167' class='pln'><span class='str'> """</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='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='t169' 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='t170' class='pln'><span class='strut'> </span></p> -<p id='t171' 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='t172' class='pln'> <span class='str'>""" The cog.error function.</span><span class='strut'> </span></p> -<p id='t173' class='pln'><span class='str'> Instead of raising standard python errors, cog generators can use</span><span class='strut'> </span></p> -<p id='t174' class='pln'><span class='str'> this function. It will display the error without a scary Python</span><span class='strut'> </span></p> -<p id='t175' class='pln'><span class='str'> traceback.</span><span class='strut'> </span></p> -<p id='t176' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t177' 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='t178' class='pln'><span class='strut'> </span></p> -<p id='t179' class='pln'><span class='strut'> </span></p> -<p id='t180' 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='t181' class='pln'> <span class='str'>""" A decorator for files that counts the readline()'s called.</span><span class='strut'> </span></p> -<p id='t182' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t183' 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='t184' 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='t185' 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='t186' class='pln'><span class='strut'> </span></p> -<p id='t187' 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='t188' 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='t189' 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='t190' 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='t191' class='stm run hide_run'> <span class='key'>return</span> <span class='nam'>l</span><span class='strut'> </span></p> -<p id='t192' class='pln'><span class='strut'> </span></p> -<p id='t193' 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='t194' 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='t195' class='pln'><span class='strut'> </span></p> -<p id='t196' class='pln'><span class='strut'> </span></p> -<p id='t197' 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='t198' class='pln'> <span class='str'>""" Options for a run of cog.</span><span class='strut'> </span></p> -<p id='t199' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t200' 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='t201' class='pln'> <span class='com'># Defaults for argument values.</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'>args</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'>includePath</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'>defines</span> <span class='op'>=</span> <span class='op'>{</span><span class='op'>}</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'>bShowVersion</span> <span class='op'>=</span> <span class='nam'>False</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'>sMakeWritableCmd</span> <span class='op'>=</span> <span class='nam'>None</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'>bReplace</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'>bNoGenerate</span> <span class='op'>=</span> <span class='nam'>False</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'>sOutputName</span> <span class='op'>=</span> <span class='nam'>None</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'>bWarnEmpty</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'>bHashOutput</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'>bDeleteCode</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'>bEofCanBeEnd</span> <span class='op'>=</span> <span class='nam'>False</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'>sSuffix</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'> </span></p> -<p id='t215' 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='t216' class='pln'><span class='strut'> </span></p> -<p id='t217' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>__eq__</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='t218' class='pln'> <span class='str'>""" Comparison operator for tests to use.</span><span class='strut'> </span></p> -<p id='t219' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t220' 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'>other</span><span class='op'>.</span><span class='nam'>__dict__</span><span class='strut'> </span></p> -<p id='t221' class='pln'><span class='strut'> </span></p> -<p id='t222' 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='t223' class='pln'> <span class='str'>""" Make a clone of these options, for further refinement.</span><span class='strut'> </span></p> -<p id='t224' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t225' 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='t226' class='pln'><span class='strut'> </span></p> -<p id='t227' 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='t228' class='pln'> <span class='str'>""" Add directories to the include path.</span><span class='strut'> </span></p> -<p id='t229' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t230' 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='t231' 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='t232' class='pln'><span class='strut'> </span></p> -<p id='t233' 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='t234' class='pln'> <span class='com'># Parse the command line arguments.</span><span class='strut'> </span></p> -<p id='t235' class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t236' 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='t237' class='stm mis'> <span class='key'>except</span> <span class='nam'>getopt</span><span class='op'>.</span><span class='nam'>error</span> <span class='key'>as</span> <span class='nam'>msg</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t238' 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='t239' class='pln'><span class='strut'> </span></p> -<p id='t240' class='pln'> <span class='com'># Handle the command line arguments.</span><span class='strut'> </span></p> -<p id='t241' 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='t242' 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='t243' 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='t244' 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='t245' 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='t246' 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='t247' 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='t248' 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='t249' 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='t250' 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='t251' 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='t252' 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='t253' 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='t254' 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='t255' 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='t256' 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='t257' 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='t258' 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='t259' 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='t260' 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='t261' 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='t262' 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='t263' 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='t264' 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='t265' 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='t266' 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='t267' 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='t268' 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='t269' 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='t270' 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='t271' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t272' class='pln'> <span class='com'># Since getopt.getopt is given a list of possible flags,</span><span class='strut'> </span></p> -<p id='t273' class='pln'> <span class='com'># this is an internal error.</span><span class='strut'> </span></p> -<p id='t274' 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='t275' class='pln'><span class='strut'> </span></p> -<p id='t276' 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='t277' 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='t278' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t279' 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='t280' 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='t281' class='pln'><span class='strut'> </span></p> -<p id='t282' 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='t283' 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='t284' class='pln'><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='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='t287' class='pln'> <span class='str'>""" The Cog engine.</span><span class='strut'> </span></p> -<p id='t288' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t289' 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='t290' 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='t291' 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='t292' 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='t293' 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='t294' 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='t295' 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='t296' class='pln'><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'>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='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='nam'>self</span><span class='op'>.</span><span class='nam'>prout</span><span class='op'>(</span><span class='str'>"Warning: "</span><span class='op'>+</span><span class='nam'>msg</span><span class='op'>)</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'>self</span><span class='op'>.</span><span class='nam'>sBeginSpec</span> <span class='key'>in</span> <span class='nam'>s</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'>self</span><span class='op'>.</span><span class='nam'>sEndSpec</span> <span class='key'>in</span> <span class='nam'>s</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'>s</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t309' class='pln'><span class='strut'> </span></p> -<p id='t310' 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='t311' class='stm run hide_run'> <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndOutput</span> <span class='key'>in</span> <span class='nam'>s</span><span class='strut'> </span></p> -<p id='t312' class='pln'><span class='strut'> </span></p> -<p id='t313' 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='t314' class='pln'> <span class='str'>""" Magic mumbo-jumbo so that imported Python modules</span><span class='strut'> </span></p> -<p id='t315' class='pln'><span class='str'> can say "import cog" and get our state.</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 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='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'>path</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'> </span></p> -<p id='t319' 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='t320' class='pln'><span class='strut'> </span></p> -<p id='t321' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>openOutputFile</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>fname</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t322' class='pln'> <span class='str'>""" Open an output file, taking all the details into account.</span><span class='strut'> </span></p> -<p id='t323' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t324' class='stm mis'> <span class='nam'>opts</span> <span class='op'>=</span> <span class='op'>{</span><span class='op'>}</span><span class='strut'> </span></p> -<p id='t325' class='stm mis'> <span class='nam'>mode</span> <span class='op'>=</span> <span class='str'>"w"</span><span class='strut'> </span></p> -<p id='t326' class='stm mis'> <span class='key'>if</span> <span class='nam'>PY3</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t327' class='stm mis'> <span class='nam'>opts</span><span class='op'>[</span><span class='str'>'encoding'</span><span class='op'>]</span> <span class='op'>=</span> <span class='str'>"utf-8"</span><span class='strut'> </span></p> -<p id='t328' 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='t329' class='stm mis'> <span class='key'>if</span> <span class='nam'>PY3</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t330' class='stm mis'> <span class='nam'>opts</span><span class='op'>[</span><span class='str'>'newline'</span><span class='op'>]</span> <span class='op'>=</span> <span class='str'>"\n"</span><span class='strut'> </span></p> -<p id='t331' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t332' class='stm mis'> <span class='nam'>mode</span> <span class='op'>=</span> <span class='str'>"wb"</span><span class='strut'> </span></p> -<p id='t333' class='stm mis'> <span class='key'>return</span> <span class='nam'>open</span><span class='op'>(</span><span class='nam'>fname</span><span class='op'>,</span> <span class='nam'>mode</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>opts</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t334' class='pln'><span class='strut'> </span></p> -<p id='t335' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>openInputFile</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>fname</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t336' class='pln'> <span class='str'>""" Open an input file. """</span><span class='strut'> </span></p> -<p id='t337' class='stm mis'> <span class='key'>if</span> <span class='nam'>fname</span> <span class='op'>==</span> <span class='str'>"-"</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t338' class='stm mis'> <span class='key'>return</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>stdin</span><span class='strut'> </span></p> -<p id='t339' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t340' class='stm mis'> <span class='nam'>opts</span> <span class='op'>=</span> <span class='op'>{</span><span class='op'>}</span><span class='strut'> </span></p> -<p id='t341' class='stm mis'> <span class='key'>if</span> <span class='nam'>PY3</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t342' class='stm mis'> <span class='nam'>opts</span><span class='op'>[</span><span class='str'>'encoding'</span><span class='op'>]</span> <span class='op'>=</span> <span class='str'>"utf-8"</span><span class='strut'> </span></p> -<p id='t343' class='stm mis'> <span class='key'>return</span> <span class='nam'>open</span><span class='op'>(</span><span class='nam'>fname</span><span class='op'>,</span> <span class='str'>"r"</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>opts</span><span class='op'>)</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='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='t346' class='pln'> <span class='str'>""" Process an input file object to an output file object.</span><span class='strut'> </span></p> -<p id='t347' class='pln'><span class='str'> fIn and fOut can be file objects, or file names.</span><span class='strut'> </span></p> -<p id='t348' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t349' class='pln'><span class='strut'> </span></p> -<p id='t350' 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='t351' 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='t352' 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='t353' class='pln'> <span class='com'># Convert filenames to files.</span><span class='strut'> </span></p> -<p id='t354' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>356</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'>string_types</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t355' class='pln'> <span class='com'># Open the input file.</span><span class='strut'> </span></p> -<p id='t356' class='stm mis'> <span class='nam'>sFileIn</span> <span class='op'>=</span> <span class='nam'>fIn</span><span class='strut'> </span></p> -<p id='t357' class='stm mis'> <span class='nam'>fIn</span> <span class='op'>=</span> <span class='nam'>fInToClose</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>openInputFile</span><span class='op'>(</span><span class='nam'>fIn</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t358' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>360</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'>string_types</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t359' class='pln'> <span class='com'># Open the output file.</span><span class='strut'> </span></p> -<p id='t360' class='stm mis'> <span class='nam'>sFileOut</span> <span class='op'>=</span> <span class='nam'>fOut</span><span class='strut'> </span></p> -<p id='t361' class='stm mis'> <span class='nam'>fOut</span> <span class='op'>=</span> <span class='nam'>fOutToClose</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>openOutputFile</span><span class='op'>(</span><span class='nam'>fOut</span><span class='op'>)</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'>try</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t364' 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='t365' class='pln'><span class='strut'> </span></p> -<p id='t366' 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='t367' class='pln'><span class='strut'> </span></p> -<p id='t368' 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='t369' 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='t370' class='pln'><span class='strut'> </span></p> -<p id='t371' class='pln'> <span class='com'># The globals dict we'll use for this file.</span><span class='strut'> </span></p> -<p id='t372' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>376</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='t373' 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='t374' class='pln'><span class='strut'> </span></p> -<p id='t375' class='pln'> <span class='com'># If there are any global defines, put them in the globals.</span><span class='strut'> </span></p> -<p id='t376' 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='t377' class='pln'><span class='strut'> </span></p> -<p id='t378' class='pln'> <span class='com'># loop over generator chunks</span><span class='strut'> </span></p> -<p id='t379' 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='t380' 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='t381' class='pln'> <span class='com'># Find the next spec begin</span><span class='strut'> </span></p> -<p id='t382' 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='t383' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>384</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='t384' 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='t385' 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='t386' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>387</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='t387' 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='t388' 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='t389' 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='t390' 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='t391' 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='t392' class='stm run hide_run'> <span class='key'>break</span><span class='strut'> </span></p> -<p id='t393' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>397</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='t394' 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='t395' class='pln'><span class='strut'> </span></p> -<p id='t396' class='pln'> <span class='com'># l is the begin spec</span><span class='strut'> </span></p> -<p id='t397' 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='t398' 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='t399' 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='t400' 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='t401' 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='t402' class='pln'><span class='strut'> </span></p> -<p id='t403' 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='t404' class='pln'> <span class='com'># line of code inside.</span><span class='strut'> </span></p> -<p id='t405' 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='t406' class='stm run hide_run'> <span class='nam'>beg</span> <span class='op'>=</span> <span class='nam'>l</span><span class='op'>.</span><span class='nam'>find</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='t407' class='stm run hide_run'> <span class='nam'>end</span> <span class='op'>=</span> <span class='nam'>l</span><span class='op'>.</span><span class='nam'>find</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='t408' 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='t409' 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='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='key'>else</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t412' 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='t413' 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='t414' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t415' class='pln'> <span class='com'># Deal with an ordinary code block.</span><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'># Get all the lines in the spec</span><span class='strut'> </span></p> -<p id='t419' 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='t420' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>421</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='t421' 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='t422' 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='t423' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>424</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='t424' 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='t425' 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='t426' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>428</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='t427' 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='t428' 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='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 par run hide_run'><span class='annotate' title='no jump to this line number'>431</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='t431' class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='strut'> </span></p> -<p id='t432' class='pln'> <span class='str'>"Cog block begun but never ended."</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t433' 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='t434' class='pln'><span class='strut'> </span></p> -<p id='t435' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>437</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='t436' 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='t437' 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='t438' class='pln'><span class='strut'> </span></p> -<p id='t439' 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='t440' class='pln'><span class='strut'> </span></p> -<p id='t441' class='pln'> <span class='com'># Eat all the lines in the output section. While reading past</span><span class='strut'> </span></p> -<p id='t442' class='pln'> <span class='com'># them, compute the md5 hash of the old output.</span><span class='strut'> </span></p> -<p id='t443' class='stm run hide_run'> <span class='nam'>previous</span> <span class='op'>=</span> <span class='str'>""</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'>hashlib</span><span class='op'>.</span><span class='nam'>md5</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t445' 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='t446' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>447</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='t447' 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='t448' 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='t449' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>450</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='t450' 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='t451' 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='t452' class='stm run hide_run'> <span class='nam'>previous</span> <span class='op'>+=</span> <span class='nam'>l</span><span class='strut'> </span></p> -<p id='t453' 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'>to_bytes</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='t454' 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='t455' 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='t456' class='pln'><span class='strut'> </span></p> -<p id='t457' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>459</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='t458' 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='t459' 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='t460' 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='t461' class='pln'><span class='strut'> </span></p> -<p id='t462' class='pln'> <span class='com'># Make the previous output available to the current code</span><span class='strut'> </span></p> -<p id='t463' 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'>previous</span> <span class='op'>=</span> <span class='nam'>previous</span><span class='strut'> </span></p> -<p id='t464' class='pln'><span class='strut'> </span></p> -<p id='t465' 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='t466' class='pln'> <span class='com'># supposed to generate code.</span><span class='strut'> </span></p> -<p id='t467' class='stm run hide_run'> <span class='nam'>hasher</span> <span class='op'>=</span> <span class='nam'>hashlib</span><span class='op'>.</span><span class='nam'>md5</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t468' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>474</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='t469' 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='t470' 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='t471' 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='t472' 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'>to_bytes</span><span class='op'>(</span><span class='nam'>sGen</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t473' 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='t474' 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='t475' class='pln'><span class='strut'> </span></p> -<p id='t476' 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='t477' class='pln'><span class='strut'> </span></p> -<p id='t478' class='pln'> <span class='com'># Write the ending output line</span><span class='strut'> </span></p> -<p id='t479' 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='t480' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>481</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='t481' class='stm mis'> <span class='key'>if</span> <span class='nam'>hashMatch</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t482' 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='t483' 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='t484' 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='t485' 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='t486' class='pln'> <span class='com'># Create a new end line with the correct hash.</span><span class='strut'> </span></p> -<p id='t487' 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='t488' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t489' class='pln'> <span class='com'># There was no old hash, but we want a new hash.</span><span class='strut'> </span></p> -<p id='t490' 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='t491' 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='t492' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t493' 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='t494' class='pln'> <span class='com'># it.</span><span class='strut'> </span></p> -<p id='t495' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>496</span> <span class='key'>if</span> <span class='nam'>hashMatch</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t496' 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='t497' class='pln'><span class='strut'> </span></p> -<p id='t498' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>500</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='t499' 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='t500' 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='t501' class='pln'><span class='strut'> </span></p> -<p id='t502' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>503</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='t503' 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='t504' class='pln'> <span class='key'>finally</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t505' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>506</span> <span class='key'>if</span> <span class='nam'>fInToClose</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t506' 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='t507' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>508</span> <span class='key'>if</span> <span class='nam'>fOutToClose</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t508' 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='t509' class='pln'><span class='strut'> </span></p> -<p id='t510' class='pln'><span class='strut'> </span></p> -<p id='t511' class='pln'> <span class='com'># A regex for non-empty lines, used by suffixLines.</span><span class='strut'> </span></p> -<p id='t512' 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='t513' class='pln'><span class='strut'> </span></p> -<p id='t514' 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='t515' 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='t516' class='pln'><span class='str'> text is many lines, as a single string.</span><span class='strut'> </span></p> -<p id='t517' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t518' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>520</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='t519' 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='t520' 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='t521' 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='t522' class='stm run hide_run'> <span class='key'>return</span> <span class='nam'>text</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'>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='t525' class='pln'> <span class='str'>""" Process sInput as the text to cog.</span><span class='strut'> </span></p> -<p id='t526' class='pln'><span class='str'> Return the cogged output as a string.</span><span class='strut'> </span></p> -<p id='t527' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t528' 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='t529' 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='t530' 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='t531' 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='t532' class='pln'><span class='strut'> </span></p> -<p id='t533' 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='t534' class='pln'> <span class='str'>""" Replace file sOldPath with the contents sNewText</span><span class='strut'> </span></p> -<p id='t535' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t536' 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='t537' class='pln'> <span class='com'># Need to ensure we can write.</span><span class='strut'> </span></p> -<p id='t538' 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='t539' class='pln'> <span class='com'># Use an external command to make the file writable.</span><span class='strut'> </span></p> -<p id='t540' 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='t541' 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='t542' 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='t543' 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='t544' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t545' class='pln'> <span class='com'># Can't write!</span><span class='strut'> </span></p> -<p id='t546' 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='t547' class='stm mis'> <span class='nam'>f</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>openOutputFile</span><span class='op'>(</span><span class='nam'>sOldPath</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t548' 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='t549' 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='t550' class='pln'><span class='strut'> </span></p> -<p id='t551' 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='t552' 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='t553' 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='t554' class='pln'><span class='strut'> </span></p> -<p id='t555' 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='t556' 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='t557' 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='t558' 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='t559' class='pln'><span class='strut'> </span></p> -<p id='t560' 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='t561' 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='t562' 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='t563' class='pln'><span class='strut'> </span></p> -<p id='t564' 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='t565' class='pln'> <span class='str'>""" Process one filename through cog.</span><span class='strut'> </span></p> -<p id='t566' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t567' class='pln'><span class='strut'> </span></p> -<p id='t568' 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='t569' class='pln'><span class='strut'> </span></p> -<p id='t570' class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t571' 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='t572' class='pln'> <span class='com'># Since we know where the input file came from,</span><span class='strut'> </span></p> -<p id='t573' class='pln'> <span class='com'># push its directory onto the include path.</span><span class='strut'> </span></p> -<p id='t574' 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='t575' class='pln'><span class='strut'> </span></p> -<p id='t576' 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='t577' 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='t578' 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='t579' 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='t580' class='pln'> <span class='com'># We want to replace the cog file with the output,</span><span class='strut'> </span></p> -<p id='t581' class='pln'> <span class='com'># but only if they differ.</span><span class='strut'> </span></p> -<p id='t582' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>prout</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='nam'>end</span><span class='op'>=</span><span class='str'>""</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t583' class='stm mis'> <span class='nam'>bNeedNewline</span> <span class='op'>=</span> <span class='nam'>True</span><span class='strut'> </span></p> -<p id='t584' class='pln'><span class='strut'> </span></p> -<p id='t585' class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t586' class='stm mis'> <span class='nam'>fOldFile</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>openInputFile</span><span class='op'>(</span><span class='nam'>sFile</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t587' 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='t588' 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='t589' 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='t590' 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='t591' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>prout</span><span class='op'>(</span><span class='str'>" (changed)"</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t592' class='stm mis'> <span class='nam'>bNeedNewline</span> <span class='op'>=</span> <span class='nam'>False</span><span class='strut'> </span></p> -<p id='t593' 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='t594' class='pln'> <span class='key'>finally</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t595' 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='t596' class='pln'> <span class='com'># with the name of the file, and print (changed) on the</span><span class='strut'> </span></p> -<p id='t597' class='pln'> <span class='com'># same line, but also make sure to break the line before</span><span class='strut'> </span></p> -<p id='t598' class='pln'> <span class='com'># any traceback.</span><span class='strut'> </span></p> -<p id='t599' class='stm mis'> <span class='key'>if</span> <span class='nam'>bNeedNewline</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t600' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>prout</span><span class='op'>(</span><span class='str'>""</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t601' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t602' 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='t603' class='pln'> <span class='key'>finally</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t604' 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='t605' class='pln'><span class='strut'> </span></p> -<p id='t606' 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='t607' class='pln'> <span class='str'>""" Process the files in a file list.</span><span class='strut'> </span></p> -<p id='t608' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t609' class='stm mis'> <span class='nam'>flist</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>openInputFile</span><span class='op'>(</span><span class='nam'>sFileList</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t610' 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='t611' 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='t612' 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='t613' class='pln'> <span class='com'># Use shlex to parse the line like a shell.</span><span class='strut'> </span></p> -<p id='t614' 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='t615' 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='t616' 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='t617' class='pln'> <span class='com'># No escapes, so that backslash can be part of the path</span><span class='strut'> </span></p> -<p id='t618' 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='t619' 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='t620' class='stm mis'> <span class='key'>if</span> <span class='nam'>args</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t621' 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='t622' class='pln'><span class='strut'> </span></p> -<p id='t623' 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='t624' class='pln'> <span class='str'>""" Process one command-line.</span><span class='strut'> </span></p> -<p id='t625' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t626' 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='t627' 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='t628' class='pln'><span class='strut'> </span></p> -<p id='t629' 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='t630' 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='t631' class='pln'><span class='strut'> </span></p> -<p id='t632' 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='t633' 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='t634' 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='t635' 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='t636' class='pln'> <span class='key'>else</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'>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='t638' class='pln'><span class='strut'> </span></p> -<p id='t639' 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='t640' class='pln'><span class='strut'> </span></p> -<p id='t641' 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='t642' class='pln'> <span class='str'>""" All of command-line cog, but in a callable form.</span><span class='strut'> </span></p> -<p id='t643' class='pln'><span class='str'> This is used by main.</span><span class='strut'> </span></p> -<p id='t644' class='pln'><span class='str'> argv is the equivalent of sys.argv.</span><span class='strut'> </span></p> -<p id='t645' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t646' class='stm mis'> <span class='nam'>argv</span> <span class='op'>=</span> <span class='nam'>argv</span><span class='op'>[</span><span class='op'>:</span><span class='op'>]</span><span class='strut'> </span></p> -<p id='t647' 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='t648' class='pln'><span class='strut'> </span></p> -<p id='t649' class='pln'> <span class='com'># Provide help if asked for anywhere in the command line.</span><span class='strut'> </span></p> -<p id='t650' 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='t651' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>prerr</span><span class='op'>(</span><span class='nam'>usage</span><span class='op'>,</span> <span class='nam'>end</span><span class='op'>=</span><span class='str'>""</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t652' class='stm mis'> <span class='key'>return</span><span class='strut'> </span></p> -<p id='t653' class='pln'><span class='strut'> </span></p> -<p id='t654' 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='t655' 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='t656' class='pln'><span class='strut'> </span></p> -<p id='t657' 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='t658' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>prout</span><span class='op'>(</span><span class='str'>"Cog version %s"</span> <span class='op'>%</span> <span class='nam'>__version__</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t659' class='stm mis'> <span class='key'>return</span><span class='strut'> </span></p> -<p id='t660' class='pln'><span class='strut'> </span></p> -<p id='t661' 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='t662' 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='t663' 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='t664' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t665' 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='t666' class='pln'><span class='strut'> </span></p> -<p id='t667' 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='t668' class='pln'> <span class='str'>""" Handle the command-line execution for cog.</span><span class='strut'> </span></p> -<p id='t669' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t670' class='pln'><span class='strut'> </span></p> -<p id='t671' class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t672' 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='t673' class='stm mis'> <span class='key'>return</span> <span class='num'>0</span><span class='strut'> </span></p> -<p id='t674' class='stm mis'> <span class='key'>except</span> <span class='nam'>CogUsageError</span> <span class='key'>as</span> <span class='nam'>err</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'>prerr</span><span class='op'>(</span><span class='nam'>err</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'>prerr</span><span class='op'>(</span><span class='str'>"(for help use -?)"</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t677' class='stm mis'> <span class='key'>return</span> <span class='num'>2</span><span class='strut'> </span></p> -<p id='t678' class='stm mis'> <span class='key'>except</span> <span class='nam'>CogGeneratedError</span> <span class='key'>as</span> <span class='nam'>err</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'>prerr</span><span class='op'>(</span><span class='str'>"Error: %s"</span> <span class='op'>%</span> <span class='nam'>err</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t680' class='stm mis'> <span class='key'>return</span> <span class='num'>3</span><span class='strut'> </span></p> -<p id='t681' class='stm mis'> <span class='key'>except</span> <span class='nam'>CogError</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t682' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>prerr</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t683' class='stm mis'> <span class='key'>return</span> <span class='num'>1</span><span class='strut'> </span></p> -<p id='t684' class='stm mis'> <span class='key'>except</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t685' 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='t686' class='stm mis'> <span class='key'>return</span> <span class='num'>1</span><span class='strut'> </span></p> -<p id='t687' class='pln'><span class='strut'> </span></p> -<p id='t688' class='pln'><span class='com'># History:</span><span class='strut'> </span></p> -<p id='t689' class='pln'><span class='com'># 20040210: First public version.</span><span class='strut'> </span></p> -<p id='t690' 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='t691' class='pln'><span class='com'># -v option on the command line shows the version.</span><span class='strut'> </span></p> -<p id='t692' 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='t693' class='pln'><span class='com'># 20040605: Fixed some blank line handling in cog.</span><span class='strut'> </span></p> -<p id='t694' class='pln'><span class='com'># Fixed problems with assigning to xml elements in handyxml.</span><span class='strut'> </span></p> -<p id='t695' class='pln'><span class='com'># 20040621: Changed all line-ends to LF from CRLF.</span><span class='strut'> </span></p> -<p id='t696' class='pln'><span class='com'># 20041002: Refactor some option handling to simplify unittesting the options.</span><span class='strut'> </span></p> -<p id='t697' class='pln'><span class='com'># 20041118: cog.out and cog.outl have optional string arguments.</span><span class='strut'> </span></p> -<p id='t698' 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='t699' 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='t700' 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='t701' 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='t702' class='pln'><span class='com'># the same line.</span><span class='strut'> </span></p> -<p id='t703' 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='t704' class='pln'><span class='com'># file so they can share state.</span><span class='strut'> </span></p> -<p id='t705' class='pln'><span class='com'># 20050206: Added the -x switch to remove all generated output.</span><span class='strut'> </span></p> -<p id='t706' class='pln'><span class='com'># 20050218: Now code can be on the marker lines as well.</span><span class='strut'> </span></p> -<p id='t707' 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='t708' class='pln'><span class='com'># detected before they are obliterated.</span><span class='strut'> </span></p> -<p id='t709' class='pln'><span class='com'># 20050521: Added cog.error, contributed by Alexander Belchenko.</span><span class='strut'> </span></p> -<p id='t710' class='pln'><span class='com'># 20050720: Added code deletion and settable globals contributed by Blake Winton.</span><span class='strut'> </span></p> -<p id='t711' class='pln'><span class='com'># 20050724: Many tweaks to improve code coverage.</span><span class='strut'> </span></p> -<p id='t712' class='pln'><span class='com'># 20050726: Error messages are now printed with no traceback.</span><span class='strut'> </span></p> -<p id='t713' class='pln'><span class='com'># Code can no longer appear on the marker lines,</span><span class='strut'> </span></p> -<p id='t714' class='pln'><span class='com'># except for single-line style.</span><span class='strut'> </span></p> -<p id='t715' 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='t716' class='pln'><span class='com'># at the end of the file.</span><span class='strut'> </span></p> -<p id='t717' class='pln'><span class='com'># 20050729: Refactor option parsing into a separate class, in preparation for</span><span class='strut'> </span></p> -<p id='t718' class='pln'><span class='com'># future features.</span><span class='strut'> </span></p> -<p id='t719' class='pln'><span class='com'># 20050805: The cogmodule.path wasn't being properly maintained.</span><span class='strut'> </span></p> -<p id='t720' class='pln'><span class='com'># 20050808: Added the -D option to define a global value.</span><span class='strut'> </span></p> -<p id='t721' 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='t722' class='pln'><span class='com'># Added the -s option to suffix output lines with a marker.</span><span class='strut'> </span></p> -<p id='t723' 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='t724' class='pln'><span class='com'># behavior for that line.</span><span class='strut'> </span></p> -<p id='t725' class='pln'><span class='com'># 20051006: Version 2.0</span><span class='strut'> </span></p> -<p id='t726' class='pln'><span class='com'># 20080521: -U options lets you create Unix newlines on Windows. Thanks,</span><span class='strut'> </span></p> -<p id='t727' class='pln'><span class='com'># Alexander Belchenko.</span><span class='strut'> </span></p> -<p id='t728' 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='t729' class='pln'><span class='com'># the args after each line of an @file.</span><span class='strut'> </span></p> -<p id='t730' class='pln'><span class='com'># 20090520: Use hashlib where it's available, to avoid a warning.</span><span class='strut'> </span></p> -<p id='t731' class='pln'><span class='com'># Use the builtin compile() instead of compiler, for Jython.</span><span class='strut'> </span></p> -<p id='t732' class='pln'><span class='com'># Explicitly close files we opened, Jython likes this.</span><span class='strut'> </span></p> -<p id='t733' class='pln'><span class='com'># 20120205: Port to Python 3. Lowest supported version is 2.6.</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.7.1</a> - </p> - </div> -</div> - -</body> -</html> diff --git a/doc/sample_html/cogapp_cogapp_py.html b/doc/sample_html/cogapp_cogapp_py.html new file mode 100644 index 00000000..26c6df75 --- /dev/null +++ b/doc/sample_html/cogapp_cogapp_py.html @@ -0,0 +1,1641 @@ + + + +<!DOCTYPE html> +<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 cogapp/cogapp.py: 47.88%</title> + <link rel="stylesheet" href="style.css" type="text/css"> + + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> + jQuery(document).ready(coverage.pyfile_ready); + </script> +</head> +<body class="pyfile"> + +<div id="header"> + <div class="content"> + <h1>Coverage for <b>cogapp/cogapp.py</b> : + <span class="pc_cov">47.88%</span> + </h1> + + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> + + <h2 class="stats"> + 423 statements + <span class="run hide_run shortkey_r button_toggle_run">229 run</span> + <span class="mis shortkey_m button_toggle_mis">194 missing</span> + <span class="exc shortkey_x button_toggle_exc">4 excluded</span> + + + <span class="par run hide_run shortkey_p button_toggle_par">26 partial</span> + + </h2> + </div> +</div> + +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> + <div> +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays + </p> +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk + </p> +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page + </p> +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk + </p> + </div> +</div> + +<div id="source"> + <table> + <tr> + <td class="linenos"> +<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="pln"><a href="#n4">4</a></p> +<p id="n5" class="pln"><a href="#n5">5</a></p> +<p id="n6" class="pln"><a href="#n6">6</a></p> +<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p> +<p id="n8" class="pln"><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> +<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 run hide_run"><a href="#n14">14</a></p> +<p id="n15" class="pln"><a href="#n15">15</a></p> +<p id="n16" class="stm run hide_run"><a href="#n16">16</a></p> +<p id="n17" class="pln"><a href="#n17">17</a></p> +<p id="n18" class="pln"><a href="#n18">18</a></p> +<p id="n19" class="pln"><a href="#n19">19</a></p> +<p id="n20" class="pln"><a href="#n20">20</a></p> +<p id="n21" class="pln"><a href="#n21">21</a></p> +<p id="n22" class="pln"><a href="#n22">22</a></p> +<p id="n23" class="pln"><a href="#n23">23</a></p> +<p id="n24" class="pln"><a href="#n24">24</a></p> +<p id="n25" class="pln"><a href="#n25">25</a></p> +<p id="n26" class="pln"><a href="#n26">26</a></p> +<p id="n27" class="pln"><a href="#n27">27</a></p> +<p id="n28" class="pln"><a href="#n28">28</a></p> +<p id="n29" class="pln"><a href="#n29">29</a></p> +<p id="n30" class="pln"><a href="#n30">30</a></p> +<p id="n31" class="pln"><a href="#n31">31</a></p> +<p id="n32" class="pln"><a href="#n32">32</a></p> +<p id="n33" class="pln"><a href="#n33">33</a></p> +<p id="n34" class="pln"><a href="#n34">34</a></p> +<p id="n35" class="pln"><a href="#n35">35</a></p> +<p id="n36" class="pln"><a href="#n36">36</a></p> +<p id="n37" class="pln"><a href="#n37">37</a></p> +<p id="n38" class="pln"><a href="#n38">38</a></p> +<p id="n39" class="pln"><a href="#n39">39</a></p> +<p id="n40" class="pln"><a href="#n40">40</a></p> +<p id="n41" class="pln"><a href="#n41">41</a></p> +<p id="n42" class="pln"><a href="#n42">42</a></p> +<p id="n43" class="pln"><a href="#n43">43</a></p> +<p id="n44" class="pln"><a href="#n44">44</a></p> +<p id="n45" class="pln"><a href="#n45">45</a></p> +<p id="n46" class="pln"><a href="#n46">46</a></p> +<p id="n47" class="pln"><a href="#n47">47</a></p> +<p id="n48" class="pln"><a href="#n48">48</a></p> +<p id="n49" class="pln"><a href="#n49">49</a></p> +<p id="n50" class="pln"><a href="#n50">50</a></p> +<p id="n51" class="pln"><a href="#n51">51</a></p> +<p id="n52" class="stm run hide_run"><a href="#n52">52</a></p> +<p id="n53" class="pln"><a href="#n53">53</a></p> +<p id="n54" class="stm run hide_run"><a href="#n54">54</a></p> +<p id="n55" class="pln"><a href="#n55">55</a></p> +<p id="n56" class="pln"><a href="#n56">56</a></p> +<p id="n57" class="stm run hide_run"><a href="#n57">57</a></p> +<p id="n58" class="stm par run hide_run"><a href="#n58">58</a></p> +<p id="n59" class="stm run hide_run"><a href="#n59">59</a></p> +<p id="n60" class="pln"><a href="#n60">60</a></p> +<p id="n61" class="stm mis"><a href="#n61">61</a></p> +<p id="n62" class="pln"><a href="#n62">62</a></p> +<p id="n63" class="stm run hide_run"><a href="#n63">63</a></p> +<p id="n64" class="pln"><a href="#n64">64</a></p> +<p id="n65" class="pln"><a href="#n65">65</a></p> +<p id="n66" class="exc"><a href="#n66">66</a></p> +<p id="n67" class="pln"><a href="#n67">67</a></p> +<p id="n68" class="stm run hide_run"><a href="#n68">68</a></p> +<p id="n69" class="pln"><a href="#n69">69</a></p> +<p id="n70" class="pln"><a href="#n70">70</a></p> +<p id="n71" class="exc"><a href="#n71">71</a></p> +<p id="n72" class="pln"><a href="#n72">72</a></p> +<p id="n73" class="stm run hide_run"><a href="#n73">73</a></p> +<p id="n74" class="pln"><a href="#n74">74</a></p> +<p id="n75" class="pln"><a href="#n75">75</a></p> +<p id="n76" class="exc"><a href="#n76">76</a></p> +<p id="n77" class="pln"><a href="#n77">77</a></p> +<p id="n78" class="stm run hide_run"><a href="#n78">78</a></p> +<p id="n79" class="pln"><a href="#n79">79</a></p> +<p id="n80" class="pln"><a href="#n80">80</a></p> +<p id="n81" class="stm run hide_run"><a href="#n81">81</a></p> +<p id="n82" class="stm run hide_run"><a href="#n82">82</a></p> +<p id="n83" class="stm run hide_run"><a href="#n83">83</a></p> +<p id="n84" class="pln"><a href="#n84">84</a></p> +<p id="n85" class="stm run hide_run"><a href="#n85">85</a></p> +<p id="n86" class="pln"><a href="#n86">86</a></p> +<p id="n87" class="pln"><a href="#n87">87</a></p> +<p id="n88" class="stm par run hide_run"><a href="#n88">88</a></p> +<p id="n89" class="stm run hide_run"><a href="#n89">89</a></p> +<p id="n90" class="stm par run hide_run"><a href="#n90">90</a></p> +<p id="n91" class="stm mis"><a href="#n91">91</a></p> +<p id="n92" class="pln"><a href="#n92">92</a></p> +<p id="n93" class="stm run hide_run"><a href="#n93">93</a></p> +<p id="n94" class="stm mis"><a href="#n94">94</a></p> +<p id="n95" class="pln"><a href="#n95">95</a></p> +<p id="n96" class="stm run hide_run"><a href="#n96">96</a></p> +<p id="n97" class="stm mis"><a href="#n97">97</a></p> +<p id="n98" class="pln"><a href="#n98">98</a></p> +<p id="n99" class="pln"><a href="#n99">99</a></p> +<p id="n100" class="stm run hide_run"><a href="#n100">100</a></p> +<p id="n101" class="pln"><a href="#n101">101</a></p> +<p id="n102" class="pln"><a href="#n102">102</a></p> +<p id="n103" class="stm run hide_run"><a href="#n103">103</a></p> +<p id="n104" class="stm run hide_run"><a href="#n104">104</a></p> +<p id="n105" class="stm run hide_run"><a href="#n105">105</a></p> +<p id="n106" class="stm run hide_run"><a href="#n106">106</a></p> +<p id="n107" class="pln"><a href="#n107">107</a></p> +<p id="n108" class="stm run hide_run"><a href="#n108">108</a></p> +<p id="n109" class="stm run hide_run"><a href="#n109">109</a></p> +<p id="n110" class="pln"><a href="#n110">110</a></p> +<p id="n111" class="stm run hide_run"><a href="#n111">111</a></p> +<p id="n112" class="stm run hide_run"><a href="#n112">112</a></p> +<p id="n113" class="pln"><a href="#n113">113</a></p> +<p id="n114" class="stm run hide_run"><a href="#n114">114</a></p> +<p id="n115" class="pln"><a href="#n115">115</a></p> +<p id="n116" class="pln"><a href="#n116">116</a></p> +<p id="n117" class="pln"><a href="#n117">117</a></p> +<p id="n118" class="pln"><a href="#n118">118</a></p> +<p id="n119" class="pln"><a href="#n119">119</a></p> +<p id="n120" class="stm run hide_run"><a href="#n120">120</a></p> +<p id="n121" class="stm run hide_run"><a href="#n121">121</a></p> +<p id="n122" class="stm run hide_run"><a href="#n122">122</a></p> +<p id="n123" class="stm run hide_run"><a href="#n123">123</a></p> +<p id="n124" class="pln"><a href="#n124">124</a></p> +<p id="n125" class="stm run hide_run"><a href="#n125">125</a></p> +<p id="n126" class="pln"><a href="#n126">126</a></p> +<p id="n127" class="stm run hide_run"><a href="#n127">127</a></p> +<p id="n128" class="pln"><a href="#n128">128</a></p> +<p id="n129" class="stm run hide_run"><a href="#n129">129</a></p> +<p id="n130" class="pln"><a href="#n130">130</a></p> +<p id="n131" class="stm run hide_run"><a href="#n131">131</a></p> +<p id="n132" class="stm run hide_run"><a href="#n132">132</a></p> +<p id="n133" class="stm run hide_run"><a href="#n133">133</a></p> +<p id="n134" class="pln"><a href="#n134">134</a></p> +<p id="n135" class="pln"><a href="#n135">135</a></p> +<p id="n136" class="stm run hide_run"><a href="#n136">136</a></p> +<p id="n137" class="stm run hide_run"><a href="#n137">137</a></p> +<p id="n138" class="pln"><a href="#n138">138</a></p> +<p id="n139" class="pln"><a href="#n139">139</a></p> +<p id="n140" class="stm run hide_run"><a href="#n140">140</a></p> +<p id="n141" class="stm run hide_run"><a href="#n141">141</a></p> +<p id="n142" class="stm run hide_run"><a href="#n142">142</a></p> +<p id="n143" class="stm run hide_run"><a href="#n143">143</a></p> +<p id="n144" class="pln"><a href="#n144">144</a></p> +<p id="n145" class="stm run hide_run"><a href="#n145">145</a></p> +<p id="n146" class="stm run hide_run"><a href="#n146">146</a></p> +<p id="n147" class="pln"><a href="#n147">147</a></p> +<p id="n148" class="pln"><a href="#n148">148</a></p> +<p id="n149" class="pln"><a href="#n149">149</a></p> +<p id="n150" class="pln"><a href="#n150">150</a></p> +<p id="n151" class="stm run hide_run"><a href="#n151">151</a></p> +<p id="n152" class="stm run hide_run"><a href="#n152">152</a></p> +<p id="n153" class="pln"><a href="#n153">153</a></p> +<p id="n154" class="stm run hide_run"><a href="#n154">154</a></p> +<p id="n155" class="pln"><a href="#n155">155</a></p> +<p id="n156" class="stm run hide_run"><a href="#n156">156</a></p> +<p id="n157" class="stm mis"><a href="#n157">157</a></p> +<p id="n158" class="pln"><a href="#n158">158</a></p> +<p id="n159" class="stm run hide_run"><a href="#n159">159</a></p> +<p id="n160" class="pln"><a href="#n160">160</a></p> +<p id="n161" class="pln"><a href="#n161">161</a></p> +<p id="n162" class="stm run hide_run"><a href="#n162">162</a></p> +<p id="n163" class="stm run hide_run"><a href="#n163">163</a></p> +<p id="n164" class="stm run hide_run"><a href="#n164">164</a></p> +<p id="n165" class="stm run hide_run"><a href="#n165">165</a></p> +<p id="n166" class="stm par run hide_run"><a href="#n166">166</a></p> +<p id="n167" class="stm run hide_run"><a href="#n167">167</a></p> +<p id="n168" class="stm run hide_run"><a href="#n168">168</a></p> +<p id="n169" class="stm run hide_run"><a href="#n169">169</a></p> +<p id="n170" class="stm run hide_run"><a href="#n170">170</a></p> +<p id="n171" class="stm run hide_run"><a href="#n171">171</a></p> +<p id="n172" class="pln"><a href="#n172">172</a></p> +<p id="n173" class="stm run hide_run"><a href="#n173">173</a></p> +<p id="n174" class="pln"><a href="#n174">174</a></p> +<p id="n175" class="pln"><a href="#n175">175</a></p> +<p id="n176" class="stm run hide_run"><a href="#n176">176</a></p> +<p id="n177" class="stm run hide_run"><a href="#n177">177</a></p> +<p id="n178" class="pln"><a href="#n178">178</a></p> +<p id="n179" class="stm run hide_run"><a href="#n179">179</a></p> +<p id="n180" class="pln"><a href="#n180">180</a></p> +<p id="n181" class="pln"><a href="#n181">181</a></p> +<p id="n182" class="pln"><a href="#n182">182</a></p> +<p id="n183" class="pln"><a href="#n183">183</a></p> +<p id="n184" class="pln"><a href="#n184">184</a></p> +<p id="n185" class="stm mis"><a href="#n185">185</a></p> +<p id="n186" class="pln"><a href="#n186">186</a></p> +<p id="n187" class="pln"><a href="#n187">187</a></p> +<p id="n188" class="stm run hide_run"><a href="#n188">188</a></p> +<p id="n189" class="pln"><a href="#n189">189</a></p> +<p id="n190" class="pln"><a href="#n190">190</a></p> +<p id="n191" class="stm run hide_run"><a href="#n191">191</a></p> +<p id="n192" class="stm run hide_run"><a href="#n192">192</a></p> +<p id="n193" class="stm run hide_run"><a href="#n193">193</a></p> +<p id="n194" class="pln"><a href="#n194">194</a></p> +<p id="n195" class="stm run hide_run"><a href="#n195">195</a></p> +<p id="n196" class="stm run hide_run"><a href="#n196">196</a></p> +<p id="n197" class="stm run hide_run"><a href="#n197">197</a></p> +<p id="n198" class="stm run hide_run"><a href="#n198">198</a></p> +<p id="n199" class="stm run hide_run"><a href="#n199">199</a></p> +<p id="n200" class="pln"><a href="#n200">200</a></p> +<p id="n201" class="stm run hide_run"><a href="#n201">201</a></p> +<p id="n202" class="stm run hide_run"><a href="#n202">202</a></p> +<p id="n203" class="pln"><a href="#n203">203</a></p> +<p id="n204" class="pln"><a href="#n204">204</a></p> +<p id="n205" class="stm run hide_run"><a href="#n205">205</a></p> +<p id="n206" class="pln"><a href="#n206">206</a></p> +<p id="n207" class="pln"><a href="#n207">207</a></p> +<p id="n208" class="stm run hide_run"><a href="#n208">208</a></p> +<p id="n209" class="pln"><a href="#n209">209</a></p> +<p id="n210" class="stm run hide_run"><a href="#n210">210</a></p> +<p id="n211" class="stm run hide_run"><a href="#n211">211</a></p> +<p id="n212" class="stm run hide_run"><a href="#n212">212</a></p> +<p id="n213" class="stm run hide_run"><a href="#n213">213</a></p> +<p id="n214" class="stm run hide_run"><a href="#n214">214</a></p> +<p id="n215" class="stm run hide_run"><a href="#n215">215</a></p> +<p id="n216" class="stm run hide_run"><a href="#n216">216</a></p> +<p id="n217" class="stm run hide_run"><a href="#n217">217</a></p> +<p id="n218" class="stm run hide_run"><a href="#n218">218</a></p> +<p id="n219" class="stm run hide_run"><a href="#n219">219</a></p> +<p id="n220" class="stm run hide_run"><a href="#n220">220</a></p> +<p id="n221" class="stm run hide_run"><a href="#n221">221</a></p> +<p id="n222" class="stm run hide_run"><a href="#n222">222</a></p> +<p id="n223" class="stm run hide_run"><a href="#n223">223</a></p> +<p id="n224" class="stm run hide_run"><a href="#n224">224</a></p> +<p id="n225" class="stm run hide_run"><a href="#n225">225</a></p> +<p id="n226" class="stm run hide_run"><a href="#n226">226</a></p> +<p id="n227" class="stm run hide_run"><a href="#n227">227</a></p> +<p id="n228" class="stm run hide_run"><a href="#n228">228</a></p> +<p id="n229" class="pln"><a href="#n229">229</a></p> +<p id="n230" class="stm run hide_run"><a href="#n230">230</a></p> +<p id="n231" class="pln"><a href="#n231">231</a></p> +<p id="n232" class="pln"><a href="#n232">232</a></p> +<p id="n233" class="stm mis"><a href="#n233">233</a></p> +<p id="n234" class="pln"><a href="#n234">234</a></p> +<p id="n235" class="stm run hide_run"><a href="#n235">235</a></p> +<p id="n236" class="pln"><a href="#n236">236</a></p> +<p id="n237" class="pln"><a href="#n237">237</a></p> +<p id="n238" class="stm mis"><a href="#n238">238</a></p> +<p id="n239" class="pln"><a href="#n239">239</a></p> +<p id="n240" class="stm run hide_run"><a href="#n240">240</a></p> +<p id="n241" class="pln"><a href="#n241">241</a></p> +<p id="n242" class="pln"><a href="#n242">242</a></p> +<p id="n243" class="stm mis"><a href="#n243">243</a></p> +<p id="n244" class="stm mis"><a href="#n244">244</a></p> +<p id="n245" class="pln"><a href="#n245">245</a></p> +<p id="n246" class="stm run hide_run"><a href="#n246">246</a></p> +<p id="n247" class="pln"><a href="#n247">247</a></p> +<p id="n248" class="stm mis"><a href="#n248">248</a></p> +<p id="n249" class="stm mis"><a href="#n249">249</a></p> +<p id="n250" class="pln"><a href="#n250">250</a></p> +<p id="n251" class="pln"><a href="#n251">251</a></p> +<p id="n252" class="pln"><a href="#n252">252</a></p> +<p id="n253" class="pln"><a href="#n253">253</a></p> +<p id="n254" class="pln"><a href="#n254">254</a></p> +<p id="n255" class="pln"><a href="#n255">255</a></p> +<p id="n256" class="pln"><a href="#n256">256</a></p> +<p id="n257" class="stm mis"><a href="#n257">257</a></p> +<p id="n258" class="stm mis"><a href="#n258">258</a></p> +<p id="n259" class="pln"><a href="#n259">259</a></p> +<p id="n260" class="pln"><a href="#n260">260</a></p> +<p id="n261" class="stm mis"><a href="#n261">261</a></p> +<p id="n262" class="stm mis"><a href="#n262">262</a></p> +<p id="n263" class="stm mis"><a href="#n263">263</a></p> +<p id="n264" class="stm mis"><a href="#n264">264</a></p> +<p id="n265" class="stm mis"><a href="#n265">265</a></p> +<p id="n266" class="stm mis"><a href="#n266">266</a></p> +<p id="n267" class="stm mis"><a href="#n267">267</a></p> +<p id="n268" class="stm mis"><a href="#n268">268</a></p> +<p id="n269" class="stm mis"><a href="#n269">269</a></p> +<p id="n270" class="stm mis"><a href="#n270">270</a></p> +<p id="n271" class="stm mis"><a href="#n271">271</a></p> +<p id="n272" class="stm mis"><a href="#n272">272</a></p> +<p id="n273" class="stm mis"><a href="#n273">273</a></p> +<p id="n274" class="stm mis"><a href="#n274">274</a></p> +<p id="n275" class="stm mis"><a href="#n275">275</a></p> +<p id="n276" class="stm mis"><a href="#n276">276</a></p> +<p id="n277" class="stm mis"><a href="#n277">277</a></p> +<p id="n278" class="stm mis"><a href="#n278">278</a></p> +<p id="n279" class="stm mis"><a href="#n279">279</a></p> +<p id="n280" class="stm mis"><a href="#n280">280</a></p> +<p id="n281" class="stm mis"><a href="#n281">281</a></p> +<p id="n282" class="stm mis"><a href="#n282">282</a></p> +<p id="n283" class="stm mis"><a href="#n283">283</a></p> +<p id="n284" class="stm mis"><a href="#n284">284</a></p> +<p id="n285" class="stm mis"><a href="#n285">285</a></p> +<p id="n286" class="stm mis"><a href="#n286">286</a></p> +<p id="n287" class="stm mis"><a href="#n287">287</a></p> +<p id="n288" class="stm mis"><a href="#n288">288</a></p> +<p id="n289" class="stm mis"><a href="#n289">289</a></p> +<p id="n290" class="stm mis"><a href="#n290">290</a></p> +<p id="n291" class="stm mis"><a href="#n291">291</a></p> +<p id="n292" class="stm mis"><a href="#n292">292</a></p> +<p id="n293" class="stm mis"><a href="#n293">293</a></p> +<p id="n294" class="stm mis"><a href="#n294">294</a></p> +<p id="n295" class="stm mis"><a href="#n295">295</a></p> +<p id="n296" class="stm mis"><a href="#n296">296</a></p> +<p id="n297" class="pln"><a href="#n297">297</a></p> +<p id="n298" class="pln"><a href="#n298">298</a></p> +<p id="n299" class="pln"><a href="#n299">299</a></p> +<p id="n300" class="exc"><a href="#n300">300</a></p> +<p id="n301" class="pln"><a href="#n301">301</a></p> +<p id="n302" class="stm run hide_run"><a href="#n302">302</a></p> +<p id="n303" class="stm mis"><a href="#n303">303</a></p> +<p id="n304" class="stm mis"><a href="#n304">304</a></p> +<p id="n305" class="stm mis"><a href="#n305">305</a></p> +<p id="n306" class="stm mis"><a href="#n306">306</a></p> +<p id="n307" class="pln"><a href="#n307">307</a></p> +<p id="n308" class="pln"><a href="#n308">308</a></p> +<p id="n309" class="pln"><a href="#n309">309</a></p> +<p id="n310" class="stm run hide_run"><a href="#n310">310</a></p> +<p id="n311" class="pln"><a href="#n311">311</a></p> +<p id="n312" class="pln"><a href="#n312">312</a></p> +<p id="n313" class="stm mis"><a href="#n313">313</a></p> +<p id="n314" class="stm mis"><a href="#n314">314</a></p> +<p id="n315" class="pln"><a href="#n315">315</a></p> +<p id="n316" class="stm mis"><a href="#n316">316</a></p> +<p id="n317" class="stm mis"><a href="#n317">317</a></p> +<p id="n318" class="pln"><a href="#n318">318</a></p> +<p id="n319" class="pln"><a href="#n319">319</a></p> +<p id="n320" class="stm run hide_run"><a href="#n320">320</a></p> +<p id="n321" class="pln"><a href="#n321">321</a></p> +<p id="n322" class="pln"><a href="#n322">322</a></p> +<p id="n323" class="stm run hide_run"><a href="#n323">323</a></p> +<p id="n324" class="stm run hide_run"><a href="#n324">324</a></p> +<p id="n325" class="stm run hide_run"><a href="#n325">325</a></p> +<p id="n326" class="stm run hide_run"><a href="#n326">326</a></p> +<p id="n327" class="stm run hide_run"><a href="#n327">327</a></p> +<p id="n328" class="pln"><a href="#n328">328</a></p> +<p id="n329" class="stm run hide_run"><a href="#n329">329</a></p> +<p id="n330" class="stm run hide_run"><a href="#n330">330</a></p> +<p id="n331" class="stm run hide_run"><a href="#n331">331</a></p> +<p id="n332" class="stm run hide_run"><a href="#n332">332</a></p> +<p id="n333" class="pln"><a href="#n333">333</a></p> +<p id="n334" class="stm run hide_run"><a href="#n334">334</a></p> +<p id="n335" class="stm mis"><a href="#n335">335</a></p> +<p id="n336" class="pln"><a href="#n336">336</a></p> +<p id="n337" class="stm run hide_run"><a href="#n337">337</a></p> +<p id="n338" class="stm run hide_run"><a href="#n338">338</a></p> +<p id="n339" class="pln"><a href="#n339">339</a></p> +<p id="n340" class="stm run hide_run"><a href="#n340">340</a></p> +<p id="n341" class="stm run hide_run"><a href="#n341">341</a></p> +<p id="n342" class="pln"><a href="#n342">342</a></p> +<p id="n343" class="stm run hide_run"><a href="#n343">343</a></p> +<p id="n344" class="stm run hide_run"><a href="#n344">344</a></p> +<p id="n345" class="pln"><a href="#n345">345</a></p> +<p id="n346" class="stm run hide_run"><a href="#n346">346</a></p> +<p id="n347" class="pln"><a href="#n347">347</a></p> +<p id="n348" class="pln"><a href="#n348">348</a></p> +<p id="n349" class="pln"><a href="#n349">349</a></p> +<p id="n350" class="stm run hide_run"><a href="#n350">350</a></p> +<p id="n351" class="stm run hide_run"><a href="#n351">351</a></p> +<p id="n352" class="stm run hide_run"><a href="#n352">352</a></p> +<p id="n353" class="pln"><a href="#n353">353</a></p> +<p id="n354" class="stm run hide_run"><a href="#n354">354</a></p> +<p id="n355" class="pln"><a href="#n355">355</a></p> +<p id="n356" class="pln"><a href="#n356">356</a></p> +<p id="n357" class="stm mis"><a href="#n357">357</a></p> +<p id="n358" class="stm mis"><a href="#n358">358</a></p> +<p id="n359" class="stm mis"><a href="#n359">359</a></p> +<p id="n360" class="stm mis"><a href="#n360">360</a></p> +<p id="n361" class="stm mis"><a href="#n361">361</a></p> +<p id="n362" class="stm mis"><a href="#n362">362</a></p> +<p id="n363" class="stm mis"><a href="#n363">363</a></p> +<p id="n364" class="pln"><a href="#n364">364</a></p> +<p id="n365" class="stm mis"><a href="#n365">365</a></p> +<p id="n366" class="stm mis"><a href="#n366">366</a></p> +<p id="n367" class="pln"><a href="#n367">367</a></p> +<p id="n368" class="stm run hide_run"><a href="#n368">368</a></p> +<p id="n369" class="pln"><a href="#n369">369</a></p> +<p id="n370" class="stm mis"><a href="#n370">370</a></p> +<p id="n371" class="stm mis"><a href="#n371">371</a></p> +<p id="n372" class="pln"><a href="#n372">372</a></p> +<p id="n373" class="stm mis"><a href="#n373">373</a></p> +<p id="n374" class="stm mis"><a href="#n374">374</a></p> +<p id="n375" class="stm mis"><a href="#n375">375</a></p> +<p id="n376" class="stm mis"><a href="#n376">376</a></p> +<p id="n377" class="pln"><a href="#n377">377</a></p> +<p id="n378" class="stm run hide_run"><a href="#n378">378</a></p> +<p id="n379" class="pln"><a href="#n379">379</a></p> +<p id="n380" class="pln"><a href="#n380">380</a></p> +<p id="n381" class="pln"><a href="#n381">381</a></p> +<p id="n382" class="pln"><a href="#n382">382</a></p> +<p id="n383" class="stm run hide_run"><a href="#n383">383</a></p> +<p id="n384" class="stm run hide_run"><a href="#n384">384</a></p> +<p id="n385" class="stm run hide_run"><a href="#n385">385</a></p> +<p id="n386" class="pln"><a href="#n386">386</a></p> +<p id="n387" class="stm par run hide_run"><a href="#n387">387</a></p> +<p id="n388" class="pln"><a href="#n388">388</a></p> +<p id="n389" class="stm mis"><a href="#n389">389</a></p> +<p id="n390" class="stm mis"><a href="#n390">390</a></p> +<p id="n391" class="stm par run hide_run"><a href="#n391">391</a></p> +<p id="n392" class="pln"><a href="#n392">392</a></p> +<p id="n393" class="stm mis"><a href="#n393">393</a></p> +<p id="n394" class="stm mis"><a href="#n394">394</a></p> +<p id="n395" class="pln"><a href="#n395">395</a></p> +<p id="n396" class="stm run hide_run"><a href="#n396">396</a></p> +<p id="n397" class="stm run hide_run"><a href="#n397">397</a></p> +<p id="n398" class="pln"><a href="#n398">398</a></p> +<p id="n399" class="stm run hide_run"><a href="#n399">399</a></p> +<p id="n400" class="pln"><a href="#n400">400</a></p> +<p id="n401" class="stm run hide_run"><a href="#n401">401</a></p> +<p id="n402" class="stm run hide_run"><a href="#n402">402</a></p> +<p id="n403" class="pln"><a href="#n403">403</a></p> +<p id="n404" class="pln"><a href="#n404">404</a></p> +<p id="n405" class="stm par run hide_run"><a href="#n405">405</a></p> +<p id="n406" class="stm run hide_run"><a href="#n406">406</a></p> +<p id="n407" class="pln"><a href="#n407">407</a></p> +<p id="n408" class="pln"><a href="#n408">408</a></p> +<p id="n409" class="stm run hide_run"><a href="#n409">409</a></p> +<p id="n410" class="pln"><a href="#n410">410</a></p> +<p id="n411" class="pln"><a href="#n411">411</a></p> +<p id="n412" class="stm run hide_run"><a href="#n412">412</a></p> +<p id="n413" class="stm run hide_run"><a href="#n413">413</a></p> +<p id="n414" class="pln"><a href="#n414">414</a></p> +<p id="n415" class="stm run hide_run"><a href="#n415">415</a></p> +<p id="n416" class="stm par run hide_run"><a href="#n416">416</a></p> +<p id="n417" class="stm mis"><a href="#n417">417</a></p> +<p id="n418" class="pln"><a href="#n418">418</a></p> +<p id="n419" class="stm par run hide_run"><a href="#n419">419</a></p> +<p id="n420" class="stm mis"><a href="#n420">420</a></p> +<p id="n421" class="pln"><a href="#n421">421</a></p> +<p id="n422" class="stm run hide_run"><a href="#n422">422</a></p> +<p id="n423" class="stm run hide_run"><a href="#n423">423</a></p> +<p id="n424" class="stm run hide_run"><a href="#n424">424</a></p> +<p id="n425" class="stm run hide_run"><a href="#n425">425</a></p> +<p id="n426" class="stm par run hide_run"><a href="#n426">426</a></p> +<p id="n427" class="stm run hide_run"><a href="#n427">427</a></p> +<p id="n428" class="pln"><a href="#n428">428</a></p> +<p id="n429" class="pln"><a href="#n429">429</a></p> +<p id="n430" class="stm run hide_run"><a href="#n430">430</a></p> +<p id="n431" class="stm run hide_run"><a href="#n431">431</a></p> +<p id="n432" class="stm run hide_run"><a href="#n432">432</a></p> +<p id="n433" class="stm run hide_run"><a href="#n433">433</a></p> +<p id="n434" class="stm run hide_run"><a href="#n434">434</a></p> +<p id="n435" class="pln"><a href="#n435">435</a></p> +<p id="n436" class="pln"><a href="#n436">436</a></p> +<p id="n437" class="pln"><a href="#n437">437</a></p> +<p id="n438" class="stm run hide_run"><a href="#n438">438</a></p> +<p id="n439" class="stm run hide_run"><a href="#n439">439</a></p> +<p id="n440" class="stm run hide_run"><a href="#n440">440</a></p> +<p id="n441" class="stm run hide_run"><a href="#n441">441</a></p> +<p id="n442" class="stm run hide_run"><a href="#n442">442</a></p> +<p id="n443" class="pln"><a href="#n443">443</a></p> +<p id="n444" class="pln"><a href="#n444">444</a></p> +<p id="n445" class="stm run hide_run"><a href="#n445">445</a></p> +<p id="n446" class="stm run hide_run"><a href="#n446">446</a></p> +<p id="n447" class="pln"><a href="#n447">447</a></p> +<p id="n448" class="pln"><a href="#n448">448</a></p> +<p id="n449" class="stm run hide_run"><a href="#n449">449</a></p> +<p id="n450" class="pln"><a href="#n450">450</a></p> +<p id="n451" class="pln"><a href="#n451">451</a></p> +<p id="n452" class="stm run hide_run"><a href="#n452">452</a></p> +<p id="n453" class="stm par run hide_run"><a href="#n453">453</a></p> +<p id="n454" class="stm mis"><a href="#n454">454</a></p> +<p id="n455" class="pln"><a href="#n455">455</a></p> +<p id="n456" class="stm par run hide_run"><a href="#n456">456</a></p> +<p id="n457" class="stm mis"><a href="#n457">457</a></p> +<p id="n458" class="pln"><a href="#n458">458</a></p> +<p id="n459" class="stm par run hide_run"><a href="#n459">459</a></p> +<p id="n460" class="stm run hide_run"><a href="#n460">460</a></p> +<p id="n461" class="stm run hide_run"><a href="#n461">461</a></p> +<p id="n462" class="stm run hide_run"><a href="#n462">462</a></p> +<p id="n463" class="stm par run hide_run"><a href="#n463">463</a></p> +<p id="n464" class="stm mis"><a href="#n464">464</a></p> +<p id="n465" class="pln"><a href="#n465">465</a></p> +<p id="n466" class="pln"><a href="#n466">466</a></p> +<p id="n467" class="pln"><a href="#n467">467</a></p> +<p id="n468" class="stm par run hide_run"><a href="#n468">468</a></p> +<p id="n469" class="stm run hide_run"><a href="#n469">469</a></p> +<p id="n470" class="stm run hide_run"><a href="#n470">470</a></p> +<p id="n471" class="pln"><a href="#n471">471</a></p> +<p id="n472" class="stm run hide_run"><a href="#n472">472</a></p> +<p id="n473" class="pln"><a href="#n473">473</a></p> +<p id="n474" class="pln"><a href="#n474">474</a></p> +<p id="n475" class="pln"><a href="#n475">475</a></p> +<p id="n476" class="stm run hide_run"><a href="#n476">476</a></p> +<p id="n477" class="stm run hide_run"><a href="#n477">477</a></p> +<p id="n478" class="stm run hide_run"><a href="#n478">478</a></p> +<p id="n479" class="stm par run hide_run"><a href="#n479">479</a></p> +<p id="n480" class="stm mis"><a href="#n480">480</a></p> +<p id="n481" class="pln"><a href="#n481">481</a></p> +<p id="n482" class="stm par run hide_run"><a href="#n482">482</a></p> +<p id="n483" class="stm mis"><a href="#n483">483</a></p> +<p id="n484" class="pln"><a href="#n484">484</a></p> +<p id="n485" class="stm run hide_run"><a href="#n485">485</a></p> +<p id="n486" class="stm run hide_run"><a href="#n486">486</a></p> +<p id="n487" class="stm run hide_run"><a href="#n487">487</a></p> +<p id="n488" class="stm run hide_run"><a href="#n488">488</a></p> +<p id="n489" class="pln"><a href="#n489">489</a></p> +<p id="n490" class="stm par run hide_run"><a href="#n490">490</a></p> +<p id="n491" class="pln"><a href="#n491">491</a></p> +<p id="n492" class="stm mis"><a href="#n492">492</a></p> +<p id="n493" class="pln"><a href="#n493">493</a></p> +<p id="n494" class="pln"><a href="#n494">494</a></p> +<p id="n495" class="pln"><a href="#n495">495</a></p> +<p id="n496" class="stm run hide_run"><a href="#n496">496</a></p> +<p id="n497" class="pln"><a href="#n497">497</a></p> +<p id="n498" class="pln"><a href="#n498">498</a></p> +<p id="n499" class="pln"><a href="#n499">499</a></p> +<p id="n500" class="stm run hide_run"><a href="#n500">500</a></p> +<p id="n501" class="stm par run hide_run"><a href="#n501">501</a></p> +<p id="n502" class="stm run hide_run"><a href="#n502">502</a></p> +<p id="n503" class="stm run hide_run"><a href="#n503">503</a></p> +<p id="n504" class="stm run hide_run"><a href="#n504">504</a></p> +<p id="n505" class="stm run hide_run"><a href="#n505">505</a></p> +<p id="n506" class="stm run hide_run"><a href="#n506">506</a></p> +<p id="n507" class="stm run hide_run"><a href="#n507">507</a></p> +<p id="n508" class="pln"><a href="#n508">508</a></p> +<p id="n509" class="stm run hide_run"><a href="#n509">509</a></p> +<p id="n510" class="pln"><a href="#n510">510</a></p> +<p id="n511" class="pln"><a href="#n511">511</a></p> +<p id="n512" class="stm run hide_run"><a href="#n512">512</a></p> +<p id="n513" class="stm par run hide_run"><a href="#n513">513</a></p> +<p id="n514" class="stm mis"><a href="#n514">514</a></p> +<p id="n515" class="stm mis"><a href="#n515">515</a></p> +<p id="n516" class="stm mis"><a href="#n516">516</a></p> +<p id="n517" class="stm mis"><a href="#n517">517</a></p> +<p id="n518" class="pln"><a href="#n518">518</a></p> +<p id="n519" class="pln"><a href="#n519">519</a></p> +<p id="n520" class="stm mis"><a href="#n520">520</a></p> +<p id="n521" class="pln"><a href="#n521">521</a></p> +<p id="n522" class="pln"><a href="#n522">522</a></p> +<p id="n523" class="stm mis"><a href="#n523">523</a></p> +<p id="n524" class="stm mis"><a href="#n524">524</a></p> +<p id="n525" class="pln"><a href="#n525">525</a></p> +<p id="n526" class="pln"><a href="#n526">526</a></p> +<p id="n527" class="pln"><a href="#n527">527</a></p> +<p id="n528" class="stm par run hide_run"><a href="#n528">528</a></p> +<p id="n529" class="stm mis"><a href="#n529">529</a></p> +<p id="n530" class="pln"><a href="#n530">530</a></p> +<p id="n531" class="stm par run hide_run"><a href="#n531">531</a></p> +<p id="n532" class="stm run hide_run"><a href="#n532">532</a></p> +<p id="n533" class="stm run hide_run"><a href="#n533">533</a></p> +<p id="n534" class="pln"><a href="#n534">534</a></p> +<p id="n535" class="stm par run hide_run"><a href="#n535">535</a></p> +<p id="n536" class="stm mis"><a href="#n536">536</a></p> +<p id="n537" class="pln"><a href="#n537">537</a></p> +<p id="n538" class="stm par run hide_run"><a href="#n538">538</a></p> +<p id="n539" class="stm mis"><a href="#n539">539</a></p> +<p id="n540" class="stm par run hide_run"><a href="#n540">540</a></p> +<p id="n541" class="stm mis"><a href="#n541">541</a></p> +<p id="n542" class="pln"><a href="#n542">542</a></p> +<p id="n543" class="pln"><a href="#n543">543</a></p> +<p id="n544" class="pln"><a href="#n544">544</a></p> +<p id="n545" class="stm run hide_run"><a href="#n545">545</a></p> +<p id="n546" class="pln"><a href="#n546">546</a></p> +<p id="n547" class="stm run hide_run"><a href="#n547">547</a></p> +<p id="n548" class="pln"><a href="#n548">548</a></p> +<p id="n549" class="pln"><a href="#n549">549</a></p> +<p id="n550" class="pln"><a href="#n550">550</a></p> +<p id="n551" class="stm par run hide_run"><a href="#n551">551</a></p> +<p id="n552" class="pln"><a href="#n552">552</a></p> +<p id="n553" class="stm mis"><a href="#n553">553</a></p> +<p id="n554" class="stm mis"><a href="#n554">554</a></p> +<p id="n555" class="stm run hide_run"><a href="#n555">555</a></p> +<p id="n556" class="pln"><a href="#n556">556</a></p> +<p id="n557" class="stm run hide_run"><a href="#n557">557</a></p> +<p id="n558" class="pln"><a href="#n558">558</a></p> +<p id="n559" class="pln"><a href="#n559">559</a></p> +<p id="n560" class="pln"><a href="#n560">560</a></p> +<p id="n561" class="stm run hide_run"><a href="#n561">561</a></p> +<p id="n562" class="stm run hide_run"><a href="#n562">562</a></p> +<p id="n563" class="stm run hide_run"><a href="#n563">563</a></p> +<p id="n564" class="stm run hide_run"><a href="#n564">564</a></p> +<p id="n565" class="pln"><a href="#n565">565</a></p> +<p id="n566" class="stm run hide_run"><a href="#n566">566</a></p> +<p id="n567" class="pln"><a href="#n567">567</a></p> +<p id="n568" class="pln"><a href="#n568">568</a></p> +<p id="n569" class="stm mis"><a href="#n569">569</a></p> +<p id="n570" class="pln"><a href="#n570">570</a></p> +<p id="n571" class="stm mis"><a href="#n571">571</a></p> +<p id="n572" class="pln"><a href="#n572">572</a></p> +<p id="n573" class="stm mis"><a href="#n573">573</a></p> +<p id="n574" class="stm mis"><a href="#n574">574</a></p> +<p id="n575" class="stm mis"><a href="#n575">575</a></p> +<p id="n576" class="stm mis"><a href="#n576">576</a></p> +<p id="n577" class="pln"><a href="#n577">577</a></p> +<p id="n578" class="pln"><a href="#n578">578</a></p> +<p id="n579" class="stm mis"><a href="#n579">579</a></p> +<p id="n580" class="stm mis"><a href="#n580">580</a></p> +<p id="n581" class="stm mis"><a href="#n581">581</a></p> +<p id="n582" class="stm mis"><a href="#n582">582</a></p> +<p id="n583" class="pln"><a href="#n583">583</a></p> +<p id="n584" class="stm run hide_run"><a href="#n584">584</a></p> +<p id="n585" class="stm mis"><a href="#n585">585</a></p> +<p id="n586" class="stm mis"><a href="#n586">586</a></p> +<p id="n587" class="pln"><a href="#n587">587</a></p> +<p id="n588" class="stm run hide_run"><a href="#n588">588</a></p> +<p id="n589" class="stm mis"><a href="#n589">589</a></p> +<p id="n590" class="stm mis"><a href="#n590">590</a></p> +<p id="n591" class="stm mis"><a href="#n591">591</a></p> +<p id="n592" class="pln"><a href="#n592">592</a></p> +<p id="n593" class="stm run hide_run"><a href="#n593">593</a></p> +<p id="n594" class="stm mis"><a href="#n594">594</a></p> +<p id="n595" class="stm mis"><a href="#n595">595</a></p> +<p id="n596" class="pln"><a href="#n596">596</a></p> +<p id="n597" class="stm run hide_run"><a href="#n597">597</a></p> +<p id="n598" class="pln"><a href="#n598">598</a></p> +<p id="n599" class="pln"><a href="#n599">599</a></p> +<p id="n600" class="pln"><a href="#n600">600</a></p> +<p id="n601" class="stm mis"><a href="#n601">601</a></p> +<p id="n602" class="stm mis"><a href="#n602">602</a></p> +<p id="n603" class="pln"><a href="#n603">603</a></p> +<p id="n604" class="stm mis"><a href="#n604">604</a></p> +<p id="n605" class="stm mis"><a href="#n605">605</a></p> +<p id="n606" class="pln"><a href="#n606">606</a></p> +<p id="n607" class="pln"><a href="#n607">607</a></p> +<p id="n608" class="stm mis"><a href="#n608">608</a></p> +<p id="n609" class="pln"><a href="#n609">609</a></p> +<p id="n610" class="pln"><a href="#n610">610</a></p> +<p id="n611" class="stm mis"><a href="#n611">611</a></p> +<p id="n612" class="stm mis"><a href="#n612">612</a></p> +<p id="n613" class="stm mis"><a href="#n613">613</a></p> +<p id="n614" class="pln"><a href="#n614">614</a></p> +<p id="n615" class="pln"><a href="#n615">615</a></p> +<p id="n616" class="stm mis"><a href="#n616">616</a></p> +<p id="n617" class="stm mis"><a href="#n617">617</a></p> +<p id="n618" class="stm mis"><a href="#n618">618</a></p> +<p id="n619" class="pln"><a href="#n619">619</a></p> +<p id="n620" class="stm mis"><a href="#n620">620</a></p> +<p id="n621" class="stm mis"><a href="#n621">621</a></p> +<p id="n622" class="stm mis"><a href="#n622">622</a></p> +<p id="n623" class="stm mis"><a href="#n623">623</a></p> +<p id="n624" class="stm mis"><a href="#n624">624</a></p> +<p id="n625" class="stm mis"><a href="#n625">625</a></p> +<p id="n626" class="stm mis"><a href="#n626">626</a></p> +<p id="n627" class="stm mis"><a href="#n627">627</a></p> +<p id="n628" class="stm mis"><a href="#n628">628</a></p> +<p id="n629" class="stm mis"><a href="#n629">629</a></p> +<p id="n630" class="stm mis"><a href="#n630">630</a></p> +<p id="n631" class="stm mis"><a href="#n631">631</a></p> +<p id="n632" class="pln"><a href="#n632">632</a></p> +<p id="n633" class="pln"><a href="#n633">633</a></p> +<p id="n634" class="pln"><a href="#n634">634</a></p> +<p id="n635" class="pln"><a href="#n635">635</a></p> +<p id="n636" class="pln"><a href="#n636">636</a></p> +<p id="n637" class="stm mis"><a href="#n637">637</a></p> +<p id="n638" class="stm mis"><a href="#n638">638</a></p> +<p id="n639" class="pln"><a href="#n639">639</a></p> +<p id="n640" class="stm mis"><a href="#n640">640</a></p> +<p id="n641" class="pln"><a href="#n641">641</a></p> +<p id="n642" class="stm mis"><a href="#n642">642</a></p> +<p id="n643" class="pln"><a href="#n643">643</a></p> +<p id="n644" class="stm run hide_run"><a href="#n644">644</a></p> +<p id="n645" class="pln"><a href="#n645">645</a></p> +<p id="n646" class="pln"><a href="#n646">646</a></p> +<p id="n647" class="stm mis"><a href="#n647">647</a></p> +<p id="n648" class="stm mis"><a href="#n648">648</a></p> +<p id="n649" class="stm mis"><a href="#n649">649</a></p> +<p id="n650" class="stm mis"><a href="#n650">650</a></p> +<p id="n651" class="pln"><a href="#n651">651</a></p> +<p id="n652" class="stm mis"><a href="#n652">652</a></p> +<p id="n653" class="stm mis"><a href="#n653">653</a></p> +<p id="n654" class="stm mis"><a href="#n654">654</a></p> +<p id="n655" class="pln"><a href="#n655">655</a></p> +<p id="n656" class="stm mis"><a href="#n656">656</a></p> +<p id="n657" class="stm mis"><a href="#n657">657</a></p> +<p id="n658" class="stm mis"><a href="#n658">658</a></p> +<p id="n659" class="stm mis"><a href="#n659">659</a></p> +<p id="n660" class="pln"><a href="#n660">660</a></p> +<p id="n661" class="stm run hide_run"><a href="#n661">661</a></p> +<p id="n662" class="pln"><a href="#n662">662</a></p> +<p id="n663" class="pln"><a href="#n663">663</a></p> +<p id="n664" class="stm mis"><a href="#n664">664</a></p> +<p id="n665" class="stm mis"><a href="#n665">665</a></p> +<p id="n666" class="pln"><a href="#n666">666</a></p> +<p id="n667" class="stm mis"><a href="#n667">667</a></p> +<p id="n668" class="stm mis"><a href="#n668">668</a></p> +<p id="n669" class="pln"><a href="#n669">669</a></p> +<p id="n670" class="stm mis"><a href="#n670">670</a></p> +<p id="n671" class="stm mis"><a href="#n671">671</a></p> +<p id="n672" class="stm mis"><a href="#n672">672</a></p> +<p id="n673" class="stm mis"><a href="#n673">673</a></p> +<p id="n674" class="pln"><a href="#n674">674</a></p> +<p id="n675" class="stm mis"><a href="#n675">675</a></p> +<p id="n676" class="pln"><a href="#n676">676</a></p> +<p id="n677" class="stm mis"><a href="#n677">677</a></p> +<p id="n678" class="pln"><a href="#n678">678</a></p> +<p id="n679" class="stm run hide_run"><a href="#n679">679</a></p> +<p id="n680" class="pln"><a href="#n680">680</a></p> +<p id="n681" class="pln"><a href="#n681">681</a></p> +<p id="n682" class="pln"><a href="#n682">682</a></p> +<p id="n683" class="pln"><a href="#n683">683</a></p> +<p id="n684" class="stm mis"><a href="#n684">684</a></p> +<p id="n685" class="pln"><a href="#n685">685</a></p> +<p id="n686" class="pln"><a href="#n686">686</a></p> +<p id="n687" class="stm mis"><a href="#n687">687</a></p> +<p id="n688" class="stm mis"><a href="#n688">688</a></p> +<p id="n689" class="stm mis"><a href="#n689">689</a></p> +<p id="n690" class="pln"><a href="#n690">690</a></p> +<p id="n691" class="stm mis"><a href="#n691">691</a></p> +<p id="n692" class="stm mis"><a href="#n692">692</a></p> +<p id="n693" class="stm mis"><a href="#n693">693</a></p> +<p id="n694" class="pln"><a href="#n694">694</a></p> +<p id="n695" class="stm mis"><a href="#n695">695</a></p> +<p id="n696" class="stm mis"><a href="#n696">696</a></p> +<p id="n697" class="stm mis"><a href="#n697">697</a></p> +<p id="n698" class="pln"><a href="#n698">698</a></p> +<p id="n699" class="stm mis"><a href="#n699">699</a></p> +<p id="n700" class="stm mis"><a href="#n700">700</a></p> +<p id="n701" class="stm mis"><a href="#n701">701</a></p> +<p id="n702" class="pln"><a href="#n702">702</a></p> +<p id="n703" class="stm mis"><a href="#n703">703</a></p> +<p id="n704" class="pln"><a href="#n704">704</a></p> +<p id="n705" class="stm run hide_run"><a href="#n705">705</a></p> +<p id="n706" class="pln"><a href="#n706">706</a></p> +<p id="n707" class="pln"><a href="#n707">707</a></p> +<p id="n708" class="pln"><a href="#n708">708</a></p> +<p id="n709" class="stm mis"><a href="#n709">709</a></p> +<p id="n710" class="stm mis"><a href="#n710">710</a></p> +<p id="n711" class="stm mis"><a href="#n711">711</a></p> +<p id="n712" class="stm mis"><a href="#n712">712</a></p> +<p id="n713" class="stm mis"><a href="#n713">713</a></p> +<p id="n714" class="stm mis"><a href="#n714">714</a></p> +<p id="n715" class="stm mis"><a href="#n715">715</a></p> +<p id="n716" class="stm mis"><a href="#n716">716</a></p> +<p id="n717" class="stm mis"><a href="#n717">717</a></p> +<p id="n718" class="stm mis"><a href="#n718">718</a></p> +<p id="n719" class="stm mis"><a href="#n719">719</a></p> +<p id="n720" class="stm mis"><a href="#n720">720</a></p> +<p id="n721" class="stm mis"><a href="#n721">721</a></p> +<p id="n722" class="stm mis"><a href="#n722">722</a></p> +<p id="n723" class="stm mis"><a href="#n723">723</a></p> +<p id="n724" class="stm mis"><a href="#n724">724</a></p> +<p id="n725" class="pln"><a href="#n725">725</a></p> +<p id="n726" class="pln"><a href="#n726">726</a></p> +<p id="n727" class="pln"><a href="#n727">727</a></p> +<p id="n728" class="pln"><a href="#n728">728</a></p> +<p id="n729" class="pln"><a href="#n729">729</a></p> +<p id="n730" class="pln"><a href="#n730">730</a></p> +<p id="n731" class="pln"><a href="#n731">731</a></p> +<p id="n732" class="pln"><a href="#n732">732</a></p> +<p id="n733" class="pln"><a href="#n733">733</a></p> +<p id="n734" class="pln"><a href="#n734">734</a></p> +<p id="n735" class="pln"><a href="#n735">735</a></p> +<p id="n736" class="pln"><a href="#n736">736</a></p> +<p id="n737" class="pln"><a href="#n737">737</a></p> +<p id="n738" class="pln"><a href="#n738">738</a></p> +<p id="n739" class="pln"><a href="#n739">739</a></p> +<p id="n740" class="pln"><a href="#n740">740</a></p> +<p id="n741" class="pln"><a href="#n741">741</a></p> +<p id="n742" class="pln"><a href="#n742">742</a></p> +<p id="n743" class="pln"><a href="#n743">743</a></p> +<p id="n744" class="pln"><a href="#n744">744</a></p> +<p id="n745" class="pln"><a href="#n745">745</a></p> +<p id="n746" class="pln"><a href="#n746">746</a></p> +<p id="n747" class="pln"><a href="#n747">747</a></p> +<p id="n748" class="pln"><a href="#n748">748</a></p> +<p id="n749" class="pln"><a href="#n749">749</a></p> +<p id="n750" class="pln"><a href="#n750">750</a></p> +<p id="n751" class="pln"><a href="#n751">751</a></p> +<p id="n752" class="pln"><a href="#n752">752</a></p> +<p id="n753" class="pln"><a href="#n753">753</a></p> +<p id="n754" class="pln"><a href="#n754">754</a></p> +<p id="n755" class="pln"><a href="#n755">755</a></p> +<p id="n756" class="pln"><a href="#n756">756</a></p> +<p id="n757" class="pln"><a href="#n757">757</a></p> +<p id="n758" class="pln"><a href="#n758">758</a></p> +<p id="n759" class="pln"><a href="#n759">759</a></p> +<p id="n760" class="pln"><a href="#n760">760</a></p> +<p id="n761" class="pln"><a href="#n761">761</a></p> +<p id="n762" class="pln"><a href="#n762">762</a></p> +<p id="n763" class="pln"><a href="#n763">763</a></p> +<p id="n764" class="pln"><a href="#n764">764</a></p> +<p id="n765" class="pln"><a href="#n765">765</a></p> +<p id="n766" class="pln"><a href="#n766">766</a></p> +<p id="n767" class="pln"><a href="#n767">767</a></p> +<p id="n768" class="pln"><a href="#n768">768</a></p> +<p id="n769" class="pln"><a href="#n769">769</a></p> +<p id="n770" class="pln"><a href="#n770">770</a></p> +<p id="n771" class="pln"><a href="#n771">771</a></p> +<p id="n772" class="pln"><a href="#n772">772</a></p> +<p id="n773" class="pln"><a href="#n773">773</a></p> +<p id="n774" class="pln"><a href="#n774">774</a></p> +<p id="n775" class="pln"><a href="#n775">775</a></p> + + </td> + <td class="text"> +<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="strut"> </span></p> +<p id="t4" class="pln"><span class="str"> Copyright 2004-2015, 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">from</span> <span class="nam">__future__</span> <span class="key">import</span> <span class="nam">absolute_import</span><span class="op">,</span> <span class="nam">print_function</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">import</span> <span class="nam">copy</span><span class="op">,</span> <span class="nam">getopt</span><span class="op">,</span> <span class="nam">hashlib</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">sys</span><span class="op">,</span> <span class="nam">traceback</span><span class="strut"> </span></p> +<p id="t10" class="stm run hide_run"><span class="key">from</span> <span class="op">.</span><span class="nam">backward</span> <span class="key">import</span> <span class="nam">PY3</span><span class="op">,</span> <span class="nam">StringIO</span><span class="op">,</span> <span class="nam">string_types</span><span class="op">,</span> <span class="nam">to_bytes</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="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="t13" class="pln"><span class="strut"> </span></p> +<p id="t14" class="stm run hide_run"><span class="nam">__version__</span> <span class="op">=</span> <span class="str">'2.4'</span> <span class="com"># History at the end of the file.</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="nam">usage</span> <span class="op">=</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t17" class="pln"><span class="str">cog - generate code with inlined Python code.</span><span class="strut"> </span></p> +<p id="t18" class="pln"><span class="strut"> </span></p> +<p id="t19" class="pln"><span class="str">cog [OPTIONS] [INFILE | @FILELIST] ...</span><span class="strut"> </span></p> +<p id="t20" class="pln"><span class="strut"> </span></p> +<p id="t21" class="pln"><span class="str">INFILE is the name of an input file, '-' will read from stdin.</span><span class="strut"> </span></p> +<p id="t22" 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="t23" class="pln"><span class="str"> other @FILELISTs.</span><span class="strut"> </span></p> +<p id="t24" class="pln"><span class="strut"> </span></p> +<p id="t25" class="pln"><span class="str">OPTIONS:</span><span class="strut"> </span></p> +<p id="t26" class="pln"><span class="str"> -c Checksum the output to protect it against accidental change.</span><span class="strut"> </span></p> +<p id="t27" class="pln"><span class="str"> -d Delete the generator code from the output file.</span><span class="strut"> </span></p> +<p id="t28" 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="t29" class="pln"><span class="str"> -e Warn if a file has no cog code in it.</span><span class="strut"> </span></p> +<p id="t30" 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="t31" class="pln"><span class="str"> -n ENCODING Use ENCODING when reading and writing files.</span><span class="strut"> </span></p> +<p id="t32" class="pln"><span class="str"> -o OUTNAME Write the output to OUTNAME.</span><span class="strut"> </span></p> +<p id="t33" class="pln"><span class="str"> -r Replace the input file with the output.</span><span class="strut"> </span></p> +<p id="t34" class="pln"><span class="str"> -s STRING Suffix all generated output lines with STRING.</span><span class="strut"> </span></p> +<p id="t35" class="pln"><span class="str"> -U Write the output with Unix newlines (only LF line-endings).</span><span class="strut"> </span></p> +<p id="t36" 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="t37" class="pln"><span class="str"> A %s in the CMD will be filled with the filename.</span><span class="strut"> </span></p> +<p id="t38" class="pln"><span class="str"> -x Excise all the generated output without running the generators.</span><span class="strut"> </span></p> +<p id="t39" class="pln"><span class="str"> -z The end-output marker can be omitted, and is assumed at eof.</span><span class="strut"> </span></p> +<p id="t40" class="pln"><span class="str"> -v Print the version of cog and exit.</span><span class="strut"> </span></p> +<p id="t41" class="pln"><span class="str"> --verbosity=VERBOSITY</span><span class="strut"> </span></p> +<p id="t42" class="pln"><span class="str"> Control the amount of output. 2 (the default) lists all files,</span><span class="strut"> </span></p> +<p id="t43" class="pln"><span class="str"> 1 lists only changed files, 0 lists no files.</span><span class="strut"> </span></p> +<p id="t44" class="pln"><span class="str"> --markers='START END END-OUTPUT'</span><span class="strut"> </span></p> +<p id="t45" class="pln"><span class="str"> The patterns surrounding cog inline instructions. Should</span><span class="strut"> </span></p> +<p id="t46" class="pln"><span class="str"> include three values separated by spaces, the start, end,</span><span class="strut"> </span></p> +<p id="t47" class="pln"><span class="str"> and end-output markers. Defaults to '[[[cog ]]] [[[end]]]'.</span><span class="strut"> </span></p> +<p id="t48" class="pln"><span class="str"> -h Print this help.</span><span class="strut"> </span></p> +<p id="t49" class="pln"><span class="str">"""</span><span class="strut"> </span></p> +<p id="t50" class="pln"><span class="strut"> </span></p> +<p id="t51" class="pln"><span class="com"># Other package modules</span><span class="strut"> </span></p> +<p id="t52" class="stm run hide_run"><span class="key">from</span> <span class="op">.</span><span class="nam">whiteutils</span> <span class="key">import</span> <span class="op">*</span><span class="strut"> </span></p> +<p id="t53" class="pln"><span class="strut"> </span></p> +<p id="t54" 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="t55" class="pln"> <span class="str">""" Any exception raised by Cog.</span><span class="strut"> </span></p> +<p id="t56" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t57" 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="t58" class="stm par run hide_run"><span class="annotate" title="Line 58 was executed, but never jumped to line 61">58 ↛ 61 [?]</span> <span class="key">if</span> <span class="nam">file</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t59" 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="t60" class="pln"> <span class="key">else</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t61" 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="t62" class="pln"><span class="strut"> </span></p> +<p id="t63" 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="t64" class="pln"> <span class="str">""" An error in usage of command-line arguments in cog.</span><span class="strut"> </span></p> +<p id="t65" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t66" class="exc"> <span class="key">pass</span> <span class="com">#pragma: no cover</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">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="t69" class="pln"> <span class="str">""" An error in the coding of Cog. Should never happen.</span><span class="strut"> </span></p> +<p id="t70" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t71" class="exc"> <span class="key">pass</span> <span class="com">#pragma: no cover</span><span class="strut"> </span></p> +<p id="t72" class="pln"><span class="strut"> </span></p> +<p id="t73" 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="t74" class="pln"> <span class="str">""" An error raised by a user's cog generator.</span><span class="strut"> </span></p> +<p id="t75" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t76" class="exc"> <span class="key">pass</span> <span class="com">#pragma: no cover</span><span class="strut"> </span></p> +<p id="t77" class="pln"><span class="strut"> </span></p> +<p id="t78" 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="t79" class="pln"> <span class="str">""" An object with its own stdout and stderr files.</span><span class="strut"> </span></p> +<p id="t80" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t81" 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="t82" 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="t83" 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="t84" class="pln"><span class="strut"> </span></p> +<p id="t85" 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="t86" class="pln"> <span class="str">""" Assign new files for standard out and/or standard error.</span><span class="strut"> </span></p> +<p id="t87" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t88" class="stm par run hide_run"><span class="annotate" title="Line 88 was executed, but never jumped to line 90">88 ↛ 90 [?]</span> <span class="key">if</span> <span class="nam">stdout</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t89" 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="t90" class="stm par run hide_run"><span class="annotate" title="Line 90 was executed, but never jumped to line 91">90 ↛ 91 [?]</span> <span class="key">if</span> <span class="nam">stderr</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t91" 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="t92" class="pln"><span class="strut"> </span></p> +<p id="t93" class="stm run hide_run"> <span class="key">def</span> <span class="nam">prout</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="nam">end</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="t94" class="stm mis"> <span class="key">print</span><span class="op">(</span><span class="nam">s</span><span class="op">,</span> <span class="nam">file</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">end</span><span class="op">=</span><span class="nam">end</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t95" class="pln"><span class="strut"> </span></p> +<p id="t96" class="stm run hide_run"> <span class="key">def</span> <span class="nam">prerr</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="nam">end</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="t97" class="stm mis"> <span class="key">print</span><span class="op">(</span><span class="nam">s</span><span class="op">,</span> <span class="nam">file</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">end</span><span class="op">=</span><span class="nam">end</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t98" class="pln"><span class="strut"> </span></p> +<p id="t99" class="pln"><span class="strut"> </span></p> +<p id="t100" 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="t101" class="pln"> <span class="str">""" A generator pulled from a source file.</span><span class="strut"> </span></p> +<p id="t102" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t103" 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="t104" 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="t105" 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="t106" 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="t107" class="pln"><span class="strut"> </span></p> +<p id="t108" 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="t109" 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="t110" class="pln"><span class="strut"> </span></p> +<p id="t111" 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="t112" 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="t113" class="pln"><span class="strut"> </span></p> +<p id="t114" 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="t115" class="pln"> <span class="str">""" Extract the executable Python code from the generator.</span><span class="strut"> </span></p> +<p id="t116" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t117" class="pln"> <span class="com"># If the markers and lines all have the same prefix</span><span class="strut"> </span></p> +<p id="t118" class="pln"> <span class="com"># (end-of-line comment chars, for example),</span><span class="strut"> </span></p> +<p id="t119" class="pln"> <span class="com"># then remove it from all the lines.</span><span class="strut"> </span></p> +<p id="t120" 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="t121" 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="t122" 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="t123" 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="t124" class="pln"><span class="strut"> </span></p> +<p id="t125" 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="t126" class="pln"><span class="strut"> </span></p> +<p id="t127" 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="t128" class="pln"> <span class="com"># figure out the right whitespace prefix for the output</span><span class="strut"> </span></p> +<p id="t129" 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="t130" class="pln"><span class="strut"> </span></p> +<p id="t131" 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="t132" 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="t133" class="stm run hide_run"> <span class="key">return</span> <span class="str">''</span><span class="strut"> </span></p> +<p id="t134" class="pln"><span class="strut"> </span></p> +<p id="t135" 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="t136" 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="t137" 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="t138" class="pln"><span class="strut"> </span></p> +<p id="t139" class="pln"> <span class="com"># Make sure the "cog" module has our state.</span><span class="strut"> </span></p> +<p id="t140" 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="t141" 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="t142" 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="t143" 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="t144" class="pln"><span class="strut"> </span></p> +<p id="t145" 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="t146" 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="t147" class="pln"><span class="strut"> </span></p> +<p id="t148" 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="t149" class="pln"> <span class="com"># ends with a newline, or it will be joined to the</span><span class="strut"> </span></p> +<p id="t150" class="pln"> <span class="com"># end-output line, ruining cog's idempotency.</span><span class="strut"> </span></p> +<p id="t151" 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="t152" 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="t153" class="pln"><span class="strut"> </span></p> +<p id="t154" 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="t155" class="pln"><span class="strut"> </span></p> +<p id="t156" 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="t157" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">prout</span><span class="op">(</span><span class="str">"Message: "</span><span class="op">+</span><span class="nam">s</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t158" class="pln"><span class="strut"> </span></p> +<p id="t159" 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="t160" class="pln"> <span class="str">""" The cog.out function.</span><span class="strut"> </span></p> +<p id="t161" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t162" 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="t163" 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="t164" 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="t165" 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="t166" class="stm par run hide_run"><span class="annotate" title="Line 166 was executed, but never jumped to line 168">166 ↛ 168 [?]</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="t167" 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="t168" 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="t169" 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="t170" 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="t171" 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="t172" class="pln"><span class="strut"> </span></p> +<p id="t173" 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="t174" class="pln"> <span class="str">""" The cog.outl function.</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 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="t177" 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="t178" class="pln"><span class="strut"> </span></p> +<p id="t179" 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="t180" class="pln"> <span class="str">""" The cog.error function.</span><span class="strut"> </span></p> +<p id="t181" class="pln"><span class="str"> Instead of raising standard python errors, cog generators can use</span><span class="strut"> </span></p> +<p id="t182" class="pln"><span class="str"> this function. It will display the error without a scary Python</span><span class="strut"> </span></p> +<p id="t183" class="pln"><span class="str"> traceback.</span><span class="strut"> </span></p> +<p id="t184" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t185" 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="t186" class="pln"><span class="strut"> </span></p> +<p id="t187" class="pln"><span class="strut"> </span></p> +<p id="t188" 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="t189" class="pln"> <span class="str">""" A decorator for files that counts the readline()'s called.</span><span class="strut"> </span></p> +<p id="t190" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t191" 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="t192" 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="t193" 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="t194" class="pln"><span class="strut"> </span></p> +<p id="t195" 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="t196" 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="t197" 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="t198" 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="t199" class="stm run hide_run"> <span class="key">return</span> <span class="nam">l</span><span class="strut"> </span></p> +<p id="t200" class="pln"><span class="strut"> </span></p> +<p id="t201" 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="t202" 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="t203" class="pln"><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">class</span> <span class="nam">CogOptions</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t206" class="pln"> <span class="str">""" Options for a run of cog.</span><span class="strut"> </span></p> +<p id="t207" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t208" 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="t209" class="pln"> <span class="com"># Defaults for argument values.</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">args</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</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">includePath</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</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">defines</span> <span class="op">=</span> <span class="op">{</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">bShowVersion</span> <span class="op">=</span> <span class="nam">False</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">sMakeWritableCmd</span> <span class="op">=</span> <span class="nam">None</span><span class="strut"> </span></p> +<p id="t215" 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="t216" 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="t217" 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="t218" 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="t219" 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="t220" 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="t221" 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="t222" 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="t223" 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="t224" 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="t225" 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="t226" 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="t227" class="stm run hide_run"> <span class="nam">self</span><span class="op">.</span><span class="nam">sEncoding</span> <span class="op">=</span> <span class="str">"utf-8"</span><span class="strut"> </span></p> +<p id="t228" class="stm run hide_run"> <span class="nam">self</span><span class="op">.</span><span class="nam">verbosity</span> <span class="op">=</span> <span class="num">2</span><span class="strut"> </span></p> +<p id="t229" class="pln"><span class="strut"> </span></p> +<p id="t230" class="stm run hide_run"> <span class="key">def</span> <span class="nam">__eq__</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="t231" class="pln"> <span class="str">""" Comparison operator for tests to use.</span><span class="strut"> </span></p> +<p id="t232" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t233" 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">other</span><span class="op">.</span><span class="nam">__dict__</span><span class="strut"> </span></p> +<p id="t234" class="pln"><span class="strut"> </span></p> +<p id="t235" 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="t236" class="pln"> <span class="str">""" Make a clone of these options, for further refinement.</span><span class="strut"> </span></p> +<p id="t237" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t238" 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="t239" class="pln"><span class="strut"> </span></p> +<p id="t240" 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="t241" class="pln"> <span class="str">""" Add directories to the include path.</span><span class="strut"> </span></p> +<p id="t242" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t243" 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="t244" 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="t245" class="pln"><span class="strut"> </span></p> +<p id="t246" 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="t247" class="pln"> <span class="com"># Parse the command line arguments.</span><span class="strut"> </span></p> +<p id="t248" class="stm mis"> <span class="key">try</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t249" 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="strut"> </span></p> +<p id="t250" class="pln"> <span class="nam">argv</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t251" class="pln"> <span class="str">'cdD:eI:n:o:rs:Uvw:xz'</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t252" class="pln"> <span class="op">[</span><span class="strut"> </span></p> +<p id="t253" class="pln"> <span class="str">'markers='</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t254" class="pln"> <span class="str">'verbosity='</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t255" class="pln"> <span class="op">]</span><span class="strut"> </span></p> +<p id="t256" class="pln"> <span class="op">)</span><span class="strut"> </span></p> +<p id="t257" class="stm mis"> <span class="key">except</span> <span class="nam">getopt</span><span class="op">.</span><span class="nam">error</span> <span class="key">as</span> <span class="nam">msg</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t258" 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="t259" class="pln"><span class="strut"> </span></p> +<p id="t260" class="pln"> <span class="com"># Handle the command line arguments.</span><span class="strut"> </span></p> +<p id="t261" 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="t262" 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="t263" 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="t264" 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="t265" 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="t266" 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="t267" 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="t268" 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="t269" 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="t270" 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="t271" 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="t272" 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="t273" 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="t274" 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="t275" class="stm mis"> <span class="key">elif</span> <span class="nam">o</span> <span class="op">==</span> <span class="str">'-n'</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t276" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">sEncoding</span> <span class="op">=</span> <span class="nam">a</span><span class="strut"> </span></p> +<p id="t277" 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="t278" 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="t279" 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="t280" 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="t281" 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="t282" 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="t283" 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="t284" 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="t285" 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="t286" 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="t287" 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="t288" 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="t289" 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="t290" 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="t291" 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="t292" 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="t293" class="stm mis"> <span class="key">elif</span> <span class="nam">o</span> <span class="op">==</span> <span class="str">'--markers'</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t294" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">_parse_markers</span><span class="op">(</span><span class="nam">a</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t295" class="stm mis"> <span class="key">elif</span> <span class="nam">o</span> <span class="op">==</span> <span class="str">'--verbosity'</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t296" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">verbosity</span> <span class="op">=</span> <span class="nam">int</span><span class="op">(</span><span class="nam">a</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t297" class="pln"> <span class="key">else</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t298" class="pln"> <span class="com"># Since getopt.getopt is given a list of possible flags,</span><span class="strut"> </span></p> +<p id="t299" class="pln"> <span class="com"># this is an internal error.</span><span class="strut"> </span></p> +<p id="t300" class="exc"> <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="t301" class="pln"><span class="strut"> </span></p> +<p id="t302" class="stm run hide_run"> <span class="key">def</span> <span class="nam">_parse_markers</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">val</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t303" class="stm mis"> <span class="key">try</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t304" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">sBeginSpec</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="nam">self</span><span class="op">.</span><span class="nam">sEndOutput</span> <span class="op">=</span> <span class="nam">val</span><span class="op">.</span><span class="nam">split</span><span class="op">(</span><span class="str">' '</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t305" class="stm mis"> <span class="key">except</span> <span class="nam">ValueError</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t306" class="stm mis"> <span class="key">raise</span> <span class="nam">CogUsageError</span><span class="op">(</span><span class="strut"> </span></p> +<p id="t307" class="pln"> <span class="str">'--markers requires 3 values separated by spaces, could not parse %r'</span> <span class="op">%</span> <span class="nam">val</span><span class="strut"> </span></p> +<p id="t308" class="pln"> <span class="op">)</span><span class="strut"> </span></p> +<p id="t309" class="pln"><span class="strut"> </span></p> +<p id="t310" 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="t311" 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="t312" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t313" 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="t314" 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="t315" class="pln"><span class="strut"> </span></p> +<p id="t316" 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="t317" 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="t318" class="pln"><span class="strut"> </span></p> +<p id="t319" class="pln"><span class="strut"> </span></p> +<p id="t320" 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="t321" class="pln"> <span class="str">""" The Cog engine.</span><span class="strut"> </span></p> +<p id="t322" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t323" 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="t324" 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="t325" 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="t326" class="stm run hide_run"> <span class="nam">self</span><span class="op">.</span><span class="nam">_fixEndOutputPatterns</span><span class="op">(</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t327" 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="t328" class="pln"><span class="strut"> </span></p> +<p id="t329" class="stm run hide_run"> <span class="key">def</span> <span class="nam">_fixEndOutputPatterns</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="t330" class="stm run hide_run"> <span class="nam">end_output</span> <span class="op">=</span> <span class="nam">re</span><span class="op">.</span><span class="nam">escape</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">sEndOutput</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t331" 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="nam">end_output</span> <span class="op">+</span> <span class="str">r'(?P<hashsect> *\(checksum: (?P<hash>[a-f0-9]+)\))'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t332" 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="nam">self</span><span class="op">.</span><span class="nam">options</span><span class="op">.</span><span class="nam">sEndOutput</span> <span class="op">+</span> <span class="str">' (checksum: %s)'</span><span class="strut"> </span></p> +<p id="t333" class="pln"><span class="strut"> </span></p> +<p id="t334" 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="t335" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">prout</span><span class="op">(</span><span class="str">"Warning: "</span><span class="op">+</span><span class="nam">msg</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t336" class="pln"><span class="strut"> </span></p> +<p id="t337" 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="t338" class="stm run hide_run"> <span class="key">return</span> <span class="nam">self</span><span class="op">.</span><span class="nam">options</span><span class="op">.</span><span class="nam">sBeginSpec</span> <span class="key">in</span> <span class="nam">s</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">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="t341" class="stm run hide_run"> <span class="key">return</span> <span class="nam">self</span><span class="op">.</span><span class="nam">options</span><span class="op">.</span><span class="nam">sEndSpec</span> <span class="key">in</span> <span class="nam">s</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">s</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="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="t344" class="stm run hide_run"> <span class="key">return</span> <span class="nam">self</span><span class="op">.</span><span class="nam">options</span><span class="op">.</span><span class="nam">sEndOutput</span> <span class="key">in</span> <span class="nam">s</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">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="t347" class="pln"> <span class="str">""" Magic mumbo-jumbo so that imported Python modules</span><span class="strut"> </span></p> +<p id="t348" class="pln"><span class="str"> can say "import cog" and get our state.</span><span class="strut"> </span></p> +<p id="t349" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t350" 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="t351" 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="t352" 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="t353" class="pln"><span class="strut"> </span></p> +<p id="t354" class="stm run hide_run"> <span class="key">def</span> <span class="nam">openOutputFile</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">fname</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t355" class="pln"> <span class="str">""" Open an output file, taking all the details into account.</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="nam">opts</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="nam">mode</span> <span class="op">=</span> <span class="str">"w"</span><span class="strut"> </span></p> +<p id="t359" class="stm mis"> <span class="key">if</span> <span class="nam">PY3</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t360" class="stm mis"> <span class="nam">opts</span><span class="op">[</span><span class="str">'encoding'</span><span class="op">]</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">sEncoding</span><span class="strut"> </span></p> +<p id="t361" 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="t362" class="stm mis"> <span class="key">if</span> <span class="nam">PY3</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t363" class="stm mis"> <span class="nam">opts</span><span class="op">[</span><span class="str">'newline'</span><span class="op">]</span> <span class="op">=</span> <span class="str">"\n"</span><span class="strut"> </span></p> +<p id="t364" class="pln"> <span class="key">else</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t365" class="stm mis"> <span class="nam">mode</span> <span class="op">=</span> <span class="str">"wb"</span><span class="strut"> </span></p> +<p id="t366" class="stm mis"> <span class="key">return</span> <span class="nam">open</span><span class="op">(</span><span class="nam">fname</span><span class="op">,</span> <span class="nam">mode</span><span class="op">,</span> <span class="op">**</span><span class="nam">opts</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t367" class="pln"><span class="strut"> </span></p> +<p id="t368" class="stm run hide_run"> <span class="key">def</span> <span class="nam">openInputFile</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">fname</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t369" class="pln"> <span class="str">""" Open an input file. """</span><span class="strut"> </span></p> +<p id="t370" class="stm mis"> <span class="key">if</span> <span class="nam">fname</span> <span class="op">==</span> <span class="str">"-"</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t371" class="stm mis"> <span class="key">return</span> <span class="nam">sys</span><span class="op">.</span><span class="nam">stdin</span><span class="strut"> </span></p> +<p id="t372" class="pln"> <span class="key">else</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t373" class="stm mis"> <span class="nam">opts</span> <span class="op">=</span> <span class="op">{</span><span class="op">}</span><span class="strut"> </span></p> +<p id="t374" class="stm mis"> <span class="key">if</span> <span class="nam">PY3</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t375" class="stm mis"> <span class="nam">opts</span><span class="op">[</span><span class="str">'encoding'</span><span class="op">]</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">sEncoding</span><span class="strut"> </span></p> +<p id="t376" class="stm mis"> <span class="key">return</span> <span class="nam">open</span><span class="op">(</span><span class="nam">fname</span><span class="op">,</span> <span class="str">"r"</span><span class="op">,</span> <span class="op">**</span><span class="nam">opts</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t377" class="pln"><span class="strut"> </span></p> +<p id="t378" 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="t379" class="pln"> <span class="str">""" Process an input file object to an output file object.</span><span class="strut"> </span></p> +<p id="t380" class="pln"><span class="str"> fIn and fOut can be file objects, or file names.</span><span class="strut"> </span></p> +<p id="t381" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t382" class="pln"><span class="strut"> </span></p> +<p id="t383" 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="t384" 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="t385" 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="t386" class="pln"> <span class="com"># Convert filenames to files.</span><span class="strut"> </span></p> +<p id="t387" class="stm par run hide_run"><span class="annotate" title="Line 387 was executed, but never jumped to line 389">387 ↛ 389 [?]</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">string_types</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t388" class="pln"> <span class="com"># Open the input file.</span><span class="strut"> </span></p> +<p id="t389" class="stm mis"> <span class="nam">sFileIn</span> <span class="op">=</span> <span class="nam">fIn</span><span class="strut"> </span></p> +<p id="t390" class="stm mis"> <span class="nam">fIn</span> <span class="op">=</span> <span class="nam">fInToClose</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">openInputFile</span><span class="op">(</span><span class="nam">fIn</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t391" class="stm par run hide_run"><span class="annotate" title="Line 391 was executed, but never jumped to line 393">391 ↛ 393 [?]</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">string_types</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t392" class="pln"> <span class="com"># Open the output file.</span><span class="strut"> </span></p> +<p id="t393" class="stm mis"> <span class="nam">sFileOut</span> <span class="op">=</span> <span class="nam">fOut</span><span class="strut"> </span></p> +<p id="t394" class="stm mis"> <span class="nam">fOut</span> <span class="op">=</span> <span class="nam">fOutToClose</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">openOutputFile</span><span class="op">(</span><span class="nam">fOut</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t395" class="pln"><span class="strut"> </span></p> +<p id="t396" class="stm run hide_run"> <span class="key">try</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t397" 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="t398" class="pln"><span class="strut"> </span></p> +<p id="t399" 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="t400" class="pln"><span class="strut"> </span></p> +<p id="t401" 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="t402" 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="t403" class="pln"><span class="strut"> </span></p> +<p id="t404" class="pln"> <span class="com"># The globals dict we'll use for this file.</span><span class="strut"> </span></p> +<p id="t405" class="stm par run hide_run"><span class="annotate" title="Line 405 was executed, but never jumped to line 409">405 ↛ 409 [?]</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="t406" 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="t407" class="pln"><span class="strut"> </span></p> +<p id="t408" class="pln"> <span class="com"># If there are any global defines, put them in the globals.</span><span class="strut"> </span></p> +<p id="t409" 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="t410" class="pln"><span class="strut"> </span></p> +<p id="t411" class="pln"> <span class="com"># loop over generator chunks</span><span class="strut"> </span></p> +<p id="t412" 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="t413" 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="t414" class="pln"> <span class="com"># Find the next spec begin</span><span class="strut"> </span></p> +<p id="t415" 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="t416" class="stm par run hide_run"><span class="annotate" title="Line 416 was executed, but never jumped to line 417">416 ↛ 417 [?]</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="t417" 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">options</span><span class="op">.</span><span class="nam">sEndSpec</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t418" 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="t419" class="stm par run hide_run"><span class="annotate" title="Line 419 was executed, but never jumped to line 420">419 ↛ 420 [?]</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="t420" 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">options</span><span class="op">.</span><span class="nam">sEndOutput</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t421" 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="t422" 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="t423" 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="t424" 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="t425" class="stm run hide_run"> <span class="key">break</span><span class="strut"> </span></p> +<p id="t426" class="stm par run hide_run"><span class="annotate" title="Line 426 was executed, but never jumped to line 430">426 ↛ 430 [?]</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="t427" 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="t428" class="pln"><span class="strut"> </span></p> +<p id="t429" class="pln"> <span class="com"># l is the begin spec</span><span class="strut"> </span></p> +<p id="t430" 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="t431" 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="t432" 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="t433" 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="t434" 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="t435" class="pln"><span class="strut"> </span></p> +<p id="t436" 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="t437" class="pln"> <span class="com"># line of code inside.</span><span class="strut"> </span></p> +<p id="t438" 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="t439" class="stm run hide_run"> <span class="nam">beg</span> <span class="op">=</span> <span class="nam">l</span><span class="op">.</span><span class="nam">find</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">sBeginSpec</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t440" class="stm run hide_run"> <span class="nam">end</span> <span class="op">=</span> <span class="nam">l</span><span class="op">.</span><span class="nam">find</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">sEndSpec</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t441" 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="t442" 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="t443" 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="t444" class="pln"> <span class="key">else</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t445" 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">options</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="t446" 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="t447" class="pln"> <span class="key">else</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t448" class="pln"> <span class="com"># Deal with an ordinary code block.</span><span class="strut"> </span></p> +<p id="t449" 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="t450" class="pln"><span class="strut"> </span></p> +<p id="t451" class="pln"> <span class="com"># Get all the lines in the spec</span><span class="strut"> </span></p> +<p id="t452" 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="t453" class="stm par run hide_run"><span class="annotate" title="Line 453 was executed, but never jumped to line 454">453 ↛ 454 [?]</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="t454" 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">options</span><span class="op">.</span><span class="nam">sBeginSpec</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t455" 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="t456" class="stm par run hide_run"><span class="annotate" title="Line 456 was executed, but never jumped to line 457">456 ↛ 457 [?]</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="t457" 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">options</span><span class="op">.</span><span class="nam">sEndOutput</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t458" 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="t459" class="stm par run hide_run"><span class="annotate" title="Line 459 was executed, but never jumped to line 461">459 ↛ 461 [?]</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="t460" 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="t461" 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="t462" 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="t463" class="stm par run hide_run"><span class="annotate" title="Line 463 was executed, but never jumped to line 464">463 ↛ 464 [?]</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="t464" class="stm mis"> <span class="key">raise</span> <span class="nam">CogError</span><span class="op">(</span><span class="strut"> </span></p> +<p id="t465" class="pln"> <span class="str">"Cog block begun but never ended."</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t466" 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="t467" class="pln"><span class="strut"> </span></p> +<p id="t468" class="stm par run hide_run"><span class="annotate" title="Line 468 was executed, but never jumped to line 470">468 ↛ 470 [?]</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="t469" 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="t470" 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="t471" class="pln"><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="pln"> <span class="com"># Eat all the lines in the output section. While reading past</span><span class="strut"> </span></p> +<p id="t475" class="pln"> <span class="com"># them, compute the md5 hash of the old output.</span><span class="strut"> </span></p> +<p id="t476" class="stm run hide_run"> <span class="nam">previous</span> <span class="op">=</span> <span class="str">""</span><span class="strut"> </span></p> +<p id="t477" class="stm run hide_run"> <span class="nam">hasher</span> <span class="op">=</span> <span class="nam">hashlib</span><span class="op">.</span><span class="nam">md5</span><span class="op">(</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t478" 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="t479" class="stm par run hide_run"><span class="annotate" title="Line 479 was executed, but never jumped to line 480">479 ↛ 480 [?]</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="t480" 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">options</span><span class="op">.</span><span class="nam">sBeginSpec</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t481" 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="t482" class="stm par run hide_run"><span class="annotate" title="Line 482 was executed, but never jumped to line 483">482 ↛ 483 [?]</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="t483" 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">options</span><span class="op">.</span><span class="nam">sEndSpec</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t484" 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="t485" class="stm run hide_run"> <span class="nam">previous</span> <span class="op">+=</span> <span class="nam">l</span><span class="strut"> </span></p> +<p id="t486" 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">to_bytes</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="t487" 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="t488" 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="t489" class="pln"><span class="strut"> </span></p> +<p id="t490" class="stm par run hide_run"><span class="annotate" title="Line 490 was executed, but never jumped to line 492">490 ↛ 492 [?]</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="t491" 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="t492" 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">options</span><span class="op">.</span><span class="nam">sEndOutput</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t493" 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="t494" class="pln"><span class="strut"> </span></p> +<p id="t495" class="pln"> <span class="com"># Make the previous output available to the current code</span><span class="strut"> </span></p> +<p id="t496" 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">previous</span> <span class="op">=</span> <span class="nam">previous</span><span class="strut"> </span></p> +<p id="t497" class="pln"><span class="strut"> </span></p> +<p id="t498" 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="t499" class="pln"> <span class="com"># supposed to generate code.</span><span class="strut"> </span></p> +<p id="t500" class="stm run hide_run"> <span class="nam">hasher</span> <span class="op">=</span> <span class="nam">hashlib</span><span class="op">.</span><span class="nam">md5</span><span class="op">(</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t501" class="stm par run hide_run"><span class="annotate" title="Line 501 was executed, but never jumped to line 507">501 ↛ 507 [?]</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="t502" 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="t503" 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="t504" 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="t505" 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">to_bytes</span><span class="op">(</span><span class="nam">sGen</span><span class="op">)</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t506" 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="t507" 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="t508" class="pln"><span class="strut"> </span></p> +<p id="t509" 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="t510" class="pln"><span class="strut"> </span></p> +<p id="t511" class="pln"> <span class="com"># Write the ending output line</span><span class="strut"> </span></p> +<p id="t512" 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="t513" class="stm par run hide_run"><span class="annotate" title="Line 513 was executed, but never jumped to line 514">513 ↛ 514 [?]</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="t514" class="stm mis"> <span class="key">if</span> <span class="nam">hashMatch</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t515" 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="t516" 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="t517" 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="t518" 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="t519" class="pln"> <span class="com"># Create a new end line with the correct hash.</span><span class="strut"> </span></p> +<p id="t520" 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="t521" class="pln"> <span class="key">else</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t522" class="pln"> <span class="com"># There was no old hash, but we want a new hash.</span><span class="strut"> </span></p> +<p id="t523" 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">options</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="t524" 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="t525" class="pln"> <span class="key">else</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t526" 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="t527" class="pln"> <span class="com"># it.</span><span class="strut"> </span></p> +<p id="t528" class="stm par run hide_run"><span class="annotate" title="Line 528 was executed, but never jumped to line 529">528 ↛ 529 [?]</span> <span class="key">if</span> <span class="nam">hashMatch</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t529" 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="t530" class="pln"><span class="strut"> </span></p> +<p id="t531" class="stm par run hide_run"><span class="annotate" title="Line 531 was executed, but never jumped to line 533">531 ↛ 533 [?]</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="t532" 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="t533" 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="t534" class="pln"><span class="strut"> </span></p> +<p id="t535" class="stm par run hide_run"><span class="annotate" title="Line 535 was executed, but never jumped to line 536">535 ↛ 536 [?]</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="t536" 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="t537" class="pln"> <span class="key">finally</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t538" class="stm par run hide_run"><span class="annotate" title="Line 538 was executed, but never jumped to line 539">538 ↛ 539 [?]</span> <span class="key">if</span> <span class="nam">fInToClose</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t539" 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="t540" class="stm par run hide_run"><span class="annotate" title="Line 540 was executed, but never jumped to line 541">540 ↛ 541 [?]</span> <span class="key">if</span> <span class="nam">fOutToClose</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t541" 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="t542" class="pln"><span class="strut"> </span></p> +<p id="t543" class="pln"><span class="strut"> </span></p> +<p id="t544" class="pln"> <span class="com"># A regex for non-empty lines, used by suffixLines.</span><span class="strut"> </span></p> +<p id="t545" 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="t546" class="pln"><span class="strut"> </span></p> +<p id="t547" 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="t548" 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="t549" class="pln"><span class="str"> text is many lines, as a single string.</span><span class="strut"> </span></p> +<p id="t550" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t551" class="stm par run hide_run"><span class="annotate" title="Line 551 was executed, but never jumped to line 553">551 ↛ 553 [?]</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="t552" 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="t553" 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="t554" 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="t555" class="stm run hide_run"> <span class="key">return</span> <span class="nam">text</span><span class="strut"> </span></p> +<p id="t556" class="pln"><span class="strut"> </span></p> +<p id="t557" 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="t558" class="pln"> <span class="str">""" Process sInput as the text to cog.</span><span class="strut"> </span></p> +<p id="t559" class="pln"><span class="str"> Return the cogged output as a string.</span><span class="strut"> </span></p> +<p id="t560" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t561" 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="t562" 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="t563" 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="t564" 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="t565" class="pln"><span class="strut"> </span></p> +<p id="t566" 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="t567" class="pln"> <span class="str">""" Replace file sOldPath with the contents sNewText</span><span class="strut"> </span></p> +<p id="t568" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t569" 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="t570" class="pln"> <span class="com"># Need to ensure we can write.</span><span class="strut"> </span></p> +<p id="t571" 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="t572" class="pln"> <span class="com"># Use an external command to make the file writable.</span><span class="strut"> </span></p> +<p id="t573" 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="t574" 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="t575" 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="t576" 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="t577" class="pln"> <span class="key">else</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t578" class="pln"> <span class="com"># Can't write!</span><span class="strut"> </span></p> +<p id="t579" 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="t580" class="stm mis"> <span class="nam">f</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">openOutputFile</span><span class="op">(</span><span class="nam">sOldPath</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t581" 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="t582" 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="t583" class="pln"><span class="strut"> </span></p> +<p id="t584" 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="t585" 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="t586" 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="t587" class="pln"><span class="strut"> </span></p> +<p id="t588" 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="t589" 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="t590" 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="t591" 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="t592" class="pln"><span class="strut"> </span></p> +<p id="t593" 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="t594" 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="t595" 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="t596" class="pln"><span class="strut"> </span></p> +<p id="t597" 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="t598" class="pln"> <span class="str">""" Process one filename through cog.</span><span class="strut"> </span></p> +<p id="t599" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t600" class="pln"><span class="strut"> </span></p> +<p id="t601" 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="t602" class="stm mis"> <span class="nam">bNeedNewline</span> <span class="op">=</span> <span class="nam">False</span><span class="strut"> </span></p> +<p id="t603" class="pln"><span class="strut"> </span></p> +<p id="t604" class="stm mis"> <span class="key">try</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t605" 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="t606" class="pln"> <span class="com"># Since we know where the input file came from,</span><span class="strut"> </span></p> +<p id="t607" class="pln"> <span class="com"># push its directory onto the include path.</span><span class="strut"> </span></p> +<p id="t608" 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="t609" class="pln"><span class="strut"> </span></p> +<p id="t610" 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="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="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="t613" 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="t614" class="pln"> <span class="com"># We want to replace the cog file with the output,</span><span class="strut"> </span></p> +<p id="t615" class="pln"> <span class="com"># but only if they differ.</span><span class="strut"> </span></p> +<p id="t616" 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">verbosity</span> <span class="op">>=</span> <span class="num">2</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t617" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">prout</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="nam">end</span><span class="op">=</span><span class="str">""</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t618" class="stm mis"> <span class="nam">bNeedNewline</span> <span class="op">=</span> <span class="nam">True</span><span class="strut"> </span></p> +<p id="t619" class="pln"><span class="strut"> </span></p> +<p id="t620" class="stm mis"> <span class="key">try</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t621" class="stm mis"> <span class="nam">fOldFile</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">openInputFile</span><span class="op">(</span><span class="nam">sFile</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t622" 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="t623" 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="t624" 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="t625" 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="t626" 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">verbosity</span> <span class="op">>=</span> <span class="num">1</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t627" 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">verbosity</span> <span class="op"><</span> <span class="num">2</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">prout</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="nam">end</span><span class="op">=</span><span class="str">""</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">prout</span><span class="op">(</span><span class="str">" (changed)"</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t630" class="stm mis"> <span class="nam">bNeedNewline</span> <span class="op">=</span> <span class="nam">False</span><span class="strut"> </span></p> +<p id="t631" 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="t632" class="pln"> <span class="key">finally</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t633" 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="t634" class="pln"> <span class="com"># with the name of the file, and print (changed) on the</span><span class="strut"> </span></p> +<p id="t635" class="pln"> <span class="com"># same line, but also make sure to break the line before</span><span class="strut"> </span></p> +<p id="t636" class="pln"> <span class="com"># any traceback.</span><span class="strut"> </span></p> +<p id="t637" class="stm mis"> <span class="key">if</span> <span class="nam">bNeedNewline</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t638" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">prout</span><span class="op">(</span><span class="str">""</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t639" class="pln"> <span class="key">else</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">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="t641" class="pln"> <span class="key">finally</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">restoreIncludePath</span><span class="op">(</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">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="t645" class="pln"> <span class="str">""" Process the files in a file list.</span><span class="strut"> </span></p> +<p id="t646" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t647" class="stm mis"> <span class="nam">flist</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">openInputFile</span><span class="op">(</span><span class="nam">sFileList</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t648" 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="t649" 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="t650" 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="t651" class="pln"> <span class="com"># Use shlex to parse the line like a shell.</span><span class="strut"> </span></p> +<p id="t652" 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="t653" 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="t654" 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="t655" class="pln"> <span class="com"># No escapes, so that backslash can be part of the path</span><span class="strut"> </span></p> +<p id="t656" 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="t657" 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="t658" class="stm mis"> <span class="key">if</span> <span class="nam">args</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">processArguments</span><span class="op">(</span><span class="nam">args</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t660" class="pln"><span class="strut"> </span></p> +<p id="t661" 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="t662" class="pln"> <span class="str">""" Process one command-line.</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">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="t665" 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="t666" class="pln"><span class="strut"> </span></p> +<p id="t667" 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="t668" 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="t669" class="pln"><span class="strut"> </span></p> +<p id="t670" 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="t671" 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="t672" 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="t673" 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="t674" class="pln"> <span class="key">else</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">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="t676" class="pln"><span class="strut"> </span></p> +<p id="t677" 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="t678" class="pln"><span class="strut"> </span></p> +<p id="t679" 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="t680" class="pln"> <span class="str">""" All of command-line cog, but in a callable form.</span><span class="strut"> </span></p> +<p id="t681" class="pln"><span class="str"> This is used by main.</span><span class="strut"> </span></p> +<p id="t682" class="pln"><span class="str"> argv is the equivalent of sys.argv.</span><span class="strut"> </span></p> +<p id="t683" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t684" class="stm mis"> <span class="nam">argv</span> <span class="op">=</span> <span class="nam">argv</span><span class="op">[</span><span class="num">1</span><span class="op">:</span><span class="op">]</span><span class="strut"> </span></p> +<p id="t685" class="pln"><span class="strut"> </span></p> +<p id="t686" class="pln"> <span class="com"># Provide help if asked for anywhere in the command line.</span><span class="strut"> </span></p> +<p id="t687" 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="t688" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">prerr</span><span class="op">(</span><span class="nam">usage</span><span class="op">,</span> <span class="nam">end</span><span class="op">=</span><span class="str">""</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t689" class="stm mis"> <span class="key">return</span><span class="strut"> </span></p> +<p id="t690" class="pln"><span class="strut"> </span></p> +<p id="t691" 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="t692" 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="t693" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">_fixEndOutputPatterns</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">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="t696" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">prout</span><span class="op">(</span><span class="str">"Cog version %s"</span> <span class="op">%</span> <span class="nam">__version__</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t697" class="stm mis"> <span class="key">return</span><span class="strut"> </span></p> +<p id="t698" class="pln"><span class="strut"> </span></p> +<p id="t699" 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="t700" 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="t701" 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="t702" class="pln"> <span class="key">else</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t703" 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="t704" class="pln"><span class="strut"> </span></p> +<p id="t705" 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="t706" class="pln"> <span class="str">""" Handle the command-line execution for cog.</span><span class="strut"> </span></p> +<p id="t707" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t708" class="pln"><span class="strut"> </span></p> +<p id="t709" class="stm mis"> <span class="key">try</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t710" 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="t711" class="stm mis"> <span class="key">return</span> <span class="num">0</span><span class="strut"> </span></p> +<p id="t712" class="stm mis"> <span class="key">except</span> <span class="nam">CogUsageError</span> <span class="key">as</span> <span class="nam">err</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t713" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">prerr</span><span class="op">(</span><span class="nam">err</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">prerr</span><span class="op">(</span><span class="str">"(for help use -?)"</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t715" class="stm mis"> <span class="key">return</span> <span class="num">2</span><span class="strut"> </span></p> +<p id="t716" class="stm mis"> <span class="key">except</span> <span class="nam">CogGeneratedError</span> <span class="key">as</span> <span class="nam">err</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t717" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">prerr</span><span class="op">(</span><span class="str">"Error: %s"</span> <span class="op">%</span> <span class="nam">err</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t718" class="stm mis"> <span class="key">return</span> <span class="num">3</span><span class="strut"> </span></p> +<p id="t719" class="stm mis"> <span class="key">except</span> <span class="nam">CogError</span> <span class="key">as</span> <span class="nam">err</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t720" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">prerr</span><span class="op">(</span><span class="nam">err</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t721" class="stm mis"> <span class="key">return</span> <span class="num">1</span><span class="strut"> </span></p> +<p id="t722" class="stm mis"> <span class="key">except</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t723" 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="t724" class="stm mis"> <span class="key">return</span> <span class="num">1</span><span class="strut"> </span></p> +<p id="t725" class="pln"><span class="strut"> </span></p> +<p id="t726" class="pln"><span class="com"># History:</span><span class="strut"> </span></p> +<p id="t727" class="pln"><span class="com"># 20040210: First public version.</span><span class="strut"> </span></p> +<p id="t728" 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="t729" class="pln"><span class="com"># -v option on the command line shows the version.</span><span class="strut"> </span></p> +<p id="t730" 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="t731" class="pln"><span class="com"># 20040605: Fixed some blank line handling in cog.</span><span class="strut"> </span></p> +<p id="t732" class="pln"><span class="com"># Fixed problems with assigning to xml elements in handyxml.</span><span class="strut"> </span></p> +<p id="t733" class="pln"><span class="com"># 20040621: Changed all line-ends to LF from CRLF.</span><span class="strut"> </span></p> +<p id="t734" class="pln"><span class="com"># 20041002: Refactor some option handling to simplify unittesting the options.</span><span class="strut"> </span></p> +<p id="t735" class="pln"><span class="com"># 20041118: cog.out and cog.outl have optional string arguments.</span><span class="strut"> </span></p> +<p id="t736" 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="t737" 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="t738" 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="t739" 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="t740" class="pln"><span class="com"># the same line.</span><span class="strut"> </span></p> +<p id="t741" 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="t742" class="pln"><span class="com"># file so they can share state.</span><span class="strut"> </span></p> +<p id="t743" class="pln"><span class="com"># 20050206: Added the -x switch to remove all generated output.</span><span class="strut"> </span></p> +<p id="t744" class="pln"><span class="com"># 20050218: Now code can be on the marker lines as well.</span><span class="strut"> </span></p> +<p id="t745" 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="t746" class="pln"><span class="com"># detected before they are obliterated.</span><span class="strut"> </span></p> +<p id="t747" class="pln"><span class="com"># 20050521: Added cog.error, contributed by Alexander Belchenko.</span><span class="strut"> </span></p> +<p id="t748" class="pln"><span class="com"># 20050720: Added code deletion and settable globals contributed by Blake Winton.</span><span class="strut"> </span></p> +<p id="t749" class="pln"><span class="com"># 20050724: Many tweaks to improve code coverage.</span><span class="strut"> </span></p> +<p id="t750" class="pln"><span class="com"># 20050726: Error messages are now printed with no traceback.</span><span class="strut"> </span></p> +<p id="t751" class="pln"><span class="com"># Code can no longer appear on the marker lines,</span><span class="strut"> </span></p> +<p id="t752" class="pln"><span class="com"># except for single-line style.</span><span class="strut"> </span></p> +<p id="t753" 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="t754" class="pln"><span class="com"># at the end of the file.</span><span class="strut"> </span></p> +<p id="t755" class="pln"><span class="com"># 20050729: Refactor option parsing into a separate class, in preparation for</span><span class="strut"> </span></p> +<p id="t756" class="pln"><span class="com"># future features.</span><span class="strut"> </span></p> +<p id="t757" class="pln"><span class="com"># 20050805: The cogmodule.path wasn't being properly maintained.</span><span class="strut"> </span></p> +<p id="t758" class="pln"><span class="com"># 20050808: Added the -D option to define a global value.</span><span class="strut"> </span></p> +<p id="t759" 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="t760" class="pln"><span class="com"># Added the -s option to suffix output lines with a marker.</span><span class="strut"> </span></p> +<p id="t761" 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="t762" class="pln"><span class="com"># behavior for that line.</span><span class="strut"> </span></p> +<p id="t763" class="pln"><span class="com"># 20051006: Version 2.0</span><span class="strut"> </span></p> +<p id="t764" class="pln"><span class="com"># 20080521: -U options lets you create Unix newlines on Windows. Thanks,</span><span class="strut"> </span></p> +<p id="t765" class="pln"><span class="com"># Alexander Belchenko.</span><span class="strut"> </span></p> +<p id="t766" 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="t767" class="pln"><span class="com"># the args after each line of an @file.</span><span class="strut"> </span></p> +<p id="t768" class="pln"><span class="com"># 20090520: Use hashlib where it's available, to avoid a warning.</span><span class="strut"> </span></p> +<p id="t769" class="pln"><span class="com"># Use the builtin compile() instead of compiler, for Jython.</span><span class="strut"> </span></p> +<p id="t770" class="pln"><span class="com"># Explicitly close files we opened, Jython likes this.</span><span class="strut"> </span></p> +<p id="t771" class="pln"><span class="com"># 20120205: Port to Python 3. Lowest supported version is 2.6.</span><span class="strut"> </span></p> +<p id="t772" class="pln"><span class="com"># 20150104: --markers option added by Doug Hellmann.</span><span class="strut"> </span></p> +<p id="t773" class="pln"><span class="com"># 20150104: -n ENCODING option added by Petr Gladkiy.</span><span class="strut"> </span></p> +<p id="t774" class="pln"><span class="com"># 20150107: Added --verbose to control what files get listed.</span><span class="strut"> </span></p> +<p id="t775" class="pln"><span class="com"># 20150111: Version 2.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="https://coverage.readthedocs.org">coverage.py v4.0.3</a>, + created at 2015-11-24 07:02 + </p> + </div> +</div> + +</body> +</html> diff --git a/doc/sample_html/cogapp_makefiles.html b/doc/sample_html/cogapp_makefiles.html deleted file mode 100644 index 62bde7ac..00000000 --- a/doc/sample_html/cogapp_makefiles.html +++ /dev/null @@ -1,210 +0,0 @@ -<!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 cogapp/makefiles: 19%</title> - <link rel='stylesheet' href='style.css' type='text/css'> - - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript' charset='utf-8'> - jQuery(document).ready(coverage.pyfile_ready); - </script> -</head> -<body id='pyfile'> - -<div id='header'> - <div class='content'> - <h1>Coverage for <b>cogapp/makefiles</b> : - <span class='pc_cov'>19%</span> - </h1> - <img id='keyboard_icon' src='keybd_closed.png'> - <h2 class='stats'> - 28 statements - <span class='run hide_run shortkey_r button_toggle_run'>8 run</span> - <span class='mis shortkey_m button_toggle_mis'>20 missing</span> - <span class='exc shortkey_x button_toggle_exc'>3 excluded</span> - - <span class='par run hide_run shortkey_p button_toggle_par'>0 partial</span> - - </h2> - </div> -</div> - -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png'> -<p class='legend'>Hot-keys on this page</p> - <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays - </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk - </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page - </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk - </p> - </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='pln'><a href='#n3'>3</a></p> -<p id='n4' class='pln'><a href='#n4'>4</a></p> -<p id='n5' class='pln'><a href='#n5'>5</a></p> -<p id='n6' class='pln'><a href='#n6'>6</a></p> -<p id='n7' class='stm run hide_run'><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> -<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='stm run hide_run'><a href='#n13'>13</a></p> -<p id='n14' class='pln'><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='pln'><a href='#n17'>17</a></p> -<p id='n18' class='stm mis'><a href='#n18'>18</a></p> -<p id='n19' class='stm mis'><a href='#n19'>19</a></p> -<p id='n20' class='stm mis'><a href='#n20'>20</a></p> -<p id='n21' class='stm mis'><a href='#n21'>21</a></p> -<p id='n22' class='stm mis'><a href='#n22'>22</a></p> -<p id='n23' class='stm mis'><a href='#n23'>23</a></p> -<p id='n24' class='stm mis'><a href='#n24'>24</a></p> -<p id='n25' class='stm mis'><a href='#n25'>25</a></p> -<p id='n26' class='stm mis'><a href='#n26'>26</a></p> -<p id='n27' class='stm mis'><a href='#n27'>27</a></p> -<p id='n28' class='pln'><a href='#n28'>28</a></p> -<p id='n29' class='stm mis'><a href='#n29'>29</a></p> -<p id='n30' class='stm mis'><a href='#n30'>30</a></p> -<p id='n31' class='stm mis'><a href='#n31'>31</a></p> -<p id='n32' class='pln'><a href='#n32'>32</a></p> -<p id='n33' class='stm run hide_run'><a href='#n33'>33</a></p> -<p id='n34' class='pln'><a href='#n34'>34</a></p> -<p id='n35' class='pln'><a href='#n35'>35</a></p> -<p id='n36' class='pln'><a href='#n36'>36</a></p> -<p id='n37' class='stm mis'><a href='#n37'>37</a></p> -<p id='n38' class='stm mis'><a href='#n38'>38</a></p> -<p id='n39' class='stm mis'><a href='#n39'>39</a></p> -<p id='n40' class='stm mis'><a href='#n40'>40</a></p> -<p id='n41' class='pln'><a href='#n41'>41</a></p> -<p id='n42' class='stm mis'><a href='#n42'>42</a></p> -<p id='n43' class='stm mis'><a href='#n43'>43</a></p> -<p id='n44' class='stm mis'><a href='#n44'>44</a></p> -<p id='n45' class='pln'><a href='#n45'>45</a></p> -<p id='n46' class='exc'><a href='#n46'>46</a></p> -<p id='n47' class='pln'><a href='#n47'>47</a></p> -<p id='n48' class='exc'><a href='#n48'>48</a></p> -<p id='n49' class='pln'><a href='#n49'>49</a></p> -<p id='n50' class='pln'><a href='#n50'>50</a></p> -<p id='n51' class='pln'><a href='#n51'>51</a></p> -<p id='n52' class='pln'><a href='#n52'>52</a></p> -<p id='n53' class='pln'><a href='#n53'>53</a></p> -<p id='n54' class='pln'><a href='#n54'>54</a></p> -<p id='n55' class='pln'><a href='#n55'>55</a></p> -<p id='n56' class='pln'><a href='#n56'>56</a></p> -<p id='n57' class='pln'><a href='#n57'>57</a></p> -<p id='n58' class='pln'><a href='#n58'>58</a></p> -<p id='n59' class='pln'><a href='#n59'>59</a></p> -<p id='n60' class='pln'><a href='#n60'>60</a></p> -<p id='n61' class='pln'><a href='#n61'>61</a></p> -<p id='n62' class='pln'><a href='#n62'>62</a></p> -<p id='n63' class='exc'><a href='#n63'>63</a></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-2012, 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'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>absolute_import</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'>path</span><span class='strut'> </span></p> -<p id='t9' class='stm run hide_run'><span class='key'>from</span> <span class='op'>.</span><span class='nam'>whiteutils</span> <span class='key'>import</span> <span class='nam'>reindentBlock</span><span class='strut'> </span></p> -<p id='t10' class='stm run hide_run'><span class='key'>from</span> <span class='op'>.</span><span class='nam'>backward</span> <span class='key'>import</span> <span class='nam'>string_types</span><span class='op'>,</span> <span class='nam'>bytes_types</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='nam'>__version__</span> <span class='op'>=</span> <span class='str'>'1.0.20040126'</span><span class='strut'> </span></p> -<p id='t13' 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='t14' class='pln'><span class='strut'> </span></p> -<p id='t15' 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='op'>:</span><span class='strut'> </span></p> -<p id='t16' class='pln'> <span class='str'>""" Create files from the dictionary `d`, in the directory named by `basedir`.</span><span class='strut'> </span></p> -<p id='t17' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t18' 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='t19' class='stm mis'> <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'>join</span><span class='op'>(</span><span class='nam'>basedir</span><span class='op'>,</span> <span class='nam'>name</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t20' 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'>string_types</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t21' class='stm mis'> <span class='nam'>mode</span> <span class='op'>=</span> <span class='str'>'w'</span><span class='strut'> </span></p> -<p id='t22' 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'>bytes_types</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t23' class='stm mis'> <span class='nam'>mode</span> <span class='op'>+=</span> <span class='str'>"b"</span><span class='strut'> </span></p> -<p id='t24' 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='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'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>exists</span><span class='op'>(</span><span class='nam'>child</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t30' class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>mkdir</span><span class='op'>(</span><span class='nam'>child</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='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='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='t38' class='stm mis'> <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'>join</span><span class='op'>(</span><span class='nam'>basedir</span><span class='op'>,</span> <span class='nam'>name</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t39' 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'>string_types</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t40' class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>remove</span><span class='op'>(</span><span class='nam'>child</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t41' class='pln'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t42' 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='t43' 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'>listdir</span><span class='op'>(</span><span class='nam'>child</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t44' class='stm mis'> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>rmdir</span><span class='op'>(</span><span class='nam'>child</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t45' class='pln'><span class='strut'> </span></p> -<p id='t46' 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='t47' class='pln'> <span class='com'># Try it a little.</span><span class='strut'> </span></p> -<p id='t48' class='exc'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t49' class='pln'> <span class='str'>'test_makefiles'</span><span class='op'>:</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t50' class='pln'> <span class='str'>'hey.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t51' class='pln'><span class='str'> This is hey.txt.</span><span class='strut'> </span></p> -<p id='t52' class='pln'><span class='str'> It's very simple.</span><span class='strut'> </span></p> -<p id='t53' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t54' class='pln'> <span class='str'>'subdir'</span><span class='op'>:</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t55' class='pln'> <span class='str'>'fooey'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t56' class='pln'><span class='str'> # Fooey</span><span class='strut'> </span></p> -<p id='t57' class='pln'><span class='str'> Kablooey</span><span class='strut'> </span></p> -<p id='t58' class='pln'><span class='str'> Ew.</span><span class='strut'> </span></p> -<p id='t59' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t60' class='pln'> <span class='op'>}</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='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> - -<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.7.1</a> - </p> - </div> -</div> - -</body> -</html> diff --git a/doc/sample_html/cogapp_makefiles_py.html b/doc/sample_html/cogapp_makefiles_py.html new file mode 100644 index 00000000..a2514c8d --- /dev/null +++ b/doc/sample_html/cogapp_makefiles_py.html @@ -0,0 +1,217 @@ + + + +<!DOCTYPE html> +<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 cogapp/makefiles.py: 19.05%</title> + <link rel="stylesheet" href="style.css" type="text/css"> + + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> + jQuery(document).ready(coverage.pyfile_ready); + </script> +</head> +<body class="pyfile"> + +<div id="header"> + <div class="content"> + <h1>Coverage for <b>cogapp/makefiles.py</b> : + <span class="pc_cov">19.05%</span> + </h1> + + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> + + <h2 class="stats"> + 28 statements + <span class="run hide_run shortkey_r button_toggle_run">8 run</span> + <span class="mis shortkey_m button_toggle_mis">20 missing</span> + <span class="exc shortkey_x button_toggle_exc">3 excluded</span> + + + <span class="par run hide_run shortkey_p button_toggle_par">0 partial</span> + + </h2> + </div> +</div> + +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> + <div> +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays + </p> +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk + </p> +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page + </p> +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk + </p> + </div> +</div> + +<div id="source"> + <table> + <tr> + <td class="linenos"> +<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="pln"><a href="#n4">4</a></p> +<p id="n5" class="pln"><a href="#n5">5</a></p> +<p id="n6" class="pln"><a href="#n6">6</a></p> +<p id="n7" class="stm run hide_run"><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> +<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="stm run hide_run"><a href="#n13">13</a></p> +<p id="n14" class="pln"><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="pln"><a href="#n17">17</a></p> +<p id="n18" class="stm mis"><a href="#n18">18</a></p> +<p id="n19" class="stm mis"><a href="#n19">19</a></p> +<p id="n20" class="stm mis"><a href="#n20">20</a></p> +<p id="n21" class="stm mis"><a href="#n21">21</a></p> +<p id="n22" class="stm mis"><a href="#n22">22</a></p> +<p id="n23" class="stm mis"><a href="#n23">23</a></p> +<p id="n24" class="stm mis"><a href="#n24">24</a></p> +<p id="n25" class="stm mis"><a href="#n25">25</a></p> +<p id="n26" class="stm mis"><a href="#n26">26</a></p> +<p id="n27" class="stm mis"><a href="#n27">27</a></p> +<p id="n28" class="pln"><a href="#n28">28</a></p> +<p id="n29" class="stm mis"><a href="#n29">29</a></p> +<p id="n30" class="stm mis"><a href="#n30">30</a></p> +<p id="n31" class="stm mis"><a href="#n31">31</a></p> +<p id="n32" class="pln"><a href="#n32">32</a></p> +<p id="n33" class="stm run hide_run"><a href="#n33">33</a></p> +<p id="n34" class="pln"><a href="#n34">34</a></p> +<p id="n35" class="pln"><a href="#n35">35</a></p> +<p id="n36" class="pln"><a href="#n36">36</a></p> +<p id="n37" class="stm mis"><a href="#n37">37</a></p> +<p id="n38" class="stm mis"><a href="#n38">38</a></p> +<p id="n39" class="stm mis"><a href="#n39">39</a></p> +<p id="n40" class="stm mis"><a href="#n40">40</a></p> +<p id="n41" class="pln"><a href="#n41">41</a></p> +<p id="n42" class="stm mis"><a href="#n42">42</a></p> +<p id="n43" class="stm mis"><a href="#n43">43</a></p> +<p id="n44" class="stm mis"><a href="#n44">44</a></p> +<p id="n45" class="pln"><a href="#n45">45</a></p> +<p id="n46" class="exc"><a href="#n46">46</a></p> +<p id="n47" class="pln"><a href="#n47">47</a></p> +<p id="n48" class="exc"><a href="#n48">48</a></p> +<p id="n49" class="pln"><a href="#n49">49</a></p> +<p id="n50" class="pln"><a href="#n50">50</a></p> +<p id="n51" class="pln"><a href="#n51">51</a></p> +<p id="n52" class="pln"><a href="#n52">52</a></p> +<p id="n53" class="pln"><a href="#n53">53</a></p> +<p id="n54" class="pln"><a href="#n54">54</a></p> +<p id="n55" class="pln"><a href="#n55">55</a></p> +<p id="n56" class="pln"><a href="#n56">56</a></p> +<p id="n57" class="pln"><a href="#n57">57</a></p> +<p id="n58" class="pln"><a href="#n58">58</a></p> +<p id="n59" class="pln"><a href="#n59">59</a></p> +<p id="n60" class="pln"><a href="#n60">60</a></p> +<p id="n61" class="pln"><a href="#n61">61</a></p> +<p id="n62" class="pln"><a href="#n62">62</a></p> +<p id="n63" class="exc"><a href="#n63">63</a></p> + + </td> + <td class="text"> +<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="strut"> </span></p> +<p id="t4" class="pln"><span class="str"> Copyright 2004-2015, 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">from</span> <span class="nam">__future__</span> <span class="key">import</span> <span class="nam">absolute_import</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">path</span><span class="strut"> </span></p> +<p id="t9" class="stm run hide_run"><span class="key">from</span> <span class="op">.</span><span class="nam">whiteutils</span> <span class="key">import</span> <span class="nam">reindentBlock</span><span class="strut"> </span></p> +<p id="t10" class="stm run hide_run"><span class="key">from</span> <span class="op">.</span><span class="nam">backward</span> <span class="key">import</span> <span class="nam">string_types</span><span class="op">,</span> <span class="nam">bytes_types</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="nam">__version__</span> <span class="op">=</span> <span class="str">'1.0.20040126'</span><span class="strut"> </span></p> +<p id="t13" 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="t14" class="pln"><span class="strut"> </span></p> +<p id="t15" 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="op">:</span><span class="strut"> </span></p> +<p id="t16" class="pln"> <span class="str">""" Create files from the dictionary `d`, in the directory named by `basedir`.</span><span class="strut"> </span></p> +<p id="t17" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t18" 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="t19" class="stm mis"> <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">join</span><span class="op">(</span><span class="nam">basedir</span><span class="op">,</span> <span class="nam">name</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t20" 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">string_types</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t21" class="stm mis"> <span class="nam">mode</span> <span class="op">=</span> <span class="str">'w'</span><span class="strut"> </span></p> +<p id="t22" 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">bytes_types</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t23" class="stm mis"> <span class="nam">mode</span> <span class="op">+=</span> <span class="str">"b"</span><span class="strut"> </span></p> +<p id="t24" 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="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">os</span><span class="op">.</span><span class="nam">path</span><span class="op">.</span><span class="nam">exists</span><span class="op">(</span><span class="nam">child</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t30" class="stm mis"> <span class="nam">os</span><span class="op">.</span><span class="nam">mkdir</span><span class="op">(</span><span class="nam">child</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="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="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="t38" class="stm mis"> <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">join</span><span class="op">(</span><span class="nam">basedir</span><span class="op">,</span> <span class="nam">name</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t39" 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">string_types</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t40" class="stm mis"> <span class="nam">os</span><span class="op">.</span><span class="nam">remove</span><span class="op">(</span><span class="nam">child</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t41" class="pln"> <span class="key">else</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t42" 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="t43" 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">listdir</span><span class="op">(</span><span class="nam">child</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t44" class="stm mis"> <span class="nam">os</span><span class="op">.</span><span class="nam">rmdir</span><span class="op">(</span><span class="nam">child</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t45" class="pln"><span class="strut"> </span></p> +<p id="t46" 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="t47" class="pln"> <span class="com"># Try it a little.</span><span class="strut"> </span></p> +<p id="t48" class="exc"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t49" class="pln"> <span class="str">'test_makefiles'</span><span class="op">:</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t50" class="pln"> <span class="str">'hey.txt'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t51" class="pln"><span class="str"> This is hey.txt.</span><span class="strut"> </span></p> +<p id="t52" class="pln"><span class="str"> It's very simple.</span><span class="strut"> </span></p> +<p id="t53" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t54" class="pln"> <span class="str">'subdir'</span><span class="op">:</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t55" class="pln"> <span class="str">'fooey'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t56" class="pln"><span class="str"> # Fooey</span><span class="strut"> </span></p> +<p id="t57" class="pln"><span class="str"> Kablooey</span><span class="strut"> </span></p> +<p id="t58" class="pln"><span class="str"> Ew.</span><span class="strut"> </span></p> +<p id="t59" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t60" class="pln"> <span class="op">}</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="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> + +<div id="footer"> + <div class="content"> + <p> + <a class="nav" href="index.html">« index</a> <a class="nav" href="https://coverage.readthedocs.org">coverage.py v4.0.3</a>, + created at 2015-11-24 07:02 + </p> + </div> +</div> + +</body> +</html> diff --git a/doc/sample_html/cogapp_test_cogapp.html b/doc/sample_html/cogapp_test_cogapp.html deleted file mode 100644 index 3c6696a0..00000000 --- a/doc/sample_html/cogapp_test_cogapp.html +++ /dev/null @@ -1,4160 +0,0 @@ -<!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 cogapp/test_cogapp: 34%</title> - <link rel='stylesheet' href='style.css' type='text/css'> - - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript' charset='utf-8'> - jQuery(document).ready(coverage.pyfile_ready); - </script> -</head> -<body id='pyfile'> - -<div id='header'> - <div class='content'> - <h1>Coverage for <b>cogapp/test_cogapp</b> : - <span class='pc_cov'>34%</span> - </h1> - <img id='keyboard_icon' src='keybd_closed.png'> - <h2 class='stats'> - 612 statements - <span class='run hide_run shortkey_r button_toggle_run'>208 run</span> - <span class='mis shortkey_m button_toggle_mis'>404 missing</span> - <span class='exc shortkey_x button_toggle_exc'>17 excluded</span> - - <span class='par run hide_run shortkey_p button_toggle_par'>0 partial</span> - - </h2> - </div> -</div> - -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png'> -<p class='legend'>Hot-keys on this page</p> - <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays - </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk - </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page - </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk - </p> - </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='pln'><a href='#n3'>3</a></p> -<p id='n4' class='pln'><a href='#n4'>4</a></p> -<p id='n5' class='pln'><a href='#n5'>5</a></p> -<p id='n6' class='pln'><a href='#n6'>6</a></p> -<p id='n7' class='stm run hide_run'><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> -<p id='n11' class='stm run hide_run'><a href='#n11'>11</a></p> -<p id='n12' class='stm run hide_run'><a href='#n12'>12</a></p> -<p id='n13' class='stm run hide_run'><a href='#n13'>13</a></p> -<p id='n14' class='stm 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='pln'><a href='#n19'>19</a></p> -<p id='n20' class='stm run hide_run'><a href='#n20'>20</a></p> -<p id='n21' class='pln'><a href='#n21'>21</a></p> -<p id='n22' class='pln'><a href='#n22'>22</a></p> -<p id='n23' class='pln'><a href='#n23'>23</a></p> -<p id='n24' class='stm run hide_run'><a href='#n24'>24</a></p> -<p id='n25' class='stm run hide_run'><a href='#n25'>25</a></p> -<p id='n26' class='stm run hide_run'><a href='#n26'>26</a></p> -<p id='n27' class='stm run hide_run'><a href='#n27'>27</a></p> -<p id='n28' class='stm run hide_run'><a href='#n28'>28</a></p> -<p id='n29' class='pln'><a href='#n29'>29</a></p> -<p id='n30' class='exc'><a href='#n30'>30</a></p> -<p id='n31' class='stm run hide_run'><a href='#n31'>31</a></p> -<p id='n32' class='pln'><a href='#n32'>32</a></p> -<p id='n33' class='stm run hide_run'><a href='#n33'>33</a></p> -<p id='n34' class='exc'><a href='#n34'>34</a></p> -<p id='n35' class='pln'><a href='#n35'>35</a></p> -<p id='n36' class='exc'><a href='#n36'>36</a></p> -<p id='n37' class='exc'><a href='#n37'>37</a></p> -<p id='n38' class='exc'><a href='#n38'>38</a></p> -<p id='n39' class='exc'><a href='#n39'>39</a></p> -<p id='n40' class='exc'><a href='#n40'>40</a></p> -<p id='n41' class='exc'><a href='#n41'>41</a></p> -<p id='n42' class='exc'><a href='#n42'>42</a></p> -<p id='n43' class='pln'><a href='#n43'>43</a></p> -<p id='n44' class='stm run hide_run'><a href='#n44'>44</a></p> -<p id='n45' class='pln'><a href='#n45'>45</a></p> -<p id='n46' class='pln'><a href='#n46'>46</a></p> -<p id='n47' class='pln'><a href='#n47'>47</a></p> -<p id='n48' class='stm run hide_run'><a href='#n48'>48</a></p> -<p id='n49' class='stm run hide_run'><a href='#n49'>49</a></p> -<p id='n50' class='pln'><a href='#n50'>50</a></p> -<p id='n51' class='pln'><a href='#n51'>51</a></p> -<p id='n52' class='pln'><a href='#n52'>52</a></p> -<p id='n53' class='pln'><a href='#n53'>53</a></p> -<p id='n54' class='pln'><a href='#n54'>54</a></p> -<p id='n55' class='pln'><a href='#n55'>55</a></p> -<p id='n56' class='pln'><a href='#n56'>56</a></p> -<p id='n57' class='stm run hide_run'><a href='#n57'>57</a></p> -<p id='n58' class='stm run hide_run'><a href='#n58'>58</a></p> -<p id='n59' class='pln'><a href='#n59'>59</a></p> -<p id='n60' class='stm run hide_run'><a href='#n60'>60</a></p> -<p id='n61' class='stm run hide_run'><a href='#n61'>61</a></p> -<p id='n62' class='pln'><a href='#n62'>62</a></p> -<p id='n63' class='pln'><a href='#n63'>63</a></p> -<p id='n64' class='pln'><a href='#n64'>64</a></p> -<p id='n65' class='pln'><a href='#n65'>65</a></p> -<p id='n66' class='pln'><a href='#n66'>66</a></p> -<p id='n67' class='pln'><a href='#n67'>67</a></p> -<p id='n68' class='pln'><a href='#n68'>68</a></p> -<p id='n69' class='pln'><a href='#n69'>69</a></p> -<p id='n70' class='pln'><a href='#n70'>70</a></p> -<p id='n71' class='pln'><a href='#n71'>71</a></p> -<p id='n72' class='pln'><a href='#n72'>72</a></p> -<p id='n73' class='stm run hide_run'><a href='#n73'>73</a></p> -<p id='n74' class='pln'><a href='#n74'>74</a></p> -<p id='n75' class='pln'><a href='#n75'>75</a></p> -<p id='n76' class='pln'><a href='#n76'>76</a></p> -<p id='n77' class='pln'><a href='#n77'>77</a></p> -<p id='n78' class='pln'><a href='#n78'>78</a></p> -<p id='n79' class='pln'><a href='#n79'>79</a></p> -<p id='n80' class='pln'><a href='#n80'>80</a></p> -<p id='n81' class='pln'><a href='#n81'>81</a></p> -<p id='n82' class='pln'><a href='#n82'>82</a></p> -<p id='n83' class='pln'><a href='#n83'>83</a></p> -<p id='n84' class='pln'><a href='#n84'>84</a></p> -<p id='n85' class='pln'><a href='#n85'>85</a></p> -<p id='n86' class='pln'><a href='#n86'>86</a></p> -<p id='n87' class='stm run hide_run'><a href='#n87'>87</a></p> -<p id='n88' class='pln'><a href='#n88'>88</a></p> -<p id='n89' class='stm run hide_run'><a href='#n89'>89</a></p> -<p id='n90' class='pln'><a href='#n90'>90</a></p> -<p id='n91' class='pln'><a href='#n91'>91</a></p> -<p id='n92' class='stm run hide_run'><a href='#n92'>92</a></p> -<p id='n93' class='pln'><a href='#n93'>93</a></p> -<p id='n94' class='pln'><a href='#n94'>94</a></p> -<p id='n95' class='pln'><a href='#n95'>95</a></p> -<p id='n96' class='pln'><a href='#n96'>96</a></p> -<p id='n97' class='pln'><a href='#n97'>97</a></p> -<p id='n98' class='pln'><a href='#n98'>98</a></p> -<p id='n99' class='pln'><a href='#n99'>99</a></p> -<p id='n100' class='stm run hide_run'><a href='#n100'>100</a></p> -<p id='n101' class='stm run hide_run'><a href='#n101'>101</a></p> -<p id='n102' class='pln'><a href='#n102'>102</a></p> -<p id='n103' class='stm run hide_run'><a href='#n103'>103</a></p> -<p id='n104' class='pln'><a href='#n104'>104</a></p> -<p id='n105' class='stm run hide_run'><a href='#n105'>105</a></p> -<p id='n106' class='pln'><a href='#n106'>106</a></p> -<p id='n107' class='pln'><a href='#n107'>107</a></p> -<p id='n108' class='pln'><a href='#n108'>108</a></p> -<p id='n109' class='pln'><a href='#n109'>109</a></p> -<p id='n110' class='pln'><a href='#n110'>110</a></p> -<p id='n111' class='pln'><a href='#n111'>111</a></p> -<p id='n112' class='pln'><a href='#n112'>112</a></p> -<p id='n113' class='pln'><a href='#n113'>113</a></p> -<p id='n114' class='pln'><a href='#n114'>114</a></p> -<p id='n115' class='pln'><a href='#n115'>115</a></p> -<p id='n116' class='pln'><a href='#n116'>116</a></p> -<p id='n117' class='pln'><a href='#n117'>117</a></p> -<p id='n118' class='pln'><a href='#n118'>118</a></p> -<p id='n119' class='pln'><a href='#n119'>119</a></p> -<p id='n120' class='pln'><a href='#n120'>120</a></p> -<p id='n121' class='pln'><a href='#n121'>121</a></p> -<p id='n122' class='pln'><a href='#n122'>122</a></p> -<p id='n123' class='pln'><a href='#n123'>123</a></p> -<p id='n124' class='stm run hide_run'><a href='#n124'>124</a></p> -<p id='n125' class='stm run hide_run'><a href='#n125'>125</a></p> -<p id='n126' class='pln'><a href='#n126'>126</a></p> -<p id='n127' class='stm run hide_run'><a href='#n127'>127</a></p> -<p id='n128' class='stm run hide_run'><a href='#n128'>128</a></p> -<p id='n129' class='pln'><a href='#n129'>129</a></p> -<p id='n130' class='pln'><a href='#n130'>130</a></p> -<p id='n131' class='pln'><a href='#n131'>131</a></p> -<p id='n132' class='pln'><a href='#n132'>132</a></p> -<p id='n133' class='pln'><a href='#n133'>133</a></p> -<p id='n134' class='pln'><a href='#n134'>134</a></p> -<p id='n135' class='pln'><a href='#n135'>135</a></p> -<p id='n136' class='pln'><a href='#n136'>136</a></p> -<p id='n137' class='pln'><a href='#n137'>137</a></p> -<p id='n138' class='pln'><a href='#n138'>138</a></p> -<p id='n139' class='pln'><a href='#n139'>139</a></p> -<p id='n140' class='pln'><a href='#n140'>140</a></p> -<p id='n141' class='pln'><a href='#n141'>141</a></p> -<p id='n142' class='stm run hide_run'><a href='#n142'>142</a></p> -<p id='n143' class='stm run hide_run'><a href='#n143'>143</a></p> -<p id='n144' class='pln'><a href='#n144'>144</a></p> -<p id='n145' class='stm run hide_run'><a href='#n145'>145</a></p> -<p id='n146' class='stm run hide_run'><a href='#n146'>146</a></p> -<p id='n147' class='pln'><a href='#n147'>147</a></p> -<p id='n148' class='pln'><a href='#n148'>148</a></p> -<p id='n149' class='pln'><a href='#n149'>149</a></p> -<p id='n150' class='pln'><a href='#n150'>150</a></p> -<p id='n151' class='pln'><a href='#n151'>151</a></p> -<p id='n152' class='pln'><a href='#n152'>152</a></p> -<p id='n153' class='pln'><a href='#n153'>153</a></p> -<p id='n154' class='pln'><a href='#n154'>154</a></p> -<p id='n155' class='pln'><a href='#n155'>155</a></p> -<p id='n156' class='pln'><a href='#n156'>156</a></p> -<p id='n157' class='pln'><a href='#n157'>157</a></p> -<p id='n158' class='pln'><a href='#n158'>158</a></p> -<p id='n159' class='pln'><a href='#n159'>159</a></p> -<p id='n160' class='pln'><a href='#n160'>160</a></p> -<p id='n161' class='stm run hide_run'><a href='#n161'>161</a></p> -<p id='n162' class='stm run hide_run'><a href='#n162'>162</a></p> -<p id='n163' class='pln'><a href='#n163'>163</a></p> -<p id='n164' class='stm run hide_run'><a href='#n164'>164</a></p> -<p id='n165' class='pln'><a href='#n165'>165</a></p> -<p id='n166' class='pln'><a href='#n166'>166</a></p> -<p id='n167' class='stm run hide_run'><a href='#n167'>167</a></p> -<p id='n168' class='pln'><a href='#n168'>168</a></p> -<p id='n169' class='pln'><a href='#n169'>169</a></p> -<p id='n170' class='pln'><a href='#n170'>170</a></p> -<p id='n171' class='pln'><a href='#n171'>171</a></p> -<p id='n172' class='pln'><a href='#n172'>172</a></p> -<p id='n173' class='pln'><a href='#n173'>173</a></p> -<p id='n174' class='pln'><a href='#n174'>174</a></p> -<p id='n175' class='pln'><a href='#n175'>175</a></p> -<p id='n176' class='pln'><a href='#n176'>176</a></p> -<p id='n177' class='pln'><a href='#n177'>177</a></p> -<p id='n178' class='pln'><a href='#n178'>178</a></p> -<p id='n179' class='stm run hide_run'><a href='#n179'>179</a></p> -<p id='n180' class='stm run hide_run'><a href='#n180'>180</a></p> -<p id='n181' class='pln'><a href='#n181'>181</a></p> -<p id='n182' class='stm run hide_run'><a href='#n182'>182</a></p> -<p id='n183' class='stm run hide_run'><a href='#n183'>183</a></p> -<p id='n184' class='pln'><a href='#n184'>184</a></p> -<p id='n185' class='pln'><a href='#n185'>185</a></p> -<p id='n186' class='pln'><a href='#n186'>186</a></p> -<p id='n187' class='pln'><a href='#n187'>187</a></p> -<p id='n188' class='pln'><a href='#n188'>188</a></p> -<p id='n189' class='pln'><a href='#n189'>189</a></p> -<p id='n190' class='pln'><a href='#n190'>190</a></p> -<p id='n191' class='pln'><a href='#n191'>191</a></p> -<p id='n192' class='pln'><a href='#n192'>192</a></p> -<p id='n193' class='pln'><a href='#n193'>193</a></p> -<p id='n194' class='pln'><a href='#n194'>194</a></p> -<p id='n195' class='pln'><a href='#n195'>195</a></p> -<p id='n196' class='pln'><a href='#n196'>196</a></p> -<p id='n197' class='stm run hide_run'><a href='#n197'>197</a></p> -<p id='n198' class='stm run hide_run'><a href='#n198'>198</a></p> -<p id='n199' class='pln'><a href='#n199'>199</a></p> -<p id='n200' class='stm run hide_run'><a href='#n200'>200</a></p> -<p id='n201' class='stm run hide_run'><a href='#n201'>201</a></p> -<p id='n202' class='pln'><a href='#n202'>202</a></p> -<p id='n203' class='pln'><a href='#n203'>203</a></p> -<p id='n204' class='pln'><a href='#n204'>204</a></p> -<p id='n205' class='pln'><a href='#n205'>205</a></p> -<p id='n206' class='pln'><a href='#n206'>206</a></p> -<p id='n207' class='pln'><a href='#n207'>207</a></p> -<p id='n208' class='pln'><a href='#n208'>208</a></p> -<p id='n209' class='pln'><a href='#n209'>209</a></p> -<p id='n210' class='pln'><a href='#n210'>210</a></p> -<p id='n211' class='pln'><a href='#n211'>211</a></p> -<p id='n212' class='pln'><a href='#n212'>212</a></p> -<p id='n213' class='stm run hide_run'><a href='#n213'>213</a></p> -<p id='n214' class='stm run hide_run'><a href='#n214'>214</a></p> -<p id='n215' class='pln'><a href='#n215'>215</a></p> -<p id='n216' class='stm run hide_run'><a href='#n216'>216</a></p> -<p id='n217' class='stm run hide_run'><a href='#n217'>217</a></p> -<p id='n218' class='pln'><a href='#n218'>218</a></p> -<p id='n219' class='pln'><a href='#n219'>219</a></p> -<p id='n220' class='pln'><a href='#n220'>220</a></p> -<p id='n221' class='pln'><a href='#n221'>221</a></p> -<p id='n222' class='pln'><a href='#n222'>222</a></p> -<p id='n223' class='pln'><a href='#n223'>223</a></p> -<p id='n224' class='pln'><a href='#n224'>224</a></p> -<p id='n225' class='pln'><a href='#n225'>225</a></p> -<p id='n226' class='pln'><a href='#n226'>226</a></p> -<p id='n227' class='pln'><a href='#n227'>227</a></p> -<p id='n228' class='pln'><a href='#n228'>228</a></p> -<p id='n229' class='pln'><a href='#n229'>229</a></p> -<p id='n230' class='stm run hide_run'><a href='#n230'>230</a></p> -<p id='n231' class='stm run hide_run'><a href='#n231'>231</a></p> -<p id='n232' class='pln'><a href='#n232'>232</a></p> -<p id='n233' class='stm run hide_run'><a href='#n233'>233</a></p> -<p id='n234' class='stm run hide_run'><a href='#n234'>234</a></p> -<p id='n235' class='pln'><a href='#n235'>235</a></p> -<p id='n236' class='pln'><a href='#n236'>236</a></p> -<p id='n237' class='pln'><a href='#n237'>237</a></p> -<p id='n238' class='pln'><a href='#n238'>238</a></p> -<p id='n239' class='pln'><a href='#n239'>239</a></p> -<p id='n240' class='pln'><a href='#n240'>240</a></p> -<p id='n241' class='pln'><a href='#n241'>241</a></p> -<p id='n242' class='pln'><a href='#n242'>242</a></p> -<p id='n243' class='pln'><a href='#n243'>243</a></p> -<p id='n244' class='pln'><a href='#n244'>244</a></p> -<p id='n245' class='pln'><a href='#n245'>245</a></p> -<p id='n246' class='pln'><a href='#n246'>246</a></p> -<p id='n247' class='pln'><a href='#n247'>247</a></p> -<p id='n248' class='stm run hide_run'><a href='#n248'>248</a></p> -<p id='n249' class='stm run hide_run'><a href='#n249'>249</a></p> -<p id='n250' class='pln'><a href='#n250'>250</a></p> -<p id='n251' class='stm run hide_run'><a href='#n251'>251</a></p> -<p id='n252' class='pln'><a href='#n252'>252</a></p> -<p id='n253' class='pln'><a href='#n253'>253</a></p> -<p id='n254' class='stm run hide_run'><a href='#n254'>254</a></p> -<p id='n255' class='pln'><a href='#n255'>255</a></p> -<p id='n256' class='pln'><a href='#n256'>256</a></p> -<p id='n257' class='pln'><a href='#n257'>257</a></p> -<p id='n258' class='pln'><a href='#n258'>258</a></p> -<p id='n259' class='pln'><a href='#n259'>259</a></p> -<p id='n260' class='pln'><a href='#n260'>260</a></p> -<p id='n261' class='pln'><a href='#n261'>261</a></p> -<p id='n262' class='pln'><a href='#n262'>262</a></p> -<p id='n263' class='pln'><a href='#n263'>263</a></p> -<p id='n264' class='pln'><a href='#n264'>264</a></p> -<p id='n265' class='pln'><a href='#n265'>265</a></p> -<p id='n266' class='stm run hide_run'><a href='#n266'>266</a></p> -<p id='n267' class='stm run hide_run'><a href='#n267'>267</a></p> -<p id='n268' class='pln'><a href='#n268'>268</a></p> -<p id='n269' class='stm run hide_run'><a href='#n269'>269</a></p> -<p id='n270' class='pln'><a href='#n270'>270</a></p> -<p id='n271' class='stm run hide_run'><a href='#n271'>271</a></p> -<p id='n272' class='pln'><a href='#n272'>272</a></p> -<p id='n273' class='pln'><a href='#n273'>273</a></p> -<p id='n274' class='pln'><a href='#n274'>274</a></p> -<p id='n275' class='pln'><a href='#n275'>275</a></p> -<p id='n276' class='pln'><a href='#n276'>276</a></p> -<p id='n277' class='pln'><a href='#n277'>277</a></p> -<p id='n278' class='pln'><a href='#n278'>278</a></p> -<p id='n279' class='pln'><a href='#n279'>279</a></p> -<p id='n280' class='stm run hide_run'><a href='#n280'>280</a></p> -<p id='n281' class='stm run hide_run'><a href='#n281'>281</a></p> -<p id='n282' class='pln'><a href='#n282'>282</a></p> -<p id='n283' class='stm run hide_run'><a href='#n283'>283</a></p> -<p id='n284' class='pln'><a href='#n284'>284</a></p> -<p id='n285' class='pln'><a href='#n285'>285</a></p> -<p id='n286' class='pln'><a href='#n286'>286</a></p> -<p id='n287' class='stm run hide_run'><a href='#n287'>287</a></p> -<p id='n288' class='pln'><a href='#n288'>288</a></p> -<p id='n289' class='pln'><a href='#n289'>289</a></p> -<p id='n290' class='pln'><a href='#n290'>290</a></p> -<p id='n291' class='pln'><a href='#n291'>291</a></p> -<p id='n292' class='pln'><a href='#n292'>292</a></p> -<p id='n293' class='pln'><a href='#n293'>293</a></p> -<p id='n294' class='pln'><a href='#n294'>294</a></p> -<p id='n295' class='pln'><a href='#n295'>295</a></p> -<p id='n296' class='pln'><a href='#n296'>296</a></p> -<p id='n297' class='pln'><a href='#n297'>297</a></p> -<p id='n298' class='pln'><a href='#n298'>298</a></p> -<p id='n299' class='pln'><a href='#n299'>299</a></p> -<p id='n300' class='stm run hide_run'><a href='#n300'>300</a></p> -<p id='n301' class='stm run hide_run'><a href='#n301'>301</a></p> -<p id='n302' class='pln'><a href='#n302'>302</a></p> -<p id='n303' class='stm run hide_run'><a href='#n303'>303</a></p> -<p id='n304' class='pln'><a href='#n304'>304</a></p> -<p id='n305' class='pln'><a href='#n305'>305</a></p> -<p id='n306' class='pln'><a href='#n306'>306</a></p> -<p id='n307' class='stm run hide_run'><a href='#n307'>307</a></p> -<p id='n308' class='pln'><a href='#n308'>308</a></p> -<p id='n309' class='pln'><a href='#n309'>309</a></p> -<p id='n310' class='pln'><a href='#n310'>310</a></p> -<p id='n311' class='pln'><a href='#n311'>311</a></p> -<p id='n312' class='pln'><a href='#n312'>312</a></p> -<p id='n313' class='pln'><a href='#n313'>313</a></p> -<p id='n314' class='pln'><a href='#n314'>314</a></p> -<p id='n315' class='pln'><a href='#n315'>315</a></p> -<p id='n316' class='pln'><a href='#n316'>316</a></p> -<p id='n317' class='pln'><a href='#n317'>317</a></p> -<p id='n318' class='pln'><a href='#n318'>318</a></p> -<p id='n319' class='pln'><a href='#n319'>319</a></p> -<p id='n320' class='pln'><a href='#n320'>320</a></p> -<p id='n321' class='pln'><a href='#n321'>321</a></p> -<p id='n322' class='pln'><a href='#n322'>322</a></p> -<p id='n323' class='pln'><a href='#n323'>323</a></p> -<p id='n324' class='pln'><a href='#n324'>324</a></p> -<p id='n325' class='stm run hide_run'><a href='#n325'>325</a></p> -<p id='n326' class='stm run hide_run'><a href='#n326'>326</a></p> -<p id='n327' class='pln'><a href='#n327'>327</a></p> -<p id='n328' class='stm run hide_run'><a href='#n328'>328</a></p> -<p id='n329' class='stm run hide_run'><a href='#n329'>329</a></p> -<p id='n330' class='pln'><a href='#n330'>330</a></p> -<p id='n331' class='pln'><a href='#n331'>331</a></p> -<p id='n332' class='pln'><a href='#n332'>332</a></p> -<p id='n333' class='pln'><a href='#n333'>333</a></p> -<p id='n334' class='pln'><a href='#n334'>334</a></p> -<p id='n335' class='pln'><a href='#n335'>335</a></p> -<p id='n336' class='pln'><a href='#n336'>336</a></p> -<p id='n337' class='pln'><a href='#n337'>337</a></p> -<p id='n338' class='pln'><a href='#n338'>338</a></p> -<p id='n339' class='pln'><a href='#n339'>339</a></p> -<p id='n340' class='pln'><a href='#n340'>340</a></p> -<p id='n341' class='pln'><a href='#n341'>341</a></p> -<p id='n342' class='pln'><a href='#n342'>342</a></p> -<p id='n343' class='pln'><a href='#n343'>343</a></p> -<p id='n344' class='stm run hide_run'><a href='#n344'>344</a></p> -<p id='n345' class='stm run hide_run'><a href='#n345'>345</a></p> -<p id='n346' class='pln'><a href='#n346'>346</a></p> -<p id='n347' class='stm run hide_run'><a href='#n347'>347</a></p> -<p id='n348' class='stm run hide_run'><a href='#n348'>348</a></p> -<p id='n349' class='pln'><a href='#n349'>349</a></p> -<p id='n350' class='pln'><a href='#n350'>350</a></p> -<p id='n351' class='pln'><a href='#n351'>351</a></p> -<p id='n352' class='pln'><a href='#n352'>352</a></p> -<p id='n353' class='pln'><a href='#n353'>353</a></p> -<p id='n354' class='pln'><a href='#n354'>354</a></p> -<p id='n355' class='pln'><a href='#n355'>355</a></p> -<p id='n356' class='stm run hide_run'><a href='#n356'>356</a></p> -<p id='n357' class='pln'><a href='#n357'>357</a></p> -<p id='n358' class='pln'><a href='#n358'>358</a></p> -<p id='n359' class='pln'><a href='#n359'>359</a></p> -<p id='n360' class='pln'><a href='#n360'>360</a></p> -<p id='n361' class='pln'><a href='#n361'>361</a></p> -<p id='n362' class='pln'><a href='#n362'>362</a></p> -<p id='n363' class='pln'><a href='#n363'>363</a></p> -<p id='n364' class='stm run hide_run'><a href='#n364'>364</a></p> -<p id='n365' class='stm run hide_run'><a href='#n365'>365</a></p> -<p id='n366' class='pln'><a href='#n366'>366</a></p> -<p id='n367' class='stm run hide_run'><a href='#n367'>367</a></p> -<p id='n368' class='stm run hide_run'><a href='#n368'>368</a></p> -<p id='n369' class='pln'><a href='#n369'>369</a></p> -<p id='n370' class='pln'><a href='#n370'>370</a></p> -<p id='n371' class='pln'><a href='#n371'>371</a></p> -<p id='n372' class='pln'><a href='#n372'>372</a></p> -<p id='n373' class='pln'><a href='#n373'>373</a></p> -<p id='n374' class='pln'><a href='#n374'>374</a></p> -<p id='n375' class='stm run hide_run'><a href='#n375'>375</a></p> -<p id='n376' class='pln'><a href='#n376'>376</a></p> -<p id='n377' class='pln'><a href='#n377'>377</a></p> -<p id='n378' class='pln'><a href='#n378'>378</a></p> -<p id='n379' class='pln'><a href='#n379'>379</a></p> -<p id='n380' class='stm run hide_run'><a href='#n380'>380</a></p> -<p id='n381' class='stm run hide_run'><a href='#n381'>381</a></p> -<p id='n382' class='pln'><a href='#n382'>382</a></p> -<p id='n383' class='pln'><a href='#n383'>383</a></p> -<p id='n384' class='pln'><a href='#n384'>384</a></p> -<p id='n385' class='pln'><a href='#n385'>385</a></p> -<p id='n386' class='pln'><a href='#n386'>386</a></p> -<p id='n387' class='pln'><a href='#n387'>387</a></p> -<p id='n388' class='pln'><a href='#n388'>388</a></p> -<p id='n389' class='pln'><a href='#n389'>389</a></p> -<p id='n390' class='pln'><a href='#n390'>390</a></p> -<p id='n391' class='stm run hide_run'><a href='#n391'>391</a></p> -<p id='n392' class='pln'><a href='#n392'>392</a></p> -<p id='n393' class='pln'><a href='#n393'>393</a></p> -<p id='n394' class='pln'><a href='#n394'>394</a></p> -<p id='n395' class='pln'><a href='#n395'>395</a></p> -<p id='n396' class='pln'><a href='#n396'>396</a></p> -<p id='n397' class='pln'><a href='#n397'>397</a></p> -<p id='n398' class='pln'><a href='#n398'>398</a></p> -<p id='n399' class='pln'><a href='#n399'>399</a></p> -<p id='n400' class='pln'><a href='#n400'>400</a></p> -<p id='n401' class='pln'><a href='#n401'>401</a></p> -<p id='n402' class='stm run hide_run'><a href='#n402'>402</a></p> -<p id='n403' class='stm run hide_run'><a href='#n403'>403</a></p> -<p id='n404' class='pln'><a href='#n404'>404</a></p> -<p id='n405' class='stm run hide_run'><a href='#n405'>405</a></p> -<p id='n406' class='pln'><a href='#n406'>406</a></p> -<p id='n407' class='stm run hide_run'><a href='#n407'>407</a></p> -<p id='n408' class='pln'><a href='#n408'>408</a></p> -<p id='n409' class='pln'><a href='#n409'>409</a></p> -<p id='n410' class='pln'><a href='#n410'>410</a></p> -<p id='n411' class='pln'><a href='#n411'>411</a></p> -<p id='n412' class='pln'><a href='#n412'>412</a></p> -<p id='n413' class='stm run hide_run'><a href='#n413'>413</a></p> -<p id='n414' class='stm run hide_run'><a href='#n414'>414</a></p> -<p id='n415' class='pln'><a href='#n415'>415</a></p> -<p id='n416' class='pln'><a href='#n416'>416</a></p> -<p id='n417' class='pln'><a href='#n417'>417</a></p> -<p id='n418' class='pln'><a href='#n418'>418</a></p> -<p id='n419' class='stm run hide_run'><a href='#n419'>419</a></p> -<p id='n420' class='pln'><a href='#n420'>420</a></p> -<p id='n421' class='stm run hide_run'><a href='#n421'>421</a></p> -<p id='n422' class='pln'><a href='#n422'>422</a></p> -<p id='n423' class='pln'><a href='#n423'>423</a></p> -<p id='n424' class='pln'><a href='#n424'>424</a></p> -<p id='n425' class='pln'><a href='#n425'>425</a></p> -<p id='n426' class='pln'><a href='#n426'>426</a></p> -<p id='n427' class='pln'><a href='#n427'>427</a></p> -<p id='n428' class='pln'><a href='#n428'>428</a></p> -<p id='n429' class='pln'><a href='#n429'>429</a></p> -<p id='n430' class='pln'><a href='#n430'>430</a></p> -<p id='n431' class='stm run hide_run'><a href='#n431'>431</a></p> -<p id='n432' class='pln'><a href='#n432'>432</a></p> -<p id='n433' class='pln'><a href='#n433'>433</a></p> -<p id='n434' class='pln'><a href='#n434'>434</a></p> -<p id='n435' class='pln'><a href='#n435'>435</a></p> -<p id='n436' class='pln'><a href='#n436'>436</a></p> -<p id='n437' class='pln'><a href='#n437'>437</a></p> -<p id='n438' class='pln'><a href='#n438'>438</a></p> -<p id='n439' class='pln'><a href='#n439'>439</a></p> -<p id='n440' class='pln'><a href='#n440'>440</a></p> -<p id='n441' class='pln'><a href='#n441'>441</a></p> -<p id='n442' class='stm run hide_run'><a href='#n442'>442</a></p> -<p id='n443' class='stm run hide_run'><a href='#n443'>443</a></p> -<p id='n444' class='pln'><a href='#n444'>444</a></p> -<p id='n445' class='stm run hide_run'><a href='#n445'>445</a></p> -<p id='n446' class='pln'><a href='#n446'>446</a></p> -<p id='n447' class='pln'><a href='#n447'>447</a></p> -<p id='n448' class='pln'><a href='#n448'>448</a></p> -<p id='n449' class='stm run hide_run'><a href='#n449'>449</a></p> -<p id='n450' class='stm mis'><a href='#n450'>450</a></p> -<p id='n451' class='stm mis'><a href='#n451'>451</a></p> -<p id='n452' class='stm mis'><a href='#n452'>452</a></p> -<p id='n453' class='stm mis'><a href='#n453'>453</a></p> -<p id='n454' class='stm mis'><a href='#n454'>454</a></p> -<p id='n455' class='stm mis'><a href='#n455'>455</a></p> -<p id='n456' class='stm mis'><a href='#n456'>456</a></p> -<p id='n457' class='pln'><a href='#n457'>457</a></p> -<p id='n458' class='stm run hide_run'><a href='#n458'>458</a></p> -<p id='n459' class='stm mis'><a href='#n459'>459</a></p> -<p id='n460' class='stm mis'><a href='#n460'>460</a></p> -<p id='n461' class='stm mis'><a href='#n461'>461</a></p> -<p id='n462' class='stm mis'><a href='#n462'>462</a></p> -<p id='n463' class='stm mis'><a href='#n463'>463</a></p> -<p id='n464' class='stm mis'><a href='#n464'>464</a></p> -<p id='n465' class='stm mis'><a href='#n465'>465</a></p> -<p id='n466' class='stm mis'><a href='#n466'>466</a></p> -<p id='n467' class='stm mis'><a href='#n467'>467</a></p> -<p id='n468' class='pln'><a href='#n468'>468</a></p> -<p id='n469' class='stm run hide_run'><a href='#n469'>469</a></p> -<p id='n470' class='pln'><a href='#n470'>470</a></p> -<p id='n471' class='stm mis'><a href='#n471'>471</a></p> -<p id='n472' class='stm mis'><a href='#n472'>472</a></p> -<p id='n473' class='stm mis'><a href='#n473'>473</a></p> -<p id='n474' class='stm mis'><a href='#n474'>474</a></p> -<p id='n475' class='stm mis'><a href='#n475'>475</a></p> -<p id='n476' class='pln'><a href='#n476'>476</a></p> -<p id='n477' class='stm run hide_run'><a href='#n477'>477</a></p> -<p id='n478' class='pln'><a href='#n478'>478</a></p> -<p id='n479' class='pln'><a href='#n479'>479</a></p> -<p id='n480' class='pln'><a href='#n480'>480</a></p> -<p id='n481' class='pln'><a href='#n481'>481</a></p> -<p id='n482' class='stm run hide_run'><a href='#n482'>482</a></p> -<p id='n483' class='stm mis'><a href='#n483'>483</a></p> -<p id='n484' class='stm mis'><a href='#n484'>484</a></p> -<p id='n485' class='pln'><a href='#n485'>485</a></p> -<p id='n486' class='pln'><a href='#n486'>486</a></p> -<p id='n487' class='pln'><a href='#n487'>487</a></p> -<p id='n488' class='stm run hide_run'><a href='#n488'>488</a></p> -<p id='n489' class='stm mis'><a href='#n489'>489</a></p> -<p id='n490' class='pln'><a href='#n490'>490</a></p> -<p id='n491' class='pln'><a href='#n491'>491</a></p> -<p id='n492' class='pln'><a href='#n492'>492</a></p> -<p id='n493' class='pln'><a href='#n493'>493</a></p> -<p id='n494' class='stm mis'><a href='#n494'>494</a></p> -<p id='n495' class='pln'><a href='#n495'>495</a></p> -<p id='n496' class='stm run hide_run'><a href='#n496'>496</a></p> -<p id='n497' class='stm mis'><a href='#n497'>497</a></p> -<p id='n498' class='pln'><a href='#n498'>498</a></p> -<p id='n499' class='pln'><a href='#n499'>499</a></p> -<p id='n500' class='pln'><a href='#n500'>500</a></p> -<p id='n501' class='pln'><a href='#n501'>501</a></p> -<p id='n502' class='pln'><a href='#n502'>502</a></p> -<p id='n503' class='stm mis'><a href='#n503'>503</a></p> -<p id='n504' class='pln'><a href='#n504'>504</a></p> -<p id='n505' class='stm mis'><a href='#n505'>505</a></p> -<p id='n506' class='pln'><a href='#n506'>506</a></p> -<p id='n507' class='pln'><a href='#n507'>507</a></p> -<p id='n508' class='pln'><a href='#n508'>508</a></p> -<p id='n509' class='pln'><a href='#n509'>509</a></p> -<p id='n510' class='pln'><a href='#n510'>510</a></p> -<p id='n511' class='pln'><a href='#n511'>511</a></p> -<p id='n512' class='pln'><a href='#n512'>512</a></p> -<p id='n513' class='pln'><a href='#n513'>513</a></p> -<p id='n514' class='stm mis'><a href='#n514'>514</a></p> -<p id='n515' class='pln'><a href='#n515'>515</a></p> -<p id='n516' class='stm run hide_run'><a href='#n516'>516</a></p> -<p id='n517' class='stm mis'><a href='#n517'>517</a></p> -<p id='n518' class='pln'><a href='#n518'>518</a></p> -<p id='n519' class='pln'><a href='#n519'>519</a></p> -<p id='n520' class='stm mis'><a href='#n520'>520</a></p> -<p id='n521' class='pln'><a href='#n521'>521</a></p> -<p id='n522' class='stm mis'><a href='#n522'>522</a></p> -<p id='n523' class='pln'><a href='#n523'>523</a></p> -<p id='n524' class='pln'><a href='#n524'>524</a></p> -<p id='n525' class='pln'><a href='#n525'>525</a></p> -<p id='n526' class='pln'><a href='#n526'>526</a></p> -<p id='n527' class='pln'><a href='#n527'>527</a></p> -<p id='n528' class='pln'><a href='#n528'>528</a></p> -<p id='n529' class='stm mis'><a href='#n529'>529</a></p> -<p id='n530' class='pln'><a href='#n530'>530</a></p> -<p id='n531' class='stm run hide_run'><a href='#n531'>531</a></p> -<p id='n532' class='stm mis'><a href='#n532'>532</a></p> -<p id='n533' class='pln'><a href='#n533'>533</a></p> -<p id='n534' class='pln'><a href='#n534'>534</a></p> -<p id='n535' class='stm mis'><a href='#n535'>535</a></p> -<p id='n536' class='pln'><a href='#n536'>536</a></p> -<p id='n537' class='stm mis'><a href='#n537'>537</a></p> -<p id='n538' class='pln'><a href='#n538'>538</a></p> -<p id='n539' class='pln'><a href='#n539'>539</a></p> -<p id='n540' class='pln'><a href='#n540'>540</a></p> -<p id='n541' class='pln'><a href='#n541'>541</a></p> -<p id='n542' class='pln'><a href='#n542'>542</a></p> -<p id='n543' class='pln'><a href='#n543'>543</a></p> -<p id='n544' class='stm mis'><a href='#n544'>544</a></p> -<p id='n545' class='pln'><a href='#n545'>545</a></p> -<p id='n546' class='stm run hide_run'><a href='#n546'>546</a></p> -<p id='n547' class='stm mis'><a href='#n547'>547</a></p> -<p id='n548' class='pln'><a href='#n548'>548</a></p> -<p id='n549' class='pln'><a href='#n549'>549</a></p> -<p id='n550' class='pln'><a href='#n550'>550</a></p> -<p id='n551' class='pln'><a href='#n551'>551</a></p> -<p id='n552' class='stm mis'><a href='#n552'>552</a></p> -<p id='n553' class='pln'><a href='#n553'>553</a></p> -<p id='n554' class='stm mis'><a href='#n554'>554</a></p> -<p id='n555' class='pln'><a href='#n555'>555</a></p> -<p id='n556' class='pln'><a href='#n556'>556</a></p> -<p id='n557' class='pln'><a href='#n557'>557</a></p> -<p id='n558' class='pln'><a href='#n558'>558</a></p> -<p id='n559' class='pln'><a href='#n559'>559</a></p> -<p id='n560' class='pln'><a href='#n560'>560</a></p> -<p id='n561' class='pln'><a href='#n561'>561</a></p> -<p id='n562' class='pln'><a href='#n562'>562</a></p> -<p id='n563' class='stm mis'><a href='#n563'>563</a></p> -<p id='n564' class='pln'><a href='#n564'>564</a></p> -<p id='n565' class='stm run hide_run'><a href='#n565'>565</a></p> -<p id='n566' class='stm mis'><a href='#n566'>566</a></p> -<p id='n567' class='pln'><a href='#n567'>567</a></p> -<p id='n568' class='pln'><a href='#n568'>568</a></p> -<p id='n569' class='pln'><a href='#n569'>569</a></p> -<p id='n570' class='pln'><a href='#n570'>570</a></p> -<p id='n571' class='pln'><a href='#n571'>571</a></p> -<p id='n572' class='pln'><a href='#n572'>572</a></p> -<p id='n573' class='stm mis'><a href='#n573'>573</a></p> -<p id='n574' class='pln'><a href='#n574'>574</a></p> -<p id='n575' class='stm mis'><a href='#n575'>575</a></p> -<p id='n576' class='pln'><a href='#n576'>576</a></p> -<p id='n577' class='pln'><a href='#n577'>577</a></p> -<p id='n578' class='pln'><a href='#n578'>578</a></p> -<p id='n579' class='pln'><a href='#n579'>579</a></p> -<p id='n580' class='pln'><a href='#n580'>580</a></p> -<p id='n581' class='pln'><a href='#n581'>581</a></p> -<p id='n582' class='pln'><a href='#n582'>582</a></p> -<p id='n583' class='pln'><a href='#n583'>583</a></p> -<p id='n584' class='pln'><a href='#n584'>584</a></p> -<p id='n585' class='pln'><a href='#n585'>585</a></p> -<p id='n586' class='stm mis'><a href='#n586'>586</a></p> -<p id='n587' class='pln'><a href='#n587'>587</a></p> -<p id='n588' class='stm run hide_run'><a href='#n588'>588</a></p> -<p id='n589' class='stm mis'><a href='#n589'>589</a></p> -<p id='n590' class='pln'><a href='#n590'>590</a></p> -<p id='n591' class='pln'><a href='#n591'>591</a></p> -<p id='n592' class='pln'><a href='#n592'>592</a></p> -<p id='n593' class='pln'><a href='#n593'>593</a></p> -<p id='n594' class='pln'><a href='#n594'>594</a></p> -<p id='n595' class='pln'><a href='#n595'>595</a></p> -<p id='n596' class='stm mis'><a href='#n596'>596</a></p> -<p id='n597' class='pln'><a href='#n597'>597</a></p> -<p id='n598' class='stm mis'><a href='#n598'>598</a></p> -<p id='n599' class='pln'><a href='#n599'>599</a></p> -<p id='n600' class='pln'><a href='#n600'>600</a></p> -<p id='n601' class='pln'><a href='#n601'>601</a></p> -<p id='n602' class='pln'><a href='#n602'>602</a></p> -<p id='n603' class='pln'><a href='#n603'>603</a></p> -<p id='n604' class='pln'><a href='#n604'>604</a></p> -<p id='n605' class='pln'><a href='#n605'>605</a></p> -<p id='n606' class='pln'><a href='#n606'>606</a></p> -<p id='n607' class='pln'><a href='#n607'>607</a></p> -<p id='n608' class='pln'><a href='#n608'>608</a></p> -<p id='n609' class='stm mis'><a href='#n609'>609</a></p> -<p id='n610' class='pln'><a href='#n610'>610</a></p> -<p id='n611' class='stm run hide_run'><a href='#n611'>611</a></p> -<p id='n612' class='pln'><a href='#n612'>612</a></p> -<p id='n613' class='pln'><a href='#n613'>613</a></p> -<p id='n614' class='pln'><a href='#n614'>614</a></p> -<p id='n615' class='stm run hide_run'><a href='#n615'>615</a></p> -<p id='n616' class='stm mis'><a href='#n616'>616</a></p> -<p id='n617' class='pln'><a href='#n617'>617</a></p> -<p id='n618' class='pln'><a href='#n618'>618</a></p> -<p id='n619' class='pln'><a href='#n619'>619</a></p> -<p id='n620' class='pln'><a href='#n620'>620</a></p> -<p id='n621' class='stm mis'><a href='#n621'>621</a></p> -<p id='n622' class='stm mis'><a href='#n622'>622</a></p> -<p id='n623' class='pln'><a href='#n623'>623</a></p> -<p id='n624' class='pln'><a href='#n624'>624</a></p> -<p id='n625' class='pln'><a href='#n625'>625</a></p> -<p id='n626' class='stm run hide_run'><a href='#n626'>626</a></p> -<p id='n627' class='stm mis'><a href='#n627'>627</a></p> -<p id='n628' class='pln'><a href='#n628'>628</a></p> -<p id='n629' class='pln'><a href='#n629'>629</a></p> -<p id='n630' class='pln'><a href='#n630'>630</a></p> -<p id='n631' class='pln'><a href='#n631'>631</a></p> -<p id='n632' class='stm mis'><a href='#n632'>632</a></p> -<p id='n633' class='stm mis'><a href='#n633'>633</a></p> -<p id='n634' class='pln'><a href='#n634'>634</a></p> -<p id='n635' class='pln'><a href='#n635'>635</a></p> -<p id='n636' class='pln'><a href='#n636'>636</a></p> -<p id='n637' class='stm run hide_run'><a href='#n637'>637</a></p> -<p id='n638' class='stm mis'><a href='#n638'>638</a></p> -<p id='n639' class='pln'><a href='#n639'>639</a></p> -<p id='n640' class='pln'><a href='#n640'>640</a></p> -<p id='n641' class='pln'><a href='#n641'>641</a></p> -<p id='n642' class='pln'><a href='#n642'>642</a></p> -<p id='n643' class='pln'><a href='#n643'>643</a></p> -<p id='n644' class='pln'><a href='#n644'>644</a></p> -<p id='n645' class='pln'><a href='#n645'>645</a></p> -<p id='n646' class='pln'><a href='#n646'>646</a></p> -<p id='n647' class='pln'><a href='#n647'>647</a></p> -<p id='n648' class='pln'><a href='#n648'>648</a></p> -<p id='n649' class='pln'><a href='#n649'>649</a></p> -<p id='n650' class='pln'><a href='#n650'>650</a></p> -<p id='n651' class='pln'><a href='#n651'>651</a></p> -<p id='n652' class='stm mis'><a href='#n652'>652</a></p> -<p id='n653' class='stm mis'><a href='#n653'>653</a></p> -<p id='n654' class='pln'><a href='#n654'>654</a></p> -<p id='n655' class='stm run hide_run'><a href='#n655'>655</a></p> -<p id='n656' class='pln'><a href='#n656'>656</a></p> -<p id='n657' class='pln'><a href='#n657'>657</a></p> -<p id='n658' class='pln'><a href='#n658'>658</a></p> -<p id='n659' class='pln'><a href='#n659'>659</a></p> -<p id='n660' class='stm run hide_run'><a href='#n660'>660</a></p> -<p id='n661' class='pln'><a href='#n661'>661</a></p> -<p id='n662' class='pln'><a href='#n662'>662</a></p> -<p id='n663' class='pln'><a href='#n663'>663</a></p> -<p id='n664' class='stm mis'><a href='#n664'>664</a></p> -<p id='n665' class='stm mis'><a href='#n665'>665</a></p> -<p id='n666' class='stm mis'><a href='#n666'>666</a></p> -<p id='n667' class='pln'><a href='#n667'>667</a></p> -<p id='n668' class='stm run hide_run'><a href='#n668'>668</a></p> -<p id='n669' class='stm mis'><a href='#n669'>669</a></p> -<p id='n670' class='stm mis'><a href='#n670'>670</a></p> -<p id='n671' class='stm mis'><a href='#n671'>671</a></p> -<p id='n672' class='pln'><a href='#n672'>672</a></p> -<p id='n673' class='stm run hide_run'><a href='#n673'>673</a></p> -<p id='n674' class='stm mis'><a href='#n674'>674</a></p> -<p id='n675' class='stm mis'><a href='#n675'>675</a></p> -<p id='n676' class='stm mis'><a href='#n676'>676</a></p> -<p id='n677' class='stm mis'><a href='#n677'>677</a></p> -<p id='n678' class='stm mis'><a href='#n678'>678</a></p> -<p id='n679' class='pln'><a href='#n679'>679</a></p> -<p id='n680' class='stm run hide_run'><a href='#n680'>680</a></p> -<p id='n681' class='pln'><a href='#n681'>681</a></p> -<p id='n682' class='stm mis'><a href='#n682'>682</a></p> -<p id='n683' class='stm mis'><a href='#n683'>683</a></p> -<p id='n684' class='stm mis'><a href='#n684'>684</a></p> -<p id='n685' class='stm mis'><a href='#n685'>685</a></p> -<p id='n686' class='stm mis'><a href='#n686'>686</a></p> -<p id='n687' class='pln'><a href='#n687'>687</a></p> -<p id='n688' class='stm run hide_run'><a href='#n688'>688</a></p> -<p id='n689' class='pln'><a href='#n689'>689</a></p> -<p id='n690' class='stm mis'><a href='#n690'>690</a></p> -<p id='n691' class='stm mis'><a href='#n691'>691</a></p> -<p id='n692' class='stm mis'><a href='#n692'>692</a></p> -<p id='n693' class='stm mis'><a href='#n693'>693</a></p> -<p id='n694' class='stm mis'><a href='#n694'>694</a></p> -<p id='n695' class='pln'><a href='#n695'>695</a></p> -<p id='n696' class='stm run hide_run'><a href='#n696'>696</a></p> -<p id='n697' class='pln'><a href='#n697'>697</a></p> -<p id='n698' class='stm mis'><a href='#n698'>698</a></p> -<p id='n699' class='stm mis'><a href='#n699'>699</a></p> -<p id='n700' class='stm mis'><a href='#n700'>700</a></p> -<p id='n701' class='stm mis'><a href='#n701'>701</a></p> -<p id='n702' class='stm mis'><a href='#n702'>702</a></p> -<p id='n703' class='pln'><a href='#n703'>703</a></p> -<p id='n704' class='stm run hide_run'><a href='#n704'>704</a></p> -<p id='n705' class='pln'><a href='#n705'>705</a></p> -<p id='n706' class='stm mis'><a href='#n706'>706</a></p> -<p id='n707' class='stm mis'><a href='#n707'>707</a></p> -<p id='n708' class='stm mis'><a href='#n708'>708</a></p> -<p id='n709' class='stm mis'><a href='#n709'>709</a></p> -<p id='n710' class='stm mis'><a href='#n710'>710</a></p> -<p id='n711' class='pln'><a href='#n711'>711</a></p> -<p id='n712' class='stm run hide_run'><a href='#n712'>712</a></p> -<p id='n713' class='pln'><a href='#n713'>713</a></p> -<p id='n714' class='pln'><a href='#n714'>714</a></p> -<p id='n715' class='stm mis'><a href='#n715'>715</a></p> -<p id='n716' class='stm mis'><a href='#n716'>716</a></p> -<p id='n717' class='stm mis'><a href='#n717'>717</a></p> -<p id='n718' class='stm mis'><a href='#n718'>718</a></p> -<p id='n719' class='stm mis'><a href='#n719'>719</a></p> -<p id='n720' class='stm mis'><a href='#n720'>720</a></p> -<p id='n721' class='pln'><a href='#n721'>721</a></p> -<p id='n722' class='stm run hide_run'><a href='#n722'>722</a></p> -<p id='n723' class='pln'><a href='#n723'>723</a></p> -<p id='n724' class='stm run hide_run'><a href='#n724'>724</a></p> -<p id='n725' class='pln'><a href='#n725'>725</a></p> -<p id='n726' class='pln'><a href='#n726'>726</a></p> -<p id='n727' class='pln'><a href='#n727'>727</a></p> -<p id='n728' class='stm mis'><a href='#n728'>728</a></p> -<p id='n729' class='stm mis'><a href='#n729'>729</a></p> -<p id='n730' class='stm mis'><a href='#n730'>730</a></p> -<p id='n731' class='pln'><a href='#n731'>731</a></p> -<p id='n732' class='stm run hide_run'><a href='#n732'>732</a></p> -<p id='n733' class='pln'><a href='#n733'>733</a></p> -<p id='n734' class='stm mis'><a href='#n734'>734</a></p> -<p id='n735' class='stm mis'><a href='#n735'>735</a></p> -<p id='n736' class='stm mis'><a href='#n736'>736</a></p> -<p id='n737' class='stm mis'><a href='#n737'>737</a></p> -<p id='n738' class='stm mis'><a href='#n738'>738</a></p> -<p id='n739' class='pln'><a href='#n739'>739</a></p> -<p id='n740' class='stm run hide_run'><a href='#n740'>740</a></p> -<p id='n741' class='stm mis'><a href='#n741'>741</a></p> -<p id='n742' class='pln'><a href='#n742'>742</a></p> -<p id='n743' class='stm mis'><a href='#n743'>743</a></p> -<p id='n744' class='pln'><a href='#n744'>744</a></p> -<p id='n745' class='stm run hide_run'><a href='#n745'>745</a></p> -<p id='n746' class='stm mis'><a href='#n746'>746</a></p> -<p id='n747' class='stm mis'><a href='#n747'>747</a></p> -<p id='n748' class='stm mis'><a href='#n748'>748</a></p> -<p id='n749' class='pln'><a href='#n749'>749</a></p> -<p id='n750' class='stm run hide_run'><a href='#n750'>750</a></p> -<p id='n751' class='stm mis'><a href='#n751'>751</a></p> -<p id='n752' class='stm mis'><a href='#n752'>752</a></p> -<p id='n753' class='stm mis'><a href='#n753'>753</a></p> -<p id='n754' class='stm mis'><a href='#n754'>754</a></p> -<p id='n755' class='pln'><a href='#n755'>755</a></p> -<p id='n756' class='stm mis'><a href='#n756'>756</a></p> -<p id='n757' class='stm mis'><a href='#n757'>757</a></p> -<p id='n758' class='pln'><a href='#n758'>758</a></p> -<p id='n759' class='pln'><a href='#n759'>759</a></p> -<p id='n760' class='stm run hide_run'><a href='#n760'>760</a></p> -<p id='n761' class='pln'><a href='#n761'>761</a></p> -<p id='n762' class='stm run hide_run'><a href='#n762'>762</a></p> -<p id='n763' class='pln'><a href='#n763'>763</a></p> -<p id='n764' class='stm mis'><a href='#n764'>764</a></p> -<p id='n765' class='stm mis'><a href='#n765'>765</a></p> -<p id='n766' class='stm mis'><a href='#n766'>766</a></p> -<p id='n767' class='stm mis'><a href='#n767'>767</a></p> -<p id='n768' class='stm mis'><a href='#n768'>768</a></p> -<p id='n769' class='pln'><a href='#n769'>769</a></p> -<p id='n770' class='stm run hide_run'><a href='#n770'>770</a></p> -<p id='n771' class='stm mis'><a href='#n771'>771</a></p> -<p id='n772' class='pln'><a href='#n772'>772</a></p> -<p id='n773' class='pln'><a href='#n773'>773</a></p> -<p id='n774' class='pln'><a href='#n774'>774</a></p> -<p id='n775' class='pln'><a href='#n775'>775</a></p> -<p id='n776' class='pln'><a href='#n776'>776</a></p> -<p id='n777' class='stm mis'><a href='#n777'>777</a></p> -<p id='n778' class='stm mis'><a href='#n778'>778</a></p> -<p id='n779' class='pln'><a href='#n779'>779</a></p> -<p id='n780' class='stm run hide_run'><a href='#n780'>780</a></p> -<p id='n781' class='stm mis'><a href='#n781'>781</a></p> -<p id='n782' class='stm mis'><a href='#n782'>782</a></p> -<p id='n783' class='stm mis'><a href='#n783'>783</a></p> -<p id='n784' class='pln'><a href='#n784'>784</a></p> -<p id='n785' class='stm run hide_run'><a href='#n785'>785</a></p> -<p id='n786' class='stm mis'><a href='#n786'>786</a></p> -<p id='n787' class='stm mis'><a href='#n787'>787</a></p> -<p id='n788' class='stm mis'><a href='#n788'>788</a></p> -<p id='n789' class='stm mis'><a href='#n789'>789</a></p> -<p id='n790' class='pln'><a href='#n790'>790</a></p> -<p id='n791' class='stm run hide_run'><a href='#n791'>791</a></p> -<p id='n792' class='pln'><a href='#n792'>792</a></p> -<p id='n793' class='stm mis'><a href='#n793'>793</a></p> -<p id='n794' class='stm mis'><a href='#n794'>794</a></p> -<p id='n795' class='stm mis'><a href='#n795'>795</a></p> -<p id='n796' class='stm mis'><a href='#n796'>796</a></p> -<p id='n797' class='pln'><a href='#n797'>797</a></p> -<p id='n798' class='stm run hide_run'><a href='#n798'>798</a></p> -<p id='n799' class='stm mis'><a href='#n799'>799</a></p> -<p id='n800' class='pln'><a href='#n800'>800</a></p> -<p id='n801' class='pln'><a href='#n801'>801</a></p> -<p id='n802' class='pln'><a href='#n802'>802</a></p> -<p id='n803' class='pln'><a href='#n803'>803</a></p> -<p id='n804' class='pln'><a href='#n804'>804</a></p> -<p id='n805' class='stm mis'><a href='#n805'>805</a></p> -<p id='n806' class='stm mis'><a href='#n806'>806</a></p> -<p id='n807' class='pln'><a href='#n807'>807</a></p> -<p id='n808' class='stm run hide_run'><a href='#n808'>808</a></p> -<p id='n809' class='stm mis'><a href='#n809'>809</a></p> -<p id='n810' class='pln'><a href='#n810'>810</a></p> -<p id='n811' class='pln'><a href='#n811'>811</a></p> -<p id='n812' class='pln'><a href='#n812'>812</a></p> -<p id='n813' class='pln'><a href='#n813'>813</a></p> -<p id='n814' class='pln'><a href='#n814'>814</a></p> -<p id='n815' class='pln'><a href='#n815'>815</a></p> -<p id='n816' class='pln'><a href='#n816'>816</a></p> -<p id='n817' class='pln'><a href='#n817'>817</a></p> -<p id='n818' class='pln'><a href='#n818'>818</a></p> -<p id='n819' class='pln'><a href='#n819'>819</a></p> -<p id='n820' class='pln'><a href='#n820'>820</a></p> -<p id='n821' class='pln'><a href='#n821'>821</a></p> -<p id='n822' class='pln'><a href='#n822'>822</a></p> -<p id='n823' class='pln'><a href='#n823'>823</a></p> -<p id='n824' class='pln'><a href='#n824'>824</a></p> -<p id='n825' class='pln'><a href='#n825'>825</a></p> -<p id='n826' class='pln'><a href='#n826'>826</a></p> -<p id='n827' class='pln'><a href='#n827'>827</a></p> -<p id='n828' class='pln'><a href='#n828'>828</a></p> -<p id='n829' class='pln'><a href='#n829'>829</a></p> -<p id='n830' class='pln'><a href='#n830'>830</a></p> -<p id='n831' class='pln'><a href='#n831'>831</a></p> -<p id='n832' class='stm mis'><a href='#n832'>832</a></p> -<p id='n833' class='stm mis'><a href='#n833'>833</a></p> -<p id='n834' class='pln'><a href='#n834'>834</a></p> -<p id='n835' class='pln'><a href='#n835'>835</a></p> -<p id='n836' class='stm mis'><a href='#n836'>836</a></p> -<p id='n837' class='stm mis'><a href='#n837'>837</a></p> -<p id='n838' class='stm mis'><a href='#n838'>838</a></p> -<p id='n839' class='pln'><a href='#n839'>839</a></p> -<p id='n840' class='stm run hide_run'><a href='#n840'>840</a></p> -<p id='n841' class='stm mis'><a href='#n841'>841</a></p> -<p id='n842' class='stm mis'><a href='#n842'>842</a></p> -<p id='n843' class='pln'><a href='#n843'>843</a></p> -<p id='n844' class='pln'><a href='#n844'>844</a></p> -<p id='n845' class='stm run hide_run'><a href='#n845'>845</a></p> -<p id='n846' class='pln'><a href='#n846'>846</a></p> -<p id='n847' class='stm run hide_run'><a href='#n847'>847</a></p> -<p id='n848' class='stm mis'><a href='#n848'>848</a></p> -<p id='n849' class='pln'><a href='#n849'>849</a></p> -<p id='n850' class='pln'><a href='#n850'>850</a></p> -<p id='n851' class='pln'><a href='#n851'>851</a></p> -<p id='n852' class='pln'><a href='#n852'>852</a></p> -<p id='n853' class='pln'><a href='#n853'>853</a></p> -<p id='n854' class='pln'><a href='#n854'>854</a></p> -<p id='n855' class='pln'><a href='#n855'>855</a></p> -<p id='n856' class='pln'><a href='#n856'>856</a></p> -<p id='n857' class='pln'><a href='#n857'>857</a></p> -<p id='n858' class='pln'><a href='#n858'>858</a></p> -<p id='n859' class='pln'><a href='#n859'>859</a></p> -<p id='n860' class='pln'><a href='#n860'>860</a></p> -<p id='n861' class='pln'><a href='#n861'>861</a></p> -<p id='n862' class='pln'><a href='#n862'>862</a></p> -<p id='n863' class='pln'><a href='#n863'>863</a></p> -<p id='n864' class='pln'><a href='#n864'>864</a></p> -<p id='n865' class='pln'><a href='#n865'>865</a></p> -<p id='n866' class='pln'><a href='#n866'>866</a></p> -<p id='n867' class='pln'><a href='#n867'>867</a></p> -<p id='n868' class='pln'><a href='#n868'>868</a></p> -<p id='n869' class='pln'><a href='#n869'>869</a></p> -<p id='n870' class='pln'><a href='#n870'>870</a></p> -<p id='n871' class='pln'><a href='#n871'>871</a></p> -<p id='n872' class='pln'><a href='#n872'>872</a></p> -<p id='n873' class='stm mis'><a href='#n873'>873</a></p> -<p id='n874' class='stm mis'><a href='#n874'>874</a></p> -<p id='n875' class='stm mis'><a href='#n875'>875</a></p> -<p id='n876' class='stm mis'><a href='#n876'>876</a></p> -<p id='n877' class='stm mis'><a href='#n877'>877</a></p> -<p id='n878' class='pln'><a href='#n878'>878</a></p> -<p id='n879' class='stm run hide_run'><a href='#n879'>879</a></p> -<p id='n880' class='pln'><a href='#n880'>880</a></p> -<p id='n881' class='stm mis'><a href='#n881'>881</a></p> -<p id='n882' class='pln'><a href='#n882'>882</a></p> -<p id='n883' class='pln'><a href='#n883'>883</a></p> -<p id='n884' class='pln'><a href='#n884'>884</a></p> -<p id='n885' class='pln'><a href='#n885'>885</a></p> -<p id='n886' class='pln'><a href='#n886'>886</a></p> -<p id='n887' class='pln'><a href='#n887'>887</a></p> -<p id='n888' class='pln'><a href='#n888'>888</a></p> -<p id='n889' class='pln'><a href='#n889'>889</a></p> -<p id='n890' class='pln'><a href='#n890'>890</a></p> -<p id='n891' class='pln'><a href='#n891'>891</a></p> -<p id='n892' class='pln'><a href='#n892'>892</a></p> -<p id='n893' class='pln'><a href='#n893'>893</a></p> -<p id='n894' class='pln'><a href='#n894'>894</a></p> -<p id='n895' class='pln'><a href='#n895'>895</a></p> -<p id='n896' class='pln'><a href='#n896'>896</a></p> -<p id='n897' class='pln'><a href='#n897'>897</a></p> -<p id='n898' class='pln'><a href='#n898'>898</a></p> -<p id='n899' class='pln'><a href='#n899'>899</a></p> -<p id='n900' class='pln'><a href='#n900'>900</a></p> -<p id='n901' class='pln'><a href='#n901'>901</a></p> -<p id='n902' class='pln'><a href='#n902'>902</a></p> -<p id='n903' class='pln'><a href='#n903'>903</a></p> -<p id='n904' class='pln'><a href='#n904'>904</a></p> -<p id='n905' class='pln'><a href='#n905'>905</a></p> -<p id='n906' class='stm mis'><a href='#n906'>906</a></p> -<p id='n907' class='stm mis'><a href='#n907'>907</a></p> -<p id='n908' class='stm mis'><a href='#n908'>908</a></p> -<p id='n909' class='pln'><a href='#n909'>909</a></p> -<p id='n910' class='stm run hide_run'><a href='#n910'>910</a></p> -<p id='n911' class='stm mis'><a href='#n911'>911</a></p> -<p id='n912' class='pln'><a href='#n912'>912</a></p> -<p id='n913' class='pln'><a href='#n913'>913</a></p> -<p id='n914' class='pln'><a href='#n914'>914</a></p> -<p id='n915' class='pln'><a href='#n915'>915</a></p> -<p id='n916' class='pln'><a href='#n916'>916</a></p> -<p id='n917' class='pln'><a href='#n917'>917</a></p> -<p id='n918' class='pln'><a href='#n918'>918</a></p> -<p id='n919' class='pln'><a href='#n919'>919</a></p> -<p id='n920' class='pln'><a href='#n920'>920</a></p> -<p id='n921' class='pln'><a href='#n921'>921</a></p> -<p id='n922' class='pln'><a href='#n922'>922</a></p> -<p id='n923' class='pln'><a href='#n923'>923</a></p> -<p id='n924' class='pln'><a href='#n924'>924</a></p> -<p id='n925' class='pln'><a href='#n925'>925</a></p> -<p id='n926' class='pln'><a href='#n926'>926</a></p> -<p id='n927' class='pln'><a href='#n927'>927</a></p> -<p id='n928' class='pln'><a href='#n928'>928</a></p> -<p id='n929' class='pln'><a href='#n929'>929</a></p> -<p id='n930' class='pln'><a href='#n930'>930</a></p> -<p id='n931' class='pln'><a href='#n931'>931</a></p> -<p id='n932' class='pln'><a href='#n932'>932</a></p> -<p id='n933' class='pln'><a href='#n933'>933</a></p> -<p id='n934' class='pln'><a href='#n934'>934</a></p> -<p id='n935' class='pln'><a href='#n935'>935</a></p> -<p id='n936' class='pln'><a href='#n936'>936</a></p> -<p id='n937' class='pln'><a href='#n937'>937</a></p> -<p id='n938' class='pln'><a href='#n938'>938</a></p> -<p id='n939' class='pln'><a href='#n939'>939</a></p> -<p id='n940' class='pln'><a href='#n940'>940</a></p> -<p id='n941' class='pln'><a href='#n941'>941</a></p> -<p id='n942' class='pln'><a href='#n942'>942</a></p> -<p id='n943' class='pln'><a href='#n943'>943</a></p> -<p id='n944' class='pln'><a href='#n944'>944</a></p> -<p id='n945' class='pln'><a href='#n945'>945</a></p> -<p id='n946' class='pln'><a href='#n946'>946</a></p> -<p id='n947' class='pln'><a href='#n947'>947</a></p> -<p id='n948' class='pln'><a href='#n948'>948</a></p> -<p id='n949' class='pln'><a href='#n949'>949</a></p> -<p id='n950' class='stm mis'><a href='#n950'>950</a></p> -<p id='n951' class='stm mis'><a href='#n951'>951</a></p> -<p id='n952' class='stm mis'><a href='#n952'>952</a></p> -<p id='n953' class='stm mis'><a href='#n953'>953</a></p> -<p id='n954' class='stm mis'><a href='#n954'>954</a></p> -<p id='n955' class='stm mis'><a href='#n955'>955</a></p> -<p id='n956' class='pln'><a href='#n956'>956</a></p> -<p id='n957' class='stm run hide_run'><a href='#n957'>957</a></p> -<p id='n958' class='stm mis'><a href='#n958'>958</a></p> -<p id='n959' class='pln'><a href='#n959'>959</a></p> -<p id='n960' class='pln'><a href='#n960'>960</a></p> -<p id='n961' class='pln'><a href='#n961'>961</a></p> -<p id='n962' class='pln'><a href='#n962'>962</a></p> -<p id='n963' class='pln'><a href='#n963'>963</a></p> -<p id='n964' class='pln'><a href='#n964'>964</a></p> -<p id='n965' class='pln'><a href='#n965'>965</a></p> -<p id='n966' class='pln'><a href='#n966'>966</a></p> -<p id='n967' class='pln'><a href='#n967'>967</a></p> -<p id='n968' class='pln'><a href='#n968'>968</a></p> -<p id='n969' class='pln'><a href='#n969'>969</a></p> -<p id='n970' class='pln'><a href='#n970'>970</a></p> -<p id='n971' class='pln'><a href='#n971'>971</a></p> -<p id='n972' class='pln'><a href='#n972'>972</a></p> -<p id='n973' class='pln'><a href='#n973'>973</a></p> -<p id='n974' class='pln'><a href='#n974'>974</a></p> -<p id='n975' class='pln'><a href='#n975'>975</a></p> -<p id='n976' class='pln'><a href='#n976'>976</a></p> -<p id='n977' class='pln'><a href='#n977'>977</a></p> -<p id='n978' class='pln'><a href='#n978'>978</a></p> -<p id='n979' class='pln'><a href='#n979'>979</a></p> -<p id='n980' class='pln'><a href='#n980'>980</a></p> -<p id='n981' class='pln'><a href='#n981'>981</a></p> -<p id='n982' class='pln'><a href='#n982'>982</a></p> -<p id='n983' class='pln'><a href='#n983'>983</a></p> -<p id='n984' class='pln'><a href='#n984'>984</a></p> -<p id='n985' class='pln'><a href='#n985'>985</a></p> -<p id='n986' class='pln'><a href='#n986'>986</a></p> -<p id='n987' class='pln'><a href='#n987'>987</a></p> -<p id='n988' class='pln'><a href='#n988'>988</a></p> -<p id='n989' class='pln'><a href='#n989'>989</a></p> -<p id='n990' class='pln'><a href='#n990'>990</a></p> -<p id='n991' class='pln'><a href='#n991'>991</a></p> -<p id='n992' class='pln'><a href='#n992'>992</a></p> -<p id='n993' class='pln'><a href='#n993'>993</a></p> -<p id='n994' class='pln'><a href='#n994'>994</a></p> -<p id='n995' class='pln'><a href='#n995'>995</a></p> -<p id='n996' class='pln'><a href='#n996'>996</a></p> -<p id='n997' class='pln'><a href='#n997'>997</a></p> -<p id='n998' class='pln'><a href='#n998'>998</a></p> -<p id='n999' class='pln'><a href='#n999'>999</a></p> -<p id='n1000' class='pln'><a href='#n1000'>1000</a></p> -<p id='n1001' class='stm mis'><a href='#n1001'>1001</a></p> -<p id='n1002' class='stm mis'><a href='#n1002'>1002</a></p> -<p id='n1003' class='stm mis'><a href='#n1003'>1003</a></p> -<p id='n1004' class='stm mis'><a href='#n1004'>1004</a></p> -<p id='n1005' class='stm mis'><a href='#n1005'>1005</a></p> -<p id='n1006' class='stm mis'><a href='#n1006'>1006</a></p> -<p id='n1007' class='pln'><a href='#n1007'>1007</a></p> -<p id='n1008' class='stm run hide_run'><a href='#n1008'>1008</a></p> -<p id='n1009' class='stm mis'><a href='#n1009'>1009</a></p> -<p id='n1010' class='pln'><a href='#n1010'>1010</a></p> -<p id='n1011' class='pln'><a href='#n1011'>1011</a></p> -<p id='n1012' class='pln'><a href='#n1012'>1012</a></p> -<p id='n1013' class='pln'><a href='#n1013'>1013</a></p> -<p id='n1014' class='pln'><a href='#n1014'>1014</a></p> -<p id='n1015' class='pln'><a href='#n1015'>1015</a></p> -<p id='n1016' class='pln'><a href='#n1016'>1016</a></p> -<p id='n1017' class='pln'><a href='#n1017'>1017</a></p> -<p id='n1018' class='pln'><a href='#n1018'>1018</a></p> -<p id='n1019' class='pln'><a href='#n1019'>1019</a></p> -<p id='n1020' class='pln'><a href='#n1020'>1020</a></p> -<p id='n1021' class='pln'><a href='#n1021'>1021</a></p> -<p id='n1022' class='pln'><a href='#n1022'>1022</a></p> -<p id='n1023' class='pln'><a href='#n1023'>1023</a></p> -<p id='n1024' class='pln'><a href='#n1024'>1024</a></p> -<p id='n1025' class='pln'><a href='#n1025'>1025</a></p> -<p id='n1026' class='pln'><a href='#n1026'>1026</a></p> -<p id='n1027' class='pln'><a href='#n1027'>1027</a></p> -<p id='n1028' class='pln'><a href='#n1028'>1028</a></p> -<p id='n1029' class='pln'><a href='#n1029'>1029</a></p> -<p id='n1030' class='pln'><a href='#n1030'>1030</a></p> -<p id='n1031' class='pln'><a href='#n1031'>1031</a></p> -<p id='n1032' class='pln'><a href='#n1032'>1032</a></p> -<p id='n1033' class='pln'><a href='#n1033'>1033</a></p> -<p id='n1034' class='pln'><a href='#n1034'>1034</a></p> -<p id='n1035' class='pln'><a href='#n1035'>1035</a></p> -<p id='n1036' class='pln'><a href='#n1036'>1036</a></p> -<p id='n1037' class='pln'><a href='#n1037'>1037</a></p> -<p id='n1038' class='pln'><a href='#n1038'>1038</a></p> -<p id='n1039' class='pln'><a href='#n1039'>1039</a></p> -<p id='n1040' class='pln'><a href='#n1040'>1040</a></p> -<p id='n1041' class='pln'><a href='#n1041'>1041</a></p> -<p id='n1042' class='pln'><a href='#n1042'>1042</a></p> -<p id='n1043' class='pln'><a href='#n1043'>1043</a></p> -<p id='n1044' class='pln'><a href='#n1044'>1044</a></p> -<p id='n1045' class='stm mis'><a href='#n1045'>1045</a></p> -<p id='n1046' class='stm mis'><a href='#n1046'>1046</a></p> -<p id='n1047' class='stm mis'><a href='#n1047'>1047</a></p> -<p id='n1048' class='stm mis'><a href='#n1048'>1048</a></p> -<p id='n1049' class='pln'><a href='#n1049'>1049</a></p> -<p id='n1050' class='stm run hide_run'><a href='#n1050'>1050</a></p> -<p id='n1051' class='stm mis'><a href='#n1051'>1051</a></p> -<p id='n1052' class='pln'><a href='#n1052'>1052</a></p> -<p id='n1053' class='pln'><a href='#n1053'>1053</a></p> -<p id='n1054' class='pln'><a href='#n1054'>1054</a></p> -<p id='n1055' class='pln'><a href='#n1055'>1055</a></p> -<p id='n1056' class='pln'><a href='#n1056'>1056</a></p> -<p id='n1057' class='pln'><a href='#n1057'>1057</a></p> -<p id='n1058' class='pln'><a href='#n1058'>1058</a></p> -<p id='n1059' class='pln'><a href='#n1059'>1059</a></p> -<p id='n1060' class='pln'><a href='#n1060'>1060</a></p> -<p id='n1061' class='pln'><a href='#n1061'>1061</a></p> -<p id='n1062' class='pln'><a href='#n1062'>1062</a></p> -<p id='n1063' class='pln'><a href='#n1063'>1063</a></p> -<p id='n1064' class='pln'><a href='#n1064'>1064</a></p> -<p id='n1065' class='pln'><a href='#n1065'>1065</a></p> -<p id='n1066' class='pln'><a href='#n1066'>1066</a></p> -<p id='n1067' class='stm mis'><a href='#n1067'>1067</a></p> -<p id='n1068' class='stm mis'><a href='#n1068'>1068</a></p> -<p id='n1069' class='pln'><a href='#n1069'>1069</a></p> -<p id='n1070' class='stm run hide_run'><a href='#n1070'>1070</a></p> -<p id='n1071' class='stm mis'><a href='#n1071'>1071</a></p> -<p id='n1072' class='pln'><a href='#n1072'>1072</a></p> -<p id='n1073' class='pln'><a href='#n1073'>1073</a></p> -<p id='n1074' class='pln'><a href='#n1074'>1074</a></p> -<p id='n1075' class='pln'><a href='#n1075'>1075</a></p> -<p id='n1076' class='pln'><a href='#n1076'>1076</a></p> -<p id='n1077' class='pln'><a href='#n1077'>1077</a></p> -<p id='n1078' class='pln'><a href='#n1078'>1078</a></p> -<p id='n1079' class='pln'><a href='#n1079'>1079</a></p> -<p id='n1080' class='pln'><a href='#n1080'>1080</a></p> -<p id='n1081' class='pln'><a href='#n1081'>1081</a></p> -<p id='n1082' class='pln'><a href='#n1082'>1082</a></p> -<p id='n1083' class='pln'><a href='#n1083'>1083</a></p> -<p id='n1084' class='pln'><a href='#n1084'>1084</a></p> -<p id='n1085' class='pln'><a href='#n1085'>1085</a></p> -<p id='n1086' class='pln'><a href='#n1086'>1086</a></p> -<p id='n1087' class='pln'><a href='#n1087'>1087</a></p> -<p id='n1088' class='pln'><a href='#n1088'>1088</a></p> -<p id='n1089' class='pln'><a href='#n1089'>1089</a></p> -<p id='n1090' class='pln'><a href='#n1090'>1090</a></p> -<p id='n1091' class='pln'><a href='#n1091'>1091</a></p> -<p id='n1092' class='pln'><a href='#n1092'>1092</a></p> -<p id='n1093' class='pln'><a href='#n1093'>1093</a></p> -<p id='n1094' class='pln'><a href='#n1094'>1094</a></p> -<p id='n1095' class='pln'><a href='#n1095'>1095</a></p> -<p id='n1096' class='pln'><a href='#n1096'>1096</a></p> -<p id='n1097' class='pln'><a href='#n1097'>1097</a></p> -<p id='n1098' class='pln'><a href='#n1098'>1098</a></p> -<p id='n1099' class='pln'><a href='#n1099'>1099</a></p> -<p id='n1100' class='pln'><a href='#n1100'>1100</a></p> -<p id='n1101' class='pln'><a href='#n1101'>1101</a></p> -<p id='n1102' class='pln'><a href='#n1102'>1102</a></p> -<p id='n1103' class='pln'><a href='#n1103'>1103</a></p> -<p id='n1104' class='pln'><a href='#n1104'>1104</a></p> -<p id='n1105' class='pln'><a href='#n1105'>1105</a></p> -<p id='n1106' class='pln'><a href='#n1106'>1106</a></p> -<p id='n1107' class='pln'><a href='#n1107'>1107</a></p> -<p id='n1108' class='pln'><a href='#n1108'>1108</a></p> -<p id='n1109' class='stm mis'><a href='#n1109'>1109</a></p> -<p id='n1110' class='stm mis'><a href='#n1110'>1110</a></p> -<p id='n1111' class='stm mis'><a href='#n1111'>1111</a></p> -<p id='n1112' class='stm mis'><a href='#n1112'>1112</a></p> -<p id='n1113' class='stm mis'><a href='#n1113'>1113</a></p> -<p id='n1114' class='pln'><a href='#n1114'>1114</a></p> -<p id='n1115' class='pln'><a href='#n1115'>1115</a></p> -<p id='n1116' class='stm run hide_run'><a href='#n1116'>1116</a></p> -<p id='n1117' class='pln'><a href='#n1117'>1117</a></p> -<p id='n1118' class='pln'><a href='#n1118'>1118</a></p> -<p id='n1119' class='stm run hide_run'><a href='#n1119'>1119</a></p> -<p id='n1120' class='pln'><a href='#n1120'>1120</a></p> -<p id='n1121' class='pln'><a href='#n1121'>1121</a></p> -<p id='n1122' class='pln'><a href='#n1122'>1122</a></p> -<p id='n1123' class='pln'><a href='#n1123'>1123</a></p> -<p id='n1124' class='pln'><a href='#n1124'>1124</a></p> -<p id='n1125' class='pln'><a href='#n1125'>1125</a></p> -<p id='n1126' class='pln'><a href='#n1126'>1126</a></p> -<p id='n1127' class='pln'><a href='#n1127'>1127</a></p> -<p id='n1128' class='stm run hide_run'><a href='#n1128'>1128</a></p> -<p id='n1129' class='pln'><a href='#n1129'>1129</a></p> -<p id='n1130' class='pln'><a href='#n1130'>1130</a></p> -<p id='n1131' class='pln'><a href='#n1131'>1131</a></p> -<p id='n1132' class='pln'><a href='#n1132'>1132</a></p> -<p id='n1133' class='pln'><a href='#n1133'>1133</a></p> -<p id='n1134' class='pln'><a href='#n1134'>1134</a></p> -<p id='n1135' class='pln'><a href='#n1135'>1135</a></p> -<p id='n1136' class='pln'><a href='#n1136'>1136</a></p> -<p id='n1137' class='stm run hide_run'><a href='#n1137'>1137</a></p> -<p id='n1138' class='stm mis'><a href='#n1138'>1138</a></p> -<p id='n1139' class='stm mis'><a href='#n1139'>1139</a></p> -<p id='n1140' class='stm mis'><a href='#n1140'>1140</a></p> -<p id='n1141' class='pln'><a href='#n1141'>1141</a></p> -<p id='n1142' class='stm run hide_run'><a href='#n1142'>1142</a></p> -<p id='n1143' class='stm mis'><a href='#n1143'>1143</a></p> -<p id='n1144' class='stm mis'><a href='#n1144'>1144</a></p> -<p id='n1145' class='stm mis'><a href='#n1145'>1145</a></p> -<p id='n1146' class='pln'><a href='#n1146'>1146</a></p> -<p id='n1147' class='stm run hide_run'><a href='#n1147'>1147</a></p> -<p id='n1148' class='stm mis'><a href='#n1148'>1148</a></p> -<p id='n1149' class='stm mis'><a href='#n1149'>1149</a></p> -<p id='n1150' class='stm mis'><a href='#n1150'>1150</a></p> -<p id='n1151' class='pln'><a href='#n1151'>1151</a></p> -<p id='n1152' class='stm run hide_run'><a href='#n1152'>1152</a></p> -<p id='n1153' class='stm mis'><a href='#n1153'>1153</a></p> -<p id='n1154' class='stm mis'><a href='#n1154'>1154</a></p> -<p id='n1155' class='stm mis'><a href='#n1155'>1155</a></p> -<p id='n1156' class='pln'><a href='#n1156'>1156</a></p> -<p id='n1157' class='pln'><a href='#n1157'>1157</a></p> -<p id='n1158' class='stm run hide_run'><a href='#n1158'>1158</a></p> -<p id='n1159' class='pln'><a href='#n1159'>1159</a></p> -<p id='n1160' class='stm run hide_run'><a href='#n1160'>1160</a></p> -<p id='n1161' class='stm mis'><a href='#n1161'>1161</a></p> -<p id='n1162' class='pln'><a href='#n1162'>1162</a></p> -<p id='n1163' class='pln'><a href='#n1163'>1163</a></p> -<p id='n1164' class='pln'><a href='#n1164'>1164</a></p> -<p id='n1165' class='pln'><a href='#n1165'>1165</a></p> -<p id='n1166' class='pln'><a href='#n1166'>1166</a></p> -<p id='n1167' class='pln'><a href='#n1167'>1167</a></p> -<p id='n1168' class='pln'><a href='#n1168'>1168</a></p> -<p id='n1169' class='pln'><a href='#n1169'>1169</a></p> -<p id='n1170' class='pln'><a href='#n1170'>1170</a></p> -<p id='n1171' class='pln'><a href='#n1171'>1171</a></p> -<p id='n1172' class='pln'><a href='#n1172'>1172</a></p> -<p id='n1173' class='pln'><a href='#n1173'>1173</a></p> -<p id='n1174' class='pln'><a href='#n1174'>1174</a></p> -<p id='n1175' class='pln'><a href='#n1175'>1175</a></p> -<p id='n1176' class='pln'><a href='#n1176'>1176</a></p> -<p id='n1177' class='pln'><a href='#n1177'>1177</a></p> -<p id='n1178' class='pln'><a href='#n1178'>1178</a></p> -<p id='n1179' class='pln'><a href='#n1179'>1179</a></p> -<p id='n1180' class='stm mis'><a href='#n1180'>1180</a></p> -<p id='n1181' class='stm mis'><a href='#n1181'>1181</a></p> -<p id='n1182' class='stm mis'><a href='#n1182'>1182</a></p> -<p id='n1183' class='stm mis'><a href='#n1183'>1183</a></p> -<p id='n1184' class='stm mis'><a href='#n1184'>1184</a></p> -<p id='n1185' class='pln'><a href='#n1185'>1185</a></p> -<p id='n1186' class='pln'><a href='#n1186'>1186</a></p> -<p id='n1187' class='stm run hide_run'><a href='#n1187'>1187</a></p> -<p id='n1188' class='pln'><a href='#n1188'>1188</a></p> -<p id='n1189' class='pln'><a href='#n1189'>1189</a></p> -<p id='n1190' class='pln'><a href='#n1190'>1190</a></p> -<p id='n1191' class='pln'><a href='#n1191'>1191</a></p> -<p id='n1192' class='pln'><a href='#n1192'>1192</a></p> -<p id='n1193' class='stm run hide_run'><a href='#n1193'>1193</a></p> -<p id='n1194' class='stm mis'><a href='#n1194'>1194</a></p> -<p id='n1195' class='stm mis'><a href='#n1195'>1195</a></p> -<p id='n1196' class='pln'><a href='#n1196'>1196</a></p> -<p id='n1197' class='stm run hide_run'><a href='#n1197'>1197</a></p> -<p id='n1198' class='stm mis'><a href='#n1198'>1198</a></p> -<p id='n1199' class='pln'><a href='#n1199'>1199</a></p> -<p id='n1200' class='pln'><a href='#n1200'>1200</a></p> -<p id='n1201' class='pln'><a href='#n1201'>1201</a></p> -<p id='n1202' class='pln'><a href='#n1202'>1202</a></p> -<p id='n1203' class='stm mis'><a href='#n1203'>1203</a></p> -<p id='n1204' class='stm mis'><a href='#n1204'>1204</a></p> -<p id='n1205' class='stm mis'><a href='#n1205'>1205</a></p> -<p id='n1206' class='pln'><a href='#n1206'>1206</a></p> -<p id='n1207' class='pln'><a href='#n1207'>1207</a></p> -<p id='n1208' class='stm run hide_run'><a href='#n1208'>1208</a></p> -<p id='n1209' class='stm run hide_run'><a href='#n1209'>1209</a></p> -<p id='n1210' class='pln'><a href='#n1210'>1210</a></p> -<p id='n1211' class='pln'><a href='#n1211'>1211</a></p> -<p id='n1212' class='pln'><a href='#n1212'>1212</a></p> -<p id='n1213' class='pln'><a href='#n1213'>1213</a></p> -<p id='n1214' class='pln'><a href='#n1214'>1214</a></p> -<p id='n1215' class='pln'><a href='#n1215'>1215</a></p> -<p id='n1216' class='pln'><a href='#n1216'>1216</a></p> -<p id='n1217' class='pln'><a href='#n1217'>1217</a></p> -<p id='n1218' class='pln'><a href='#n1218'>1218</a></p> -<p id='n1219' class='pln'><a href='#n1219'>1219</a></p> -<p id='n1220' class='pln'><a href='#n1220'>1220</a></p> -<p id='n1221' class='pln'><a href='#n1221'>1221</a></p> -<p id='n1222' class='pln'><a href='#n1222'>1222</a></p> -<p id='n1223' class='pln'><a href='#n1223'>1223</a></p> -<p id='n1224' class='pln'><a href='#n1224'>1224</a></p> -<p id='n1225' class='pln'><a href='#n1225'>1225</a></p> -<p id='n1226' class='pln'><a href='#n1226'>1226</a></p> -<p id='n1227' class='pln'><a href='#n1227'>1227</a></p> -<p id='n1228' class='pln'><a href='#n1228'>1228</a></p> -<p id='n1229' class='pln'><a href='#n1229'>1229</a></p> -<p id='n1230' class='pln'><a href='#n1230'>1230</a></p> -<p id='n1231' class='pln'><a href='#n1231'>1231</a></p> -<p id='n1232' class='pln'><a href='#n1232'>1232</a></p> -<p id='n1233' class='pln'><a href='#n1233'>1233</a></p> -<p id='n1234' class='pln'><a href='#n1234'>1234</a></p> -<p id='n1235' class='pln'><a href='#n1235'>1235</a></p> -<p id='n1236' class='pln'><a href='#n1236'>1236</a></p> -<p id='n1237' class='pln'><a href='#n1237'>1237</a></p> -<p id='n1238' class='pln'><a href='#n1238'>1238</a></p> -<p id='n1239' class='pln'><a href='#n1239'>1239</a></p> -<p id='n1240' class='pln'><a href='#n1240'>1240</a></p> -<p id='n1241' class='pln'><a href='#n1241'>1241</a></p> -<p id='n1242' class='pln'><a href='#n1242'>1242</a></p> -<p id='n1243' class='pln'><a href='#n1243'>1243</a></p> -<p id='n1244' class='pln'><a href='#n1244'>1244</a></p> -<p id='n1245' class='pln'><a href='#n1245'>1245</a></p> -<p id='n1246' class='pln'><a href='#n1246'>1246</a></p> -<p id='n1247' class='pln'><a href='#n1247'>1247</a></p> -<p id='n1248' class='pln'><a href='#n1248'>1248</a></p> -<p id='n1249' class='pln'><a href='#n1249'>1249</a></p> -<p id='n1250' class='pln'><a href='#n1250'>1250</a></p> -<p id='n1251' class='pln'><a href='#n1251'>1251</a></p> -<p id='n1252' class='pln'><a href='#n1252'>1252</a></p> -<p id='n1253' class='pln'><a href='#n1253'>1253</a></p> -<p id='n1254' class='pln'><a href='#n1254'>1254</a></p> -<p id='n1255' class='stm run hide_run'><a href='#n1255'>1255</a></p> -<p id='n1256' class='pln'><a href='#n1256'>1256</a></p> -<p id='n1257' class='stm mis'><a href='#n1257'>1257</a></p> -<p id='n1258' class='stm mis'><a href='#n1258'>1258</a></p> -<p id='n1259' class='pln'><a href='#n1259'>1259</a></p> -<p id='n1260' class='stm run hide_run'><a href='#n1260'>1260</a></p> -<p id='n1261' class='pln'><a href='#n1261'>1261</a></p> -<p id='n1262' class='stm mis'><a href='#n1262'>1262</a></p> -<p id='n1263' class='stm mis'><a href='#n1263'>1263</a></p> -<p id='n1264' class='stm mis'><a href='#n1264'>1264</a></p> -<p id='n1265' class='pln'><a href='#n1265'>1265</a></p> -<p id='n1266' class='stm run hide_run'><a href='#n1266'>1266</a></p> -<p id='n1267' class='pln'><a href='#n1267'>1267</a></p> -<p id='n1268' class='stm mis'><a href='#n1268'>1268</a></p> -<p id='n1269' class='stm mis'><a href='#n1269'>1269</a></p> -<p id='n1270' class='stm mis'><a href='#n1270'>1270</a></p> -<p id='n1271' class='pln'><a href='#n1271'>1271</a></p> -<p id='n1272' class='stm run hide_run'><a href='#n1272'>1272</a></p> -<p id='n1273' class='pln'><a href='#n1273'>1273</a></p> -<p id='n1274' class='stm mis'><a href='#n1274'>1274</a></p> -<p id='n1275' class='stm mis'><a href='#n1275'>1275</a></p> -<p id='n1276' class='stm mis'><a href='#n1276'>1276</a></p> -<p id='n1277' class='pln'><a href='#n1277'>1277</a></p> -<p id='n1278' class='stm run hide_run'><a href='#n1278'>1278</a></p> -<p id='n1279' class='pln'><a href='#n1279'>1279</a></p> -<p id='n1280' class='stm mis'><a href='#n1280'>1280</a></p> -<p id='n1281' class='stm mis'><a href='#n1281'>1281</a></p> -<p id='n1282' class='stm mis'><a href='#n1282'>1282</a></p> -<p id='n1283' class='pln'><a href='#n1283'>1283</a></p> -<p id='n1284' class='stm run hide_run'><a href='#n1284'>1284</a></p> -<p id='n1285' class='stm mis'><a href='#n1285'>1285</a></p> -<p id='n1286' class='pln'><a href='#n1286'>1286</a></p> -<p id='n1287' class='pln'><a href='#n1287'>1287</a></p> -<p id='n1288' class='pln'><a href='#n1288'>1288</a></p> -<p id='n1289' class='pln'><a href='#n1289'>1289</a></p> -<p id='n1290' class='pln'><a href='#n1290'>1290</a></p> -<p id='n1291' class='pln'><a href='#n1291'>1291</a></p> -<p id='n1292' class='pln'><a href='#n1292'>1292</a></p> -<p id='n1293' class='pln'><a href='#n1293'>1293</a></p> -<p id='n1294' class='pln'><a href='#n1294'>1294</a></p> -<p id='n1295' class='pln'><a href='#n1295'>1295</a></p> -<p id='n1296' class='stm mis'><a href='#n1296'>1296</a></p> -<p id='n1297' class='pln'><a href='#n1297'>1297</a></p> -<p id='n1298' class='stm mis'><a href='#n1298'>1298</a></p> -<p id='n1299' class='stm mis'><a href='#n1299'>1299</a></p> -<p id='n1300' class='stm mis'><a href='#n1300'>1300</a></p> -<p id='n1301' class='pln'><a href='#n1301'>1301</a></p> -<p id='n1302' class='stm mis'><a href='#n1302'>1302</a></p> -<p id='n1303' class='stm mis'><a href='#n1303'>1303</a></p> -<p id='n1304' class='stm mis'><a href='#n1304'>1304</a></p> -<p id='n1305' class='pln'><a href='#n1305'>1305</a></p> -<p id='n1306' class='stm mis'><a href='#n1306'>1306</a></p> -<p id='n1307' class='stm mis'><a href='#n1307'>1307</a></p> -<p id='n1308' class='stm mis'><a href='#n1308'>1308</a></p> -<p id='n1309' class='pln'><a href='#n1309'>1309</a></p> -<p id='n1310' class='stm mis'><a href='#n1310'>1310</a></p> -<p id='n1311' class='stm mis'><a href='#n1311'>1311</a></p> -<p id='n1312' class='stm mis'><a href='#n1312'>1312</a></p> -<p id='n1313' class='pln'><a href='#n1313'>1313</a></p> -<p id='n1314' class='stm mis'><a href='#n1314'>1314</a></p> -<p id='n1315' class='stm mis'><a href='#n1315'>1315</a></p> -<p id='n1316' class='stm mis'><a href='#n1316'>1316</a></p> -<p id='n1317' class='pln'><a href='#n1317'>1317</a></p> -<p id='n1318' class='stm mis'><a href='#n1318'>1318</a></p> -<p id='n1319' class='stm mis'><a href='#n1319'>1319</a></p> -<p id='n1320' class='stm mis'><a href='#n1320'>1320</a></p> -<p id='n1321' class='pln'><a href='#n1321'>1321</a></p> -<p id='n1322' class='stm mis'><a href='#n1322'>1322</a></p> -<p id='n1323' class='stm mis'><a href='#n1323'>1323</a></p> -<p id='n1324' class='stm mis'><a href='#n1324'>1324</a></p> -<p id='n1325' class='pln'><a href='#n1325'>1325</a></p> -<p id='n1326' class='stm run hide_run'><a href='#n1326'>1326</a></p> -<p id='n1327' class='pln'><a href='#n1327'>1327</a></p> -<p id='n1328' class='pln'><a href='#n1328'>1328</a></p> -<p id='n1329' class='stm mis'><a href='#n1329'>1329</a></p> -<p id='n1330' class='pln'><a href='#n1330'>1330</a></p> -<p id='n1331' class='pln'><a href='#n1331'>1331</a></p> -<p id='n1332' class='pln'><a href='#n1332'>1332</a></p> -<p id='n1333' class='pln'><a href='#n1333'>1333</a></p> -<p id='n1334' class='pln'><a href='#n1334'>1334</a></p> -<p id='n1335' class='pln'><a href='#n1335'>1335</a></p> -<p id='n1336' class='pln'><a href='#n1336'>1336</a></p> -<p id='n1337' class='pln'><a href='#n1337'>1337</a></p> -<p id='n1338' class='pln'><a href='#n1338'>1338</a></p> -<p id='n1339' class='pln'><a href='#n1339'>1339</a></p> -<p id='n1340' class='pln'><a href='#n1340'>1340</a></p> -<p id='n1341' class='pln'><a href='#n1341'>1341</a></p> -<p id='n1342' class='pln'><a href='#n1342'>1342</a></p> -<p id='n1343' class='pln'><a href='#n1343'>1343</a></p> -<p id='n1344' class='pln'><a href='#n1344'>1344</a></p> -<p id='n1345' class='pln'><a href='#n1345'>1345</a></p> -<p id='n1346' class='pln'><a href='#n1346'>1346</a></p> -<p id='n1347' class='pln'><a href='#n1347'>1347</a></p> -<p id='n1348' class='pln'><a href='#n1348'>1348</a></p> -<p id='n1349' class='pln'><a href='#n1349'>1349</a></p> -<p id='n1350' class='pln'><a href='#n1350'>1350</a></p> -<p id='n1351' class='pln'><a href='#n1351'>1351</a></p> -<p id='n1352' class='pln'><a href='#n1352'>1352</a></p> -<p id='n1353' class='stm mis'><a href='#n1353'>1353</a></p> -<p id='n1354' class='pln'><a href='#n1354'>1354</a></p> -<p id='n1355' class='pln'><a href='#n1355'>1355</a></p> -<p id='n1356' class='stm mis'><a href='#n1356'>1356</a></p> -<p id='n1357' class='stm mis'><a href='#n1357'>1357</a></p> -<p id='n1358' class='pln'><a href='#n1358'>1358</a></p> -<p id='n1359' class='pln'><a href='#n1359'>1359</a></p> -<p id='n1360' class='stm run hide_run'><a href='#n1360'>1360</a></p> -<p id='n1361' class='pln'><a href='#n1361'>1361</a></p> -<p id='n1362' class='stm run hide_run'><a href='#n1362'>1362</a></p> -<p id='n1363' class='pln'><a href='#n1363'>1363</a></p> -<p id='n1364' class='stm mis'><a href='#n1364'>1364</a></p> -<p id='n1365' class='pln'><a href='#n1365'>1365</a></p> -<p id='n1366' class='pln'><a href='#n1366'>1366</a></p> -<p id='n1367' class='pln'><a href='#n1367'>1367</a></p> -<p id='n1368' class='pln'><a href='#n1368'>1368</a></p> -<p id='n1369' class='pln'><a href='#n1369'>1369</a></p> -<p id='n1370' class='pln'><a href='#n1370'>1370</a></p> -<p id='n1371' class='pln'><a href='#n1371'>1371</a></p> -<p id='n1372' class='pln'><a href='#n1372'>1372</a></p> -<p id='n1373' class='pln'><a href='#n1373'>1373</a></p> -<p id='n1374' class='pln'><a href='#n1374'>1374</a></p> -<p id='n1375' class='pln'><a href='#n1375'>1375</a></p> -<p id='n1376' class='pln'><a href='#n1376'>1376</a></p> -<p id='n1377' class='pln'><a href='#n1377'>1377</a></p> -<p id='n1378' class='pln'><a href='#n1378'>1378</a></p> -<p id='n1379' class='stm mis'><a href='#n1379'>1379</a></p> -<p id='n1380' class='stm mis'><a href='#n1380'>1380</a></p> -<p id='n1381' class='stm mis'><a href='#n1381'>1381</a></p> -<p id='n1382' class='stm mis'><a href='#n1382'>1382</a></p> -<p id='n1383' class='stm mis'><a href='#n1383'>1383</a></p> -<p id='n1384' class='stm mis'><a href='#n1384'>1384</a></p> -<p id='n1385' class='stm mis'><a href='#n1385'>1385</a></p> -<p id='n1386' class='stm mis'><a href='#n1386'>1386</a></p> -<p id='n1387' class='stm mis'><a href='#n1387'>1387</a></p> -<p id='n1388' class='stm mis'><a href='#n1388'>1388</a></p> -<p id='n1389' class='stm mis'><a href='#n1389'>1389</a></p> -<p id='n1390' class='stm mis'><a href='#n1390'>1390</a></p> -<p id='n1391' class='pln'><a href='#n1391'>1391</a></p> -<p id='n1392' class='stm run hide_run'><a href='#n1392'>1392</a></p> -<p id='n1393' class='stm mis'><a href='#n1393'>1393</a></p> -<p id='n1394' class='pln'><a href='#n1394'>1394</a></p> -<p id='n1395' class='pln'><a href='#n1395'>1395</a></p> -<p id='n1396' class='pln'><a href='#n1396'>1396</a></p> -<p id='n1397' class='pln'><a href='#n1397'>1397</a></p> -<p id='n1398' class='pln'><a href='#n1398'>1398</a></p> -<p id='n1399' class='pln'><a href='#n1399'>1399</a></p> -<p id='n1400' class='pln'><a href='#n1400'>1400</a></p> -<p id='n1401' class='pln'><a href='#n1401'>1401</a></p> -<p id='n1402' class='pln'><a href='#n1402'>1402</a></p> -<p id='n1403' class='pln'><a href='#n1403'>1403</a></p> -<p id='n1404' class='pln'><a href='#n1404'>1404</a></p> -<p id='n1405' class='pln'><a href='#n1405'>1405</a></p> -<p id='n1406' class='pln'><a href='#n1406'>1406</a></p> -<p id='n1407' class='pln'><a href='#n1407'>1407</a></p> -<p id='n1408' class='pln'><a href='#n1408'>1408</a></p> -<p id='n1409' class='pln'><a href='#n1409'>1409</a></p> -<p id='n1410' class='pln'><a href='#n1410'>1410</a></p> -<p id='n1411' class='pln'><a href='#n1411'>1411</a></p> -<p id='n1412' class='pln'><a href='#n1412'>1412</a></p> -<p id='n1413' class='pln'><a href='#n1413'>1413</a></p> -<p id='n1414' class='pln'><a href='#n1414'>1414</a></p> -<p id='n1415' class='pln'><a href='#n1415'>1415</a></p> -<p id='n1416' class='pln'><a href='#n1416'>1416</a></p> -<p id='n1417' class='pln'><a href='#n1417'>1417</a></p> -<p id='n1418' class='pln'><a href='#n1418'>1418</a></p> -<p id='n1419' class='stm mis'><a href='#n1419'>1419</a></p> -<p id='n1420' class='stm mis'><a href='#n1420'>1420</a></p> -<p id='n1421' class='stm mis'><a href='#n1421'>1421</a></p> -<p id='n1422' class='stm mis'><a href='#n1422'>1422</a></p> -<p id='n1423' class='stm mis'><a href='#n1423'>1423</a></p> -<p id='n1424' class='stm mis'><a href='#n1424'>1424</a></p> -<p id='n1425' class='pln'><a href='#n1425'>1425</a></p> -<p id='n1426' class='stm run hide_run'><a href='#n1426'>1426</a></p> -<p id='n1427' class='pln'><a href='#n1427'>1427</a></p> -<p id='n1428' class='stm mis'><a href='#n1428'>1428</a></p> -<p id='n1429' class='pln'><a href='#n1429'>1429</a></p> -<p id='n1430' class='pln'><a href='#n1430'>1430</a></p> -<p id='n1431' class='pln'><a href='#n1431'>1431</a></p> -<p id='n1432' class='pln'><a href='#n1432'>1432</a></p> -<p id='n1433' class='pln'><a href='#n1433'>1433</a></p> -<p id='n1434' class='pln'><a href='#n1434'>1434</a></p> -<p id='n1435' class='pln'><a href='#n1435'>1435</a></p> -<p id='n1436' class='pln'><a href='#n1436'>1436</a></p> -<p id='n1437' class='pln'><a href='#n1437'>1437</a></p> -<p id='n1438' class='pln'><a href='#n1438'>1438</a></p> -<p id='n1439' class='pln'><a href='#n1439'>1439</a></p> -<p id='n1440' class='pln'><a href='#n1440'>1440</a></p> -<p id='n1441' class='pln'><a href='#n1441'>1441</a></p> -<p id='n1442' class='pln'><a href='#n1442'>1442</a></p> -<p id='n1443' class='pln'><a href='#n1443'>1443</a></p> -<p id='n1444' class='pln'><a href='#n1444'>1444</a></p> -<p id='n1445' class='pln'><a href='#n1445'>1445</a></p> -<p id='n1446' class='pln'><a href='#n1446'>1446</a></p> -<p id='n1447' class='pln'><a href='#n1447'>1447</a></p> -<p id='n1448' class='pln'><a href='#n1448'>1448</a></p> -<p id='n1449' class='pln'><a href='#n1449'>1449</a></p> -<p id='n1450' class='pln'><a href='#n1450'>1450</a></p> -<p id='n1451' class='pln'><a href='#n1451'>1451</a></p> -<p id='n1452' class='pln'><a href='#n1452'>1452</a></p> -<p id='n1453' class='pln'><a href='#n1453'>1453</a></p> -<p id='n1454' class='pln'><a href='#n1454'>1454</a></p> -<p id='n1455' class='pln'><a href='#n1455'>1455</a></p> -<p id='n1456' class='pln'><a href='#n1456'>1456</a></p> -<p id='n1457' class='pln'><a href='#n1457'>1457</a></p> -<p id='n1458' class='pln'><a href='#n1458'>1458</a></p> -<p id='n1459' class='pln'><a href='#n1459'>1459</a></p> -<p id='n1460' class='pln'><a href='#n1460'>1460</a></p> -<p id='n1461' class='pln'><a href='#n1461'>1461</a></p> -<p id='n1462' class='pln'><a href='#n1462'>1462</a></p> -<p id='n1463' class='pln'><a href='#n1463'>1463</a></p> -<p id='n1464' class='pln'><a href='#n1464'>1464</a></p> -<p id='n1465' class='pln'><a href='#n1465'>1465</a></p> -<p id='n1466' class='pln'><a href='#n1466'>1466</a></p> -<p id='n1467' class='pln'><a href='#n1467'>1467</a></p> -<p id='n1468' class='pln'><a href='#n1468'>1468</a></p> -<p id='n1469' class='pln'><a href='#n1469'>1469</a></p> -<p id='n1470' class='pln'><a href='#n1470'>1470</a></p> -<p id='n1471' class='pln'><a href='#n1471'>1471</a></p> -<p id='n1472' class='pln'><a href='#n1472'>1472</a></p> -<p id='n1473' class='stm mis'><a href='#n1473'>1473</a></p> -<p id='n1474' class='stm mis'><a href='#n1474'>1474</a></p> -<p id='n1475' class='stm mis'><a href='#n1475'>1475</a></p> -<p id='n1476' class='stm mis'><a href='#n1476'>1476</a></p> -<p id='n1477' class='stm mis'><a href='#n1477'>1477</a></p> -<p id='n1478' class='stm mis'><a href='#n1478'>1478</a></p> -<p id='n1479' class='pln'><a href='#n1479'>1479</a></p> -<p id='n1480' class='stm run hide_run'><a href='#n1480'>1480</a></p> -<p id='n1481' class='stm mis'><a href='#n1481'>1481</a></p> -<p id='n1482' class='pln'><a href='#n1482'>1482</a></p> -<p id='n1483' class='pln'><a href='#n1483'>1483</a></p> -<p id='n1484' class='pln'><a href='#n1484'>1484</a></p> -<p id='n1485' class='pln'><a href='#n1485'>1485</a></p> -<p id='n1486' class='pln'><a href='#n1486'>1486</a></p> -<p id='n1487' class='pln'><a href='#n1487'>1487</a></p> -<p id='n1488' class='pln'><a href='#n1488'>1488</a></p> -<p id='n1489' class='pln'><a href='#n1489'>1489</a></p> -<p id='n1490' class='pln'><a href='#n1490'>1490</a></p> -<p id='n1491' class='pln'><a href='#n1491'>1491</a></p> -<p id='n1492' class='pln'><a href='#n1492'>1492</a></p> -<p id='n1493' class='pln'><a href='#n1493'>1493</a></p> -<p id='n1494' class='pln'><a href='#n1494'>1494</a></p> -<p id='n1495' class='pln'><a href='#n1495'>1495</a></p> -<p id='n1496' class='pln'><a href='#n1496'>1496</a></p> -<p id='n1497' class='pln'><a href='#n1497'>1497</a></p> -<p id='n1498' class='pln'><a href='#n1498'>1498</a></p> -<p id='n1499' class='pln'><a href='#n1499'>1499</a></p> -<p id='n1500' class='pln'><a href='#n1500'>1500</a></p> -<p id='n1501' class='pln'><a href='#n1501'>1501</a></p> -<p id='n1502' class='pln'><a href='#n1502'>1502</a></p> -<p id='n1503' class='pln'><a href='#n1503'>1503</a></p> -<p id='n1504' class='pln'><a href='#n1504'>1504</a></p> -<p id='n1505' class='pln'><a href='#n1505'>1505</a></p> -<p id='n1506' class='pln'><a href='#n1506'>1506</a></p> -<p id='n1507' class='pln'><a href='#n1507'>1507</a></p> -<p id='n1508' class='pln'><a href='#n1508'>1508</a></p> -<p id='n1509' class='stm mis'><a href='#n1509'>1509</a></p> -<p id='n1510' class='pln'><a href='#n1510'>1510</a></p> -<p id='n1511' class='stm mis'><a href='#n1511'>1511</a></p> -<p id='n1512' class='stm mis'><a href='#n1512'>1512</a></p> -<p id='n1513' class='stm mis'><a href='#n1513'>1513</a></p> -<p id='n1514' class='pln'><a href='#n1514'>1514</a></p> -<p id='n1515' class='stm mis'><a href='#n1515'>1515</a></p> -<p id='n1516' class='stm mis'><a href='#n1516'>1516</a></p> -<p id='n1517' class='stm mis'><a href='#n1517'>1517</a></p> -<p id='n1518' class='pln'><a href='#n1518'>1518</a></p> -<p id='n1519' class='stm mis'><a href='#n1519'>1519</a></p> -<p id='n1520' class='stm mis'><a href='#n1520'>1520</a></p> -<p id='n1521' class='pln'><a href='#n1521'>1521</a></p> -<p id='n1522' class='stm run hide_run'><a href='#n1522'>1522</a></p> -<p id='n1523' class='stm mis'><a href='#n1523'>1523</a></p> -<p id='n1524' class='pln'><a href='#n1524'>1524</a></p> -<p id='n1525' class='pln'><a href='#n1525'>1525</a></p> -<p id='n1526' class='pln'><a href='#n1526'>1526</a></p> -<p id='n1527' class='pln'><a href='#n1527'>1527</a></p> -<p id='n1528' class='pln'><a href='#n1528'>1528</a></p> -<p id='n1529' class='stm mis'><a href='#n1529'>1529</a></p> -<p id='n1530' class='stm mis'><a href='#n1530'>1530</a></p> -<p id='n1531' class='stm mis'><a href='#n1531'>1531</a></p> -<p id='n1532' class='stm mis'><a href='#n1532'>1532</a></p> -<p id='n1533' class='pln'><a href='#n1533'>1533</a></p> -<p id='n1534' class='stm run hide_run'><a href='#n1534'>1534</a></p> -<p id='n1535' class='pln'><a href='#n1535'>1535</a></p> -<p id='n1536' class='pln'><a href='#n1536'>1536</a></p> -<p id='n1537' class='stm mis'><a href='#n1537'>1537</a></p> -<p id='n1538' class='pln'><a href='#n1538'>1538</a></p> -<p id='n1539' class='pln'><a href='#n1539'>1539</a></p> -<p id='n1540' class='pln'><a href='#n1540'>1540</a></p> -<p id='n1541' class='pln'><a href='#n1541'>1541</a></p> -<p id='n1542' class='pln'><a href='#n1542'>1542</a></p> -<p id='n1543' class='pln'><a href='#n1543'>1543</a></p> -<p id='n1544' class='pln'><a href='#n1544'>1544</a></p> -<p id='n1545' class='pln'><a href='#n1545'>1545</a></p> -<p id='n1546' class='pln'><a href='#n1546'>1546</a></p> -<p id='n1547' class='pln'><a href='#n1547'>1547</a></p> -<p id='n1548' class='pln'><a href='#n1548'>1548</a></p> -<p id='n1549' class='pln'><a href='#n1549'>1549</a></p> -<p id='n1550' class='pln'><a href='#n1550'>1550</a></p> -<p id='n1551' class='stm mis'><a href='#n1551'>1551</a></p> -<p id='n1552' class='stm mis'><a href='#n1552'>1552</a></p> -<p id='n1553' class='stm mis'><a href='#n1553'>1553</a></p> -<p id='n1554' class='stm mis'><a href='#n1554'>1554</a></p> -<p id='n1555' class='stm mis'><a href='#n1555'>1555</a></p> -<p id='n1556' class='stm mis'><a href='#n1556'>1556</a></p> -<p id='n1557' class='stm mis'><a href='#n1557'>1557</a></p> -<p id='n1558' class='pln'><a href='#n1558'>1558</a></p> -<p id='n1559' class='stm run hide_run'><a href='#n1559'>1559</a></p> -<p id='n1560' class='stm mis'><a href='#n1560'>1560</a></p> -<p id='n1561' class='pln'><a href='#n1561'>1561</a></p> -<p id='n1562' class='pln'><a href='#n1562'>1562</a></p> -<p id='n1563' class='pln'><a href='#n1563'>1563</a></p> -<p id='n1564' class='pln'><a href='#n1564'>1564</a></p> -<p id='n1565' class='pln'><a href='#n1565'>1565</a></p> -<p id='n1566' class='pln'><a href='#n1566'>1566</a></p> -<p id='n1567' class='pln'><a href='#n1567'>1567</a></p> -<p id='n1568' class='pln'><a href='#n1568'>1568</a></p> -<p id='n1569' class='pln'><a href='#n1569'>1569</a></p> -<p id='n1570' class='pln'><a href='#n1570'>1570</a></p> -<p id='n1571' class='pln'><a href='#n1571'>1571</a></p> -<p id='n1572' class='pln'><a href='#n1572'>1572</a></p> -<p id='n1573' class='pln'><a href='#n1573'>1573</a></p> -<p id='n1574' class='pln'><a href='#n1574'>1574</a></p> -<p id='n1575' class='pln'><a href='#n1575'>1575</a></p> -<p id='n1576' class='pln'><a href='#n1576'>1576</a></p> -<p id='n1577' class='pln'><a href='#n1577'>1577</a></p> -<p id='n1578' class='pln'><a href='#n1578'>1578</a></p> -<p id='n1579' class='stm mis'><a href='#n1579'>1579</a></p> -<p id='n1580' class='stm mis'><a href='#n1580'>1580</a></p> -<p id='n1581' class='stm mis'><a href='#n1581'>1581</a></p> -<p id='n1582' class='stm mis'><a href='#n1582'>1582</a></p> -<p id='n1583' class='stm mis'><a href='#n1583'>1583</a></p> -<p id='n1584' class='stm mis'><a href='#n1584'>1584</a></p> -<p id='n1585' class='stm mis'><a href='#n1585'>1585</a></p> -<p id='n1586' class='stm mis'><a href='#n1586'>1586</a></p> -<p id='n1587' class='stm mis'><a href='#n1587'>1587</a></p> -<p id='n1588' class='stm mis'><a href='#n1588'>1588</a></p> -<p id='n1589' class='stm mis'><a href='#n1589'>1589</a></p> -<p id='n1590' class='stm mis'><a href='#n1590'>1590</a></p> -<p id='n1591' class='stm mis'><a href='#n1591'>1591</a></p> -<p id='n1592' class='stm mis'><a href='#n1592'>1592</a></p> -<p id='n1593' class='stm mis'><a href='#n1593'>1593</a></p> -<p id='n1594' class='stm mis'><a href='#n1594'>1594</a></p> -<p id='n1595' class='stm mis'><a href='#n1595'>1595</a></p> -<p id='n1596' class='stm mis'><a href='#n1596'>1596</a></p> -<p id='n1597' class='pln'><a href='#n1597'>1597</a></p> -<p id='n1598' class='stm run hide_run'><a href='#n1598'>1598</a></p> -<p id='n1599' class='stm mis'><a href='#n1599'>1599</a></p> -<p id='n1600' class='pln'><a href='#n1600'>1600</a></p> -<p id='n1601' class='pln'><a href='#n1601'>1601</a></p> -<p id='n1602' class='pln'><a href='#n1602'>1602</a></p> -<p id='n1603' class='pln'><a href='#n1603'>1603</a></p> -<p id='n1604' class='pln'><a href='#n1604'>1604</a></p> -<p id='n1605' class='pln'><a href='#n1605'>1605</a></p> -<p id='n1606' class='stm mis'><a href='#n1606'>1606</a></p> -<p id='n1607' class='stm mis'><a href='#n1607'>1607</a></p> -<p id='n1608' class='stm mis'><a href='#n1608'>1608</a></p> -<p id='n1609' class='stm mis'><a href='#n1609'>1609</a></p> -<p id='n1610' class='stm mis'><a href='#n1610'>1610</a></p> -<p id='n1611' class='stm mis'><a href='#n1611'>1611</a></p> -<p id='n1612' class='stm mis'><a href='#n1612'>1612</a></p> -<p id='n1613' class='stm mis'><a href='#n1613'>1613</a></p> -<p id='n1614' class='pln'><a href='#n1614'>1614</a></p> -<p id='n1615' class='stm run hide_run'><a href='#n1615'>1615</a></p> -<p id='n1616' class='stm mis'><a href='#n1616'>1616</a></p> -<p id='n1617' class='pln'><a href='#n1617'>1617</a></p> -<p id='n1618' class='pln'><a href='#n1618'>1618</a></p> -<p id='n1619' class='pln'><a href='#n1619'>1619</a></p> -<p id='n1620' class='pln'><a href='#n1620'>1620</a></p> -<p id='n1621' class='pln'><a href='#n1621'>1621</a></p> -<p id='n1622' class='pln'><a href='#n1622'>1622</a></p> -<p id='n1623' class='pln'><a href='#n1623'>1623</a></p> -<p id='n1624' class='pln'><a href='#n1624'>1624</a></p> -<p id='n1625' class='pln'><a href='#n1625'>1625</a></p> -<p id='n1626' class='pln'><a href='#n1626'>1626</a></p> -<p id='n1627' class='pln'><a href='#n1627'>1627</a></p> -<p id='n1628' class='pln'><a href='#n1628'>1628</a></p> -<p id='n1629' class='pln'><a href='#n1629'>1629</a></p> -<p id='n1630' class='pln'><a href='#n1630'>1630</a></p> -<p id='n1631' class='pln'><a href='#n1631'>1631</a></p> -<p id='n1632' class='pln'><a href='#n1632'>1632</a></p> -<p id='n1633' class='pln'><a href='#n1633'>1633</a></p> -<p id='n1634' class='pln'><a href='#n1634'>1634</a></p> -<p id='n1635' class='pln'><a href='#n1635'>1635</a></p> -<p id='n1636' class='stm mis'><a href='#n1636'>1636</a></p> -<p id='n1637' class='stm mis'><a href='#n1637'>1637</a></p> -<p id='n1638' class='stm mis'><a href='#n1638'>1638</a></p> -<p id='n1639' class='pln'><a href='#n1639'>1639</a></p> -<p id='n1640' class='stm run hide_run'><a href='#n1640'>1640</a></p> -<p id='n1641' class='stm mis'><a href='#n1641'>1641</a></p> -<p id='n1642' class='pln'><a href='#n1642'>1642</a></p> -<p id='n1643' class='pln'><a href='#n1643'>1643</a></p> -<p id='n1644' class='pln'><a href='#n1644'>1644</a></p> -<p id='n1645' class='pln'><a href='#n1645'>1645</a></p> -<p id='n1646' class='pln'><a href='#n1646'>1646</a></p> -<p id='n1647' class='pln'><a href='#n1647'>1647</a></p> -<p id='n1648' class='pln'><a href='#n1648'>1648</a></p> -<p id='n1649' class='pln'><a href='#n1649'>1649</a></p> -<p id='n1650' class='pln'><a href='#n1650'>1650</a></p> -<p id='n1651' class='pln'><a href='#n1651'>1651</a></p> -<p id='n1652' class='pln'><a href='#n1652'>1652</a></p> -<p id='n1653' class='pln'><a href='#n1653'>1653</a></p> -<p id='n1654' class='pln'><a href='#n1654'>1654</a></p> -<p id='n1655' class='pln'><a href='#n1655'>1655</a></p> -<p id='n1656' class='stm mis'><a href='#n1656'>1656</a></p> -<p id='n1657' class='stm mis'><a href='#n1657'>1657</a></p> -<p id='n1658' class='stm mis'><a href='#n1658'>1658</a></p> -<p id='n1659' class='pln'><a href='#n1659'>1659</a></p> -<p id='n1660' class='stm run hide_run'><a href='#n1660'>1660</a></p> -<p id='n1661' class='stm mis'><a href='#n1661'>1661</a></p> -<p id='n1662' class='pln'><a href='#n1662'>1662</a></p> -<p id='n1663' class='pln'><a href='#n1663'>1663</a></p> -<p id='n1664' class='pln'><a href='#n1664'>1664</a></p> -<p id='n1665' class='pln'><a href='#n1665'>1665</a></p> -<p id='n1666' class='pln'><a href='#n1666'>1666</a></p> -<p id='n1667' class='pln'><a href='#n1667'>1667</a></p> -<p id='n1668' class='pln'><a href='#n1668'>1668</a></p> -<p id='n1669' class='pln'><a href='#n1669'>1669</a></p> -<p id='n1670' class='pln'><a href='#n1670'>1670</a></p> -<p id='n1671' class='pln'><a href='#n1671'>1671</a></p> -<p id='n1672' class='pln'><a href='#n1672'>1672</a></p> -<p id='n1673' class='pln'><a href='#n1673'>1673</a></p> -<p id='n1674' class='stm mis'><a href='#n1674'>1674</a></p> -<p id='n1675' class='stm mis'><a href='#n1675'>1675</a></p> -<p id='n1676' class='stm mis'><a href='#n1676'>1676</a></p> -<p id='n1677' class='pln'><a href='#n1677'>1677</a></p> -<p id='n1678' class='stm run hide_run'><a href='#n1678'>1678</a></p> -<p id='n1679' class='pln'><a href='#n1679'>1679</a></p> -<p id='n1680' class='stm run hide_run'><a href='#n1680'>1680</a></p> -<p id='n1681' class='pln'><a href='#n1681'>1681</a></p> -<p id='n1682' class='pln'><a href='#n1682'>1682</a></p> -<p id='n1683' class='pln'><a href='#n1683'>1683</a></p> -<p id='n1684' class='pln'><a href='#n1684'>1684</a></p> -<p id='n1685' class='pln'><a href='#n1685'>1685</a></p> -<p id='n1686' class='pln'><a href='#n1686'>1686</a></p> -<p id='n1687' class='pln'><a href='#n1687'>1687</a></p> -<p id='n1688' class='pln'><a href='#n1688'>1688</a></p> -<p id='n1689' class='pln'><a href='#n1689'>1689</a></p> -<p id='n1690' class='pln'><a href='#n1690'>1690</a></p> -<p id='n1691' class='pln'><a href='#n1691'>1691</a></p> -<p id='n1692' class='pln'><a href='#n1692'>1692</a></p> -<p id='n1693' class='pln'><a href='#n1693'>1693</a></p> -<p id='n1694' class='pln'><a href='#n1694'>1694</a></p> -<p id='n1695' class='pln'><a href='#n1695'>1695</a></p> -<p id='n1696' class='pln'><a href='#n1696'>1696</a></p> -<p id='n1697' class='pln'><a href='#n1697'>1697</a></p> -<p id='n1698' class='pln'><a href='#n1698'>1698</a></p> -<p id='n1699' class='pln'><a href='#n1699'>1699</a></p> -<p id='n1700' class='pln'><a href='#n1700'>1700</a></p> -<p id='n1701' class='exc'><a href='#n1701'>1701</a></p> -<p id='n1702' class='pln'><a href='#n1702'>1702</a></p> -<p id='n1703' class='exc'><a href='#n1703'>1703</a></p> -<p id='n1704' class='exc'><a href='#n1704'>1704</a></p> -<p id='n1705' class='exc'><a href='#n1705'>1705</a></p> -<p id='n1706' class='pln'><a href='#n1706'>1706</a></p> -<p id='n1707' class='exc'><a href='#n1707'>1707</a></p> -<p id='n1708' class='exc'><a href='#n1708'>1708</a></p> -<p id='n1709' class='pln'><a href='#n1709'>1709</a></p> -<p id='n1710' class='stm run hide_run'><a href='#n1710'>1710</a></p> -<p id='n1711' class='stm mis'><a href='#n1711'>1711</a></p> -<p id='n1712' class='stm mis'><a href='#n1712'>1712</a></p> -<p id='n1713' class='stm mis'><a href='#n1713'>1713</a></p> -<p id='n1714' class='stm mis'><a href='#n1714'>1714</a></p> -<p id='n1715' class='stm mis'><a href='#n1715'>1715</a></p> -<p id='n1716' class='pln'><a href='#n1716'>1716</a></p> -<p id='n1717' class='stm run hide_run'><a href='#n1717'>1717</a></p> -<p id='n1718' class='stm mis'><a href='#n1718'>1718</a></p> -<p id='n1719' class='stm mis'><a href='#n1719'>1719</a></p> -<p id='n1720' class='pln'><a href='#n1720'>1720</a></p> -<p id='n1721' class='stm run hide_run'><a href='#n1721'>1721</a></p> -<p id='n1722' class='stm mis'><a href='#n1722'>1722</a></p> -<p id='n1723' class='pln'><a href='#n1723'>1723</a></p> -<p id='n1724' class='pln'><a href='#n1724'>1724</a></p> -<p id='n1725' class='stm mis'><a href='#n1725'>1725</a></p> -<p id='n1726' class='pln'><a href='#n1726'>1726</a></p> -<p id='n1727' class='stm run hide_run'><a href='#n1727'>1727</a></p> -<p id='n1728' class='stm mis'><a href='#n1728'>1728</a></p> -<p id='n1729' class='stm mis'><a href='#n1729'>1729</a></p> -<p id='n1730' class='stm mis'><a href='#n1730'>1730</a></p> -<p id='n1731' class='pln'><a href='#n1731'>1731</a></p> -<p id='n1732' class='stm run hide_run'><a href='#n1732'>1732</a></p> -<p id='n1733' class='stm mis'><a href='#n1733'>1733</a></p> -<p id='n1734' class='stm mis'><a href='#n1734'>1734</a></p> -<p id='n1735' class='stm mis'><a href='#n1735'>1735</a></p> -<p id='n1736' class='pln'><a href='#n1736'>1736</a></p> -<p id='n1737' class='stm run hide_run'><a href='#n1737'>1737</a></p> -<p id='n1738' class='stm mis'><a href='#n1738'>1738</a></p> -<p id='n1739' class='pln'><a href='#n1739'>1739</a></p> -<p id='n1740' class='pln'><a href='#n1740'>1740</a></p> -<p id='n1741' class='stm mis'><a href='#n1741'>1741</a></p> -<p id='n1742' class='pln'><a href='#n1742'>1742</a></p> -<p id='n1743' class='stm run hide_run'><a href='#n1743'>1743</a></p> -<p id='n1744' class='pln'><a href='#n1744'>1744</a></p> -<p id='n1745' class='stm run hide_run'><a href='#n1745'>1745</a></p> -<p id='n1746' class='stm mis'><a href='#n1746'>1746</a></p> -<p id='n1747' class='pln'><a href='#n1747'>1747</a></p> -<p id='n1748' class='pln'><a href='#n1748'>1748</a></p> -<p id='n1749' class='pln'><a href='#n1749'>1749</a></p> -<p id='n1750' class='pln'><a href='#n1750'>1750</a></p> -<p id='n1751' class='pln'><a href='#n1751'>1751</a></p> -<p id='n1752' class='pln'><a href='#n1752'>1752</a></p> -<p id='n1753' class='pln'><a href='#n1753'>1753</a></p> -<p id='n1754' class='pln'><a href='#n1754'>1754</a></p> -<p id='n1755' class='pln'><a href='#n1755'>1755</a></p> -<p id='n1756' class='pln'><a href='#n1756'>1756</a></p> -<p id='n1757' class='pln'><a href='#n1757'>1757</a></p> -<p id='n1758' class='pln'><a href='#n1758'>1758</a></p> -<p id='n1759' class='pln'><a href='#n1759'>1759</a></p> -<p id='n1760' class='pln'><a href='#n1760'>1760</a></p> -<p id='n1761' class='pln'><a href='#n1761'>1761</a></p> -<p id='n1762' class='pln'><a href='#n1762'>1762</a></p> -<p id='n1763' class='pln'><a href='#n1763'>1763</a></p> -<p id='n1764' class='pln'><a href='#n1764'>1764</a></p> -<p id='n1765' class='pln'><a href='#n1765'>1765</a></p> -<p id='n1766' class='stm mis'><a href='#n1766'>1766</a></p> -<p id='n1767' class='stm mis'><a href='#n1767'>1767</a></p> -<p id='n1768' class='stm mis'><a href='#n1768'>1768</a></p> -<p id='n1769' class='pln'><a href='#n1769'>1769</a></p> -<p id='n1770' class='stm run hide_run'><a href='#n1770'>1770</a></p> -<p id='n1771' class='stm mis'><a href='#n1771'>1771</a></p> -<p id='n1772' class='pln'><a href='#n1772'>1772</a></p> -<p id='n1773' class='pln'><a href='#n1773'>1773</a></p> -<p id='n1774' class='pln'><a href='#n1774'>1774</a></p> -<p id='n1775' class='pln'><a href='#n1775'>1775</a></p> -<p id='n1776' class='pln'><a href='#n1776'>1776</a></p> -<p id='n1777' class='pln'><a href='#n1777'>1777</a></p> -<p id='n1778' class='pln'><a href='#n1778'>1778</a></p> -<p id='n1779' class='pln'><a href='#n1779'>1779</a></p> -<p id='n1780' class='pln'><a href='#n1780'>1780</a></p> -<p id='n1781' class='pln'><a href='#n1781'>1781</a></p> -<p id='n1782' class='pln'><a href='#n1782'>1782</a></p> -<p id='n1783' class='pln'><a href='#n1783'>1783</a></p> -<p id='n1784' class='pln'><a href='#n1784'>1784</a></p> -<p id='n1785' class='pln'><a href='#n1785'>1785</a></p> -<p id='n1786' class='pln'><a href='#n1786'>1786</a></p> -<p id='n1787' class='pln'><a href='#n1787'>1787</a></p> -<p id='n1788' class='pln'><a href='#n1788'>1788</a></p> -<p id='n1789' class='pln'><a href='#n1789'>1789</a></p> -<p id='n1790' class='pln'><a href='#n1790'>1790</a></p> -<p id='n1791' class='pln'><a href='#n1791'>1791</a></p> -<p id='n1792' class='pln'><a href='#n1792'>1792</a></p> -<p id='n1793' class='pln'><a href='#n1793'>1793</a></p> -<p id='n1794' class='pln'><a href='#n1794'>1794</a></p> -<p id='n1795' class='stm mis'><a href='#n1795'>1795</a></p> -<p id='n1796' class='stm mis'><a href='#n1796'>1796</a></p> -<p id='n1797' class='stm mis'><a href='#n1797'>1797</a></p> -<p id='n1798' class='pln'><a href='#n1798'>1798</a></p> -<p id='n1799' class='stm run hide_run'><a href='#n1799'>1799</a></p> -<p id='n1800' class='stm mis'><a href='#n1800'>1800</a></p> -<p id='n1801' class='pln'><a href='#n1801'>1801</a></p> -<p id='n1802' class='pln'><a href='#n1802'>1802</a></p> -<p id='n1803' class='pln'><a href='#n1803'>1803</a></p> -<p id='n1804' class='pln'><a href='#n1804'>1804</a></p> -<p id='n1805' class='pln'><a href='#n1805'>1805</a></p> -<p id='n1806' class='pln'><a href='#n1806'>1806</a></p> -<p id='n1807' class='pln'><a href='#n1807'>1807</a></p> -<p id='n1808' class='pln'><a href='#n1808'>1808</a></p> -<p id='n1809' class='pln'><a href='#n1809'>1809</a></p> -<p id='n1810' class='pln'><a href='#n1810'>1810</a></p> -<p id='n1811' class='pln'><a href='#n1811'>1811</a></p> -<p id='n1812' class='pln'><a href='#n1812'>1812</a></p> -<p id='n1813' class='pln'><a href='#n1813'>1813</a></p> -<p id='n1814' class='pln'><a href='#n1814'>1814</a></p> -<p id='n1815' class='pln'><a href='#n1815'>1815</a></p> -<p id='n1816' class='pln'><a href='#n1816'>1816</a></p> -<p id='n1817' class='pln'><a href='#n1817'>1817</a></p> -<p id='n1818' class='pln'><a href='#n1818'>1818</a></p> -<p id='n1819' class='pln'><a href='#n1819'>1819</a></p> -<p id='n1820' class='pln'><a href='#n1820'>1820</a></p> -<p id='n1821' class='pln'><a href='#n1821'>1821</a></p> -<p id='n1822' class='pln'><a href='#n1822'>1822</a></p> -<p id='n1823' class='pln'><a href='#n1823'>1823</a></p> -<p id='n1824' class='stm mis'><a href='#n1824'>1824</a></p> -<p id='n1825' class='stm mis'><a href='#n1825'>1825</a></p> -<p id='n1826' class='stm mis'><a href='#n1826'>1826</a></p> -<p id='n1827' class='pln'><a href='#n1827'>1827</a></p> -<p id='n1828' class='stm run hide_run'><a href='#n1828'>1828</a></p> -<p id='n1829' class='stm mis'><a href='#n1829'>1829</a></p> -<p id='n1830' class='pln'><a href='#n1830'>1830</a></p> -<p id='n1831' class='pln'><a href='#n1831'>1831</a></p> -<p id='n1832' class='pln'><a href='#n1832'>1832</a></p> -<p id='n1833' class='pln'><a href='#n1833'>1833</a></p> -<p id='n1834' class='pln'><a href='#n1834'>1834</a></p> -<p id='n1835' class='pln'><a href='#n1835'>1835</a></p> -<p id='n1836' class='pln'><a href='#n1836'>1836</a></p> -<p id='n1837' class='pln'><a href='#n1837'>1837</a></p> -<p id='n1838' class='pln'><a href='#n1838'>1838</a></p> -<p id='n1839' class='pln'><a href='#n1839'>1839</a></p> -<p id='n1840' class='pln'><a href='#n1840'>1840</a></p> -<p id='n1841' class='pln'><a href='#n1841'>1841</a></p> -<p id='n1842' class='pln'><a href='#n1842'>1842</a></p> -<p id='n1843' class='pln'><a href='#n1843'>1843</a></p> -<p id='n1844' class='pln'><a href='#n1844'>1844</a></p> -<p id='n1845' class='pln'><a href='#n1845'>1845</a></p> -<p id='n1846' class='pln'><a href='#n1846'>1846</a></p> -<p id='n1847' class='pln'><a href='#n1847'>1847</a></p> -<p id='n1848' class='pln'><a href='#n1848'>1848</a></p> -<p id='n1849' class='pln'><a href='#n1849'>1849</a></p> -<p id='n1850' class='pln'><a href='#n1850'>1850</a></p> -<p id='n1851' class='pln'><a href='#n1851'>1851</a></p> -<p id='n1852' class='pln'><a href='#n1852'>1852</a></p> -<p id='n1853' class='pln'><a href='#n1853'>1853</a></p> -<p id='n1854' class='pln'><a href='#n1854'>1854</a></p> -<p id='n1855' class='pln'><a href='#n1855'>1855</a></p> -<p id='n1856' class='pln'><a href='#n1856'>1856</a></p> -<p id='n1857' class='pln'><a href='#n1857'>1857</a></p> -<p id='n1858' class='pln'><a href='#n1858'>1858</a></p> -<p id='n1859' class='pln'><a href='#n1859'>1859</a></p> -<p id='n1860' class='pln'><a href='#n1860'>1860</a></p> -<p id='n1861' class='pln'><a href='#n1861'>1861</a></p> -<p id='n1862' class='pln'><a href='#n1862'>1862</a></p> -<p id='n1863' class='pln'><a href='#n1863'>1863</a></p> -<p id='n1864' class='pln'><a href='#n1864'>1864</a></p> -<p id='n1865' class='pln'><a href='#n1865'>1865</a></p> -<p id='n1866' class='pln'><a href='#n1866'>1866</a></p> -<p id='n1867' class='pln'><a href='#n1867'>1867</a></p> -<p id='n1868' class='pln'><a href='#n1868'>1868</a></p> -<p id='n1869' class='pln'><a href='#n1869'>1869</a></p> -<p id='n1870' class='pln'><a href='#n1870'>1870</a></p> -<p id='n1871' class='pln'><a href='#n1871'>1871</a></p> -<p id='n1872' class='pln'><a href='#n1872'>1872</a></p> -<p id='n1873' class='pln'><a href='#n1873'>1873</a></p> -<p id='n1874' class='pln'><a href='#n1874'>1874</a></p> -<p id='n1875' class='pln'><a href='#n1875'>1875</a></p> -<p id='n1876' class='pln'><a href='#n1876'>1876</a></p> -<p id='n1877' class='pln'><a href='#n1877'>1877</a></p> -<p id='n1878' class='pln'><a href='#n1878'>1878</a></p> -<p id='n1879' class='pln'><a href='#n1879'>1879</a></p> -<p id='n1880' class='pln'><a href='#n1880'>1880</a></p> -<p id='n1881' class='pln'><a href='#n1881'>1881</a></p> -<p id='n1882' class='pln'><a href='#n1882'>1882</a></p> -<p id='n1883' class='pln'><a href='#n1883'>1883</a></p> -<p id='n1884' class='pln'><a href='#n1884'>1884</a></p> -<p id='n1885' class='pln'><a href='#n1885'>1885</a></p> -<p id='n1886' class='pln'><a href='#n1886'>1886</a></p> -<p id='n1887' class='pln'><a href='#n1887'>1887</a></p> -<p id='n1888' class='pln'><a href='#n1888'>1888</a></p> -<p id='n1889' class='pln'><a href='#n1889'>1889</a></p> -<p id='n1890' class='pln'><a href='#n1890'>1890</a></p> -<p id='n1891' class='pln'><a href='#n1891'>1891</a></p> -<p id='n1892' class='pln'><a href='#n1892'>1892</a></p> -<p id='n1893' class='pln'><a href='#n1893'>1893</a></p> -<p id='n1894' class='pln'><a href='#n1894'>1894</a></p> -<p id='n1895' class='pln'><a href='#n1895'>1895</a></p> -<p id='n1896' class='pln'><a href='#n1896'>1896</a></p> -<p id='n1897' class='pln'><a href='#n1897'>1897</a></p> -<p id='n1898' class='pln'><a href='#n1898'>1898</a></p> -<p id='n1899' class='pln'><a href='#n1899'>1899</a></p> -<p id='n1900' class='pln'><a href='#n1900'>1900</a></p> -<p id='n1901' class='pln'><a href='#n1901'>1901</a></p> -<p id='n1902' class='stm mis'><a href='#n1902'>1902</a></p> -<p id='n1903' class='stm mis'><a href='#n1903'>1903</a></p> -<p id='n1904' class='pln'><a href='#n1904'>1904</a></p> -<p id='n1905' class='pln'><a href='#n1905'>1905</a></p> -<p id='n1906' class='stm mis'><a href='#n1906'>1906</a></p> -<p id='n1907' class='pln'><a href='#n1907'>1907</a></p> -<p id='n1908' class='pln'><a href='#n1908'>1908</a></p> -<p id='n1909' class='stm mis'><a href='#n1909'>1909</a></p> -<p id='n1910' class='pln'><a href='#n1910'>1910</a></p> -<p id='n1911' class='pln'><a href='#n1911'>1911</a></p> -<p id='n1912' class='stm mis'><a href='#n1912'>1912</a></p> -<p id='n1913' class='pln'><a href='#n1913'>1913</a></p> -<p id='n1914' class='pln'><a href='#n1914'>1914</a></p> -<p id='n1915' class='stm mis'><a href='#n1915'>1915</a></p> -<p id='n1916' class='pln'><a href='#n1916'>1916</a></p> -<p id='n1917' class='pln'><a href='#n1917'>1917</a></p> -<p id='n1918' class='stm mis'><a href='#n1918'>1918</a></p> -<p id='n1919' class='pln'><a href='#n1919'>1919</a></p> -<p id='n1920' class='pln'><a href='#n1920'>1920</a></p> -<p id='n1921' class='pln'><a href='#n1921'>1921</a></p> -<p id='n1922' class='stm run hide_run'><a href='#n1922'>1922</a></p> -<p id='n1923' class='stm mis'><a href='#n1923'>1923</a></p> -<p id='n1924' class='stm mis'><a href='#n1924'>1924</a></p> -<p id='n1925' class='stm mis'><a href='#n1925'>1925</a></p> -<p id='n1926' class='stm mis'><a href='#n1926'>1926</a></p> -<p id='n1927' class='pln'><a href='#n1927'>1927</a></p> -<p id='n1928' class='stm run hide_run'><a href='#n1928'>1928</a></p> -<p id='n1929' class='pln'><a href='#n1929'>1929</a></p> -<p id='n1930' class='pln'><a href='#n1930'>1930</a></p> -<p id='n1931' class='stm run hide_run'><a href='#n1931'>1931</a></p> -<p id='n1932' class='pln'><a href='#n1932'>1932</a></p> -<p id='n1933' class='stm mis'><a href='#n1933'>1933</a></p> -<p id='n1934' class='pln'><a href='#n1934'>1934</a></p> -<p id='n1935' class='pln'><a href='#n1935'>1935</a></p> -<p id='n1936' class='pln'><a href='#n1936'>1936</a></p> -<p id='n1937' class='pln'><a href='#n1937'>1937</a></p> -<p id='n1938' class='pln'><a href='#n1938'>1938</a></p> -<p id='n1939' class='pln'><a href='#n1939'>1939</a></p> -<p id='n1940' class='pln'><a href='#n1940'>1940</a></p> -<p id='n1941' class='pln'><a href='#n1941'>1941</a></p> -<p id='n1942' class='pln'><a href='#n1942'>1942</a></p> -<p id='n1943' class='pln'><a href='#n1943'>1943</a></p> -<p id='n1944' class='pln'><a href='#n1944'>1944</a></p> -<p id='n1945' class='pln'><a href='#n1945'>1945</a></p> -<p id='n1946' class='pln'><a href='#n1946'>1946</a></p> -<p id='n1947' class='pln'><a href='#n1947'>1947</a></p> -<p id='n1948' class='pln'><a href='#n1948'>1948</a></p> -<p id='n1949' class='pln'><a href='#n1949'>1949</a></p> -<p id='n1950' class='pln'><a href='#n1950'>1950</a></p> -<p id='n1951' class='pln'><a href='#n1951'>1951</a></p> -<p id='n1952' class='pln'><a href='#n1952'>1952</a></p> -<p id='n1953' class='pln'><a href='#n1953'>1953</a></p> -<p id='n1954' class='pln'><a href='#n1954'>1954</a></p> -<p id='n1955' class='stm mis'><a href='#n1955'>1955</a></p> -<p id='n1956' class='stm mis'><a href='#n1956'>1956</a></p> -<p id='n1957' class='stm mis'><a href='#n1957'>1957</a></p> -<p id='n1958' class='pln'><a href='#n1958'>1958</a></p> -<p id='n1959' class='stm run hide_run'><a href='#n1959'>1959</a></p> -<p id='n1960' class='stm mis'><a href='#n1960'>1960</a></p> -<p id='n1961' class='pln'><a href='#n1961'>1961</a></p> -<p id='n1962' class='pln'><a href='#n1962'>1962</a></p> -<p id='n1963' class='pln'><a href='#n1963'>1963</a></p> -<p id='n1964' class='pln'><a href='#n1964'>1964</a></p> -<p id='n1965' class='pln'><a href='#n1965'>1965</a></p> -<p id='n1966' class='stm mis'><a href='#n1966'>1966</a></p> -<p id='n1967' class='stm mis'><a href='#n1967'>1967</a></p> -<p id='n1968' class='pln'><a href='#n1968'>1968</a></p> -<p id='n1969' class='stm run hide_run'><a href='#n1969'>1969</a></p> -<p id='n1970' class='pln'><a href='#n1970'>1970</a></p> -<p id='n1971' class='pln'><a href='#n1971'>1971</a></p> -<p id='n1972' class='stm mis'><a href='#n1972'>1972</a></p> -<p id='n1973' class='pln'><a href='#n1973'>1973</a></p> -<p id='n1974' class='pln'><a href='#n1974'>1974</a></p> -<p id='n1975' class='pln'><a href='#n1975'>1975</a></p> -<p id='n1976' class='pln'><a href='#n1976'>1976</a></p> -<p id='n1977' class='pln'><a href='#n1977'>1977</a></p> -<p id='n1978' class='pln'><a href='#n1978'>1978</a></p> -<p id='n1979' class='pln'><a href='#n1979'>1979</a></p> -<p id='n1980' class='pln'><a href='#n1980'>1980</a></p> -<p id='n1981' class='pln'><a href='#n1981'>1981</a></p> -<p id='n1982' class='pln'><a href='#n1982'>1982</a></p> -<p id='n1983' class='pln'><a href='#n1983'>1983</a></p> -<p id='n1984' class='pln'><a href='#n1984'>1984</a></p> -<p id='n1985' class='pln'><a href='#n1985'>1985</a></p> -<p id='n1986' class='pln'><a href='#n1986'>1986</a></p> -<p id='n1987' class='pln'><a href='#n1987'>1987</a></p> -<p id='n1988' class='pln'><a href='#n1988'>1988</a></p> -<p id='n1989' class='pln'><a href='#n1989'>1989</a></p> -<p id='n1990' class='stm mis'><a href='#n1990'>1990</a></p> -<p id='n1991' class='stm mis'><a href='#n1991'>1991</a></p> -<p id='n1992' class='stm mis'><a href='#n1992'>1992</a></p> -<p id='n1993' class='stm mis'><a href='#n1993'>1993</a></p> -<p id='n1994' class='stm mis'><a href='#n1994'>1994</a></p> -<p id='n1995' class='stm mis'><a href='#n1995'>1995</a></p> -<p id='n1996' class='pln'><a href='#n1996'>1996</a></p> -<p id='n1997' class='stm run hide_run'><a href='#n1997'>1997</a></p> -<p id='n1998' class='pln'><a href='#n1998'>1998</a></p> -<p id='n1999' class='stm run hide_run'><a href='#n1999'>1999</a></p> -<p id='n2000' class='pln'><a href='#n2000'>2000</a></p> -<p id='n2001' class='stm mis'><a href='#n2001'>2001</a></p> -<p id='n2002' class='pln'><a href='#n2002'>2002</a></p> -<p id='n2003' class='pln'><a href='#n2003'>2003</a></p> -<p id='n2004' class='pln'><a href='#n2004'>2004</a></p> -<p id='n2005' class='pln'><a href='#n2005'>2005</a></p> -<p id='n2006' class='pln'><a href='#n2006'>2006</a></p> -<p id='n2007' class='pln'><a href='#n2007'>2007</a></p> -<p id='n2008' class='pln'><a href='#n2008'>2008</a></p> -<p id='n2009' class='pln'><a href='#n2009'>2009</a></p> -<p id='n2010' class='stm mis'><a href='#n2010'>2010</a></p> -<p id='n2011' class='stm mis'><a href='#n2011'>2011</a></p> -<p id='n2012' class='stm mis'><a href='#n2012'>2012</a></p> -<p id='n2013' class='stm mis'><a href='#n2013'>2013</a></p> -<p id='n2014' class='pln'><a href='#n2014'>2014</a></p> -<p id='n2015' class='stm run hide_run'><a href='#n2015'>2015</a></p> -<p id='n2016' class='pln'><a href='#n2016'>2016</a></p> -<p id='n2017' class='stm mis'><a href='#n2017'>2017</a></p> -<p id='n2018' class='pln'><a href='#n2018'>2018</a></p> -<p id='n2019' class='pln'><a href='#n2019'>2019</a></p> -<p id='n2020' class='pln'><a href='#n2020'>2020</a></p> -<p id='n2021' class='pln'><a href='#n2021'>2021</a></p> -<p id='n2022' class='pln'><a href='#n2022'>2022</a></p> -<p id='n2023' class='pln'><a href='#n2023'>2023</a></p> -<p id='n2024' class='pln'><a href='#n2024'>2024</a></p> -<p id='n2025' class='pln'><a href='#n2025'>2025</a></p> -<p id='n2026' class='stm mis'><a href='#n2026'>2026</a></p> -<p id='n2027' class='stm mis'><a href='#n2027'>2027</a></p> -<p id='n2028' class='stm mis'><a href='#n2028'>2028</a></p> -<p id='n2029' class='stm mis'><a href='#n2029'>2029</a></p> -<p id='n2030' class='stm mis'><a href='#n2030'>2030</a></p> -<p id='n2031' class='stm mis'><a href='#n2031'>2031</a></p> -<p id='n2032' class='pln'><a href='#n2032'>2032</a></p> -<p id='n2033' class='pln'><a href='#n2033'>2033</a></p> -<p id='n2034' class='exc'><a href='#n2034'>2034</a></p> -<p id='n2035' class='exc'><a href='#n2035'>2035</a></p> -<p id='n2036' class='pln'><a href='#n2036'>2036</a></p> -<p id='n2037' class='pln'><a href='#n2037'>2037</a></p> -<p id='n2038' class='pln'><a href='#n2038'>2038</a></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-2012, 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'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>absolute_import</span><span class='strut'> </span></p> -<p id='t8' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>unittest</span><span class='strut'> </span></p> -<p id='t9' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>os</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'>random</span><span class='op'>,</span> <span class='nam'>re</span><span class='op'>,</span> <span class='nam'>shutil</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='t10' class='stm run hide_run'><span class='key'>from</span> <span class='op'>.</span><span class='nam'>backward</span> <span class='key'>import</span> <span class='nam'>StringIO</span><span class='op'>,</span> <span class='nam'>to_bytes</span><span class='op'>,</span> <span class='nam'>b</span><span class='op'>,</span> <span class='nam'>u</span><span class='strut'> </span></p> -<p id='t11' class='stm run hide_run'><span class='key'>from</span> <span class='op'>.</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='t12' class='stm run hide_run'><span class='key'>from</span> <span class='op'>.</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='t13' class='stm run hide_run'><span class='key'>from</span> <span class='op'>.</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='t14' class='stm run hide_run'><span class='key'>from</span> <span class='op'>.</span><span class='nam'>whiteutils</span> <span class='key'>import</span> <span class='nam'>reindentBlock</span><span class='strut'> </span></p> -<p id='t15' class='stm run hide_run'><span class='key'>from</span> <span class='op'>.</span><span class='nam'>makefiles</span> <span class='key'>import</span> <span class='op'>*</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='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='t18' 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='t19' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t20' 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='t21' class='pln'> <span class='str'>""" Just like unittest.TestCase.assertRaises,</span><span class='strut'> </span></p> -<p id='t22' class='pln'><span class='str'> but checks that the message is right too.</span><span class='strut'> </span></p> -<p id='t23' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t24' class='stm run hide_run'> <span class='key'>try</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t25' 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='t26' class='stm run hide_run'> <span class='key'>except</span> <span class='nam'>excClass</span> <span class='key'>as</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='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='t28' 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='t29' class='pln'> <span class='com'># No message provided: it passes.</span><span class='strut'> </span></p> -<p id='t30' class='exc'> <span class='key'>return</span> <span class='com'>#pragma: no cover</span><span class='strut'> </span></p> -<p id='t31' 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='t32' class='pln'> <span class='com'># Message provided, and we got the right message: it passes.</span><span class='strut'> </span></p> -<p id='t33' class='stm run hide_run'> <span class='key'>return</span><span class='strut'> </span></p> -<p id='t34' 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='t35' class='pln'> <span class='com'># Message provided, and it didn't match: fail!</span><span class='strut'> </span></p> -<p id='t36' 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='t37' 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='t38' 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='t39' 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='t40' class='exc'> <span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t41' 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='t42' 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='t43' class='pln'><span class='strut'> </span></p> -<p id='t44' 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='t45' class='pln'> <span class='str'>""" Test cases for cogapp.Cog()</span><span class='strut'> </span></p> -<p id='t46' class='pln'><span class='str'> """</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'>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='t49' 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='t50' class='pln'> <span class='str'>''</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t51' class='pln'> <span class='str'>' '</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t52' class='pln'> <span class='str'>' \t \t \tx'</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t53' class='pln'> <span class='str'>'hello'</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t54' class='pln'> <span class='str'>'the cat\nin the\nhat.'</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t55' class='pln'> <span class='str'>'Horton\n\tHears A\n\t\tWho'</span><span class='strut'> </span></p> -<p id='t56' class='pln'> <span class='op'>]</span><span class='strut'> </span></p> -<p id='t57' 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='t58' 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='t59' class='pln'><span class='strut'> </span></p> -<p id='t60' 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='t61' 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='t62' class='pln'><span class='str'> Some text.</span><span class='strut'> </span></p> -<p id='t63' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t64' class='pln'><span class='str'> import cog</span><span class='strut'> </span></p> -<p id='t65' class='pln'><span class='str'> cog.outl("This is line one\\n")</span><span class='strut'> </span></p> -<p id='t66' class='pln'><span class='str'> cog.outl("This is line two")</span><span class='strut'> </span></p> -<p id='t67' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t68' class='pln'><span class='str'> gobbledegook.</span><span class='strut'> </span></p> -<p id='t69' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t70' class='pln'><span class='str'> epilogue.</span><span class='strut'> </span></p> -<p id='t71' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t72' class='pln'><span class='strut'> </span></p> -<p id='t73' 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='t74' class='pln'><span class='str'> Some text.</span><span class='strut'> </span></p> -<p id='t75' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t76' class='pln'><span class='str'> import cog</span><span class='strut'> </span></p> -<p id='t77' class='pln'><span class='str'> cog.outl("This is line one\\n")</span><span class='strut'> </span></p> -<p id='t78' class='pln'><span class='str'> cog.outl("This is line two")</span><span class='strut'> </span></p> -<p id='t79' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t80' class='pln'><span class='str'> This is line one</span><span class='strut'> </span></p> -<p id='t81' class='pln'><span class='strut'> </span></p> -<p id='t82' class='pln'><span class='str'> This is line two</span><span class='strut'> </span></p> -<p id='t83' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t84' class='pln'><span class='str'> epilogue.</span><span class='strut'> </span></p> -<p id='t85' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t86' class='pln'><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'>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='t88' class='pln'><span class='strut'> </span></p> -<p id='t89' 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='t90' 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='t91' class='pln'> <span class='com'># but it works.</span><span class='strut'> </span></p> -<p id='t92' 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='t93' class='pln'><span class='str'> hello</span><span class='strut'> </span></p> -<p id='t94' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t95' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t96' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t97' class='pln'><span class='str'> goodbye</span><span class='strut'> </span></p> -<p id='t98' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t99' class='pln'><span class='strut'> </span></p> -<p id='t100' 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='t101' 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='t102' class='pln'><span class='strut'> </span></p> -<p id='t103' 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='t104' class='pln'> <span class='com'># One file can have many cog chunks, even abutting each other.</span><span class='strut'> </span></p> -<p id='t105' 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='t106' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t107' class='pln'><span class='str'> cog.out("chunk1")</span><span class='strut'> </span></p> -<p id='t108' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t109' class='pln'><span class='str'> chunk1</span><span class='strut'> </span></p> -<p id='t110' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t111' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t112' class='pln'><span class='str'> cog.out("chunk2")</span><span class='strut'> </span></p> -<p id='t113' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t114' class='pln'><span class='str'> chunk2</span><span class='strut'> </span></p> -<p id='t115' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t116' class='pln'><span class='str'> between chunks</span><span class='strut'> </span></p> -<p id='t117' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t118' class='pln'><span class='str'> cog.out("chunk3")</span><span class='strut'> </span></p> -<p id='t119' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t120' class='pln'><span class='str'> chunk3</span><span class='strut'> </span></p> -<p id='t121' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t122' class='pln'><span class='str'> """</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='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='t125' 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='t126' class='pln'><span class='strut'> </span></p> -<p id='t127' 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='t128' 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='t129' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t130' class='pln'><span class='str'> cog.out("This is line one\\n", trimblanklines=True)</span><span class='strut'> </span></p> -<p id='t131' class='pln'><span class='str'> cog.out('''</span><span class='strut'> </span></p> -<p id='t132' class='pln'><span class='str'> This is line two</span><span class='strut'> </span></p> -<p id='t133' class='pln'><span class='str'> ''', dedent=True, trimblanklines=True)</span><span class='strut'> </span></p> -<p id='t134' class='pln'><span class='str'> cog.outl("This is line three", trimblanklines=True)</span><span class='strut'> </span></p> -<p id='t135' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t136' class='pln'><span class='str'> This is line one</span><span class='strut'> </span></p> -<p id='t137' class='pln'><span class='str'> This is line two</span><span class='strut'> </span></p> -<p id='t138' class='pln'><span class='str'> This is line three</span><span class='strut'> </span></p> -<p id='t139' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t140' class='pln'><span class='str'> """</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'>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='t143' 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='t144' class='pln'><span class='strut'> </span></p> -<p id='t145' 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='t146' 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='t147' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t148' class='pln'><span class='str'> cog.out("This is line one\\n", trimblanklines=True)</span><span class='strut'> </span></p> -<p id='t149' class='pln'><span class='str'> cog.out('''</span><span class='strut'> </span></p> -<p id='t150' class='pln'><span class='str'> This is line two</span><span class='strut'> </span></p> -<p id='t151' class='pln'><span class='str'> ''', dedent=True, trimblanklines=True)</span><span class='strut'> </span></p> -<p id='t152' class='pln'><span class='str'> cog.out('', dedent=True, trimblanklines=True)</span><span class='strut'> </span></p> -<p id='t153' class='pln'><span class='str'> cog.outl("This is line three", trimblanklines=True)</span><span class='strut'> </span></p> -<p id='t154' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t155' class='pln'><span class='str'> This is line one</span><span class='strut'> </span></p> -<p id='t156' class='pln'><span class='str'> This is line two</span><span class='strut'> </span></p> -<p id='t157' class='pln'><span class='str'> This is line three</span><span class='strut'> </span></p> -<p id='t158' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t159' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t160' class='pln'><span class='strut'> </span></p> -<p id='t161' 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='t162' 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='t163' class='pln'><span class='strut'> </span></p> -<p id='t164' 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='t165' 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='t166' class='pln'> <span class='com'># last line is indented but didn't end with a newline.</span><span class='strut'> </span></p> -<p id='t167' 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='t168' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t169' class='pln'><span class='str'> import cog</span><span class='strut'> </span></p> -<p id='t170' class='pln'><span class='str'> for i in range(3):</span><span class='strut'> </span></p> -<p id='t171' class='pln'><span class='str'> cog.out("%d\\n" % i)</span><span class='strut'> </span></p> -<p id='t172' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t173' class='pln'><span class='str'> 0</span><span class='strut'> </span></p> -<p id='t174' class='pln'><span class='str'> 1</span><span class='strut'> </span></p> -<p id='t175' class='pln'><span class='str'> 2</span><span class='strut'> </span></p> -<p id='t176' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t177' class='pln'><span class='str'> """</span><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='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='t180' 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='t181' class='pln'><span class='strut'> </span></p> -<p id='t182' 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='t183' 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='t184' class='pln'><span class='str'> first line</span><span class='strut'> </span></p> -<p id='t185' class='pln'><span class='str'> [[[cog</span><span class='strut'> </span></p> -<p id='t186' class='pln'><span class='str'> import cog</span><span class='strut'> </span></p> -<p id='t187' class='pln'><span class='str'> for i in range(3):</span><span class='strut'> </span></p> -<p id='t188' class='pln'><span class='str'> cog.out("xx%d\\n" % i)</span><span class='strut'> </span></p> -<p id='t189' class='pln'><span class='str'> ]]]</span><span class='strut'> </span></p> -<p id='t190' class='pln'><span class='str'> xx0</span><span class='strut'> </span></p> -<p id='t191' class='pln'><span class='str'> xx1</span><span class='strut'> </span></p> -<p id='t192' class='pln'><span class='str'> xx2</span><span class='strut'> </span></p> -<p id='t193' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p> -<p id='t194' class='pln'><span class='str'> last line</span><span class='strut'> </span></p> -<p id='t195' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t196' class='pln'><span class='strut'> </span></p> -<p id='t197' 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='t198' 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='t199' class='pln'><span class='strut'> </span></p> -<p id='t200' 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='t201' 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='t202' class='pln'><span class='str'> --[[[cog</span><span class='strut'> </span></p> -<p id='t203' class='pln'><span class='str'> --import cog</span><span class='strut'> </span></p> -<p id='t204' class='pln'><span class='str'> --for i in range(3):</span><span class='strut'> </span></p> -<p id='t205' class='pln'><span class='str'> -- cog.out("xx%d\\n" % i)</span><span class='strut'> </span></p> -<p id='t206' class='pln'><span class='str'> --]]]</span><span class='strut'> </span></p> -<p id='t207' class='pln'><span class='str'> xx0</span><span class='strut'> </span></p> -<p id='t208' class='pln'><span class='str'> xx1</span><span class='strut'> </span></p> -<p id='t209' class='pln'><span class='str'> xx2</span><span class='strut'> </span></p> -<p id='t210' class='pln'><span class='str'> --[[[end]]]</span><span class='strut'> </span></p> -<p id='t211' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t212' class='pln'><span class='strut'> </span></p> -<p id='t213' 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='t214' 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='t215' class='pln'><span class='strut'> </span></p> -<p id='t216' 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='t217' 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='t218' class='pln'><span class='str'> prologue</span><span class='strut'> </span></p> -<p id='t219' class='pln'><span class='str'> --[[[cog</span><span class='strut'> </span></p> -<p id='t220' class='pln'><span class='str'> -- import cog</span><span class='strut'> </span></p> -<p id='t221' class='pln'><span class='str'> -- for i in range(3):</span><span class='strut'> </span></p> -<p id='t222' class='pln'><span class='str'> -- cog.out("xy%d\\n" % i)</span><span class='strut'> </span></p> -<p id='t223' class='pln'><span class='str'> --]]]</span><span class='strut'> </span></p> -<p id='t224' class='pln'><span class='str'> xy0</span><span class='strut'> </span></p> -<p id='t225' class='pln'><span class='str'> xy1</span><span class='strut'> </span></p> -<p id='t226' class='pln'><span class='str'> xy2</span><span class='strut'> </span></p> -<p id='t227' class='pln'><span class='str'> --[[[end]]]</span><span class='strut'> </span></p> -<p id='t228' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t229' class='pln'><span class='strut'> </span></p> -<p id='t230' 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='t231' 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='t232' class='pln'><span class='strut'> </span></p> -<p id='t233' 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='t234' 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='t235' class='pln'><span class='str'> prologue</span><span class='strut'> </span></p> -<p id='t236' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p> -<p id='t237' class='pln'><span class='str'> import cog</span><span class='strut'> </span></p> -<p id='t238' class='pln'><span class='str'> # This comment should not be clobbered by removing the pound sign.</span><span class='strut'> </span></p> -<p id='t239' class='pln'><span class='str'> for i in range(3):</span><span class='strut'> </span></p> -<p id='t240' class='pln'><span class='str'> cog.out("xy%d\\n" % i)</span><span class='strut'> </span></p> -<p id='t241' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p> -<p id='t242' class='pln'><span class='str'> xy0</span><span class='strut'> </span></p> -<p id='t243' class='pln'><span class='str'> xy1</span><span class='strut'> </span></p> -<p id='t244' class='pln'><span class='str'> xy2</span><span class='strut'> </span></p> -<p id='t245' class='pln'><span class='str'> #[[[end]]]</span><span class='strut'> </span></p> -<p id='t246' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t247' class='pln'><span class='strut'> </span></p> -<p id='t248' 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='t249' 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='t250' class='pln'><span class='strut'> </span></p> -<p id='t251' 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='t252' class='pln'> <span class='com'># If the cog'ed output has no final newline,</span><span class='strut'> </span></p> -<p id='t253' class='pln'> <span class='com'># it shouldn't eat up the cog terminator.</span><span class='strut'> </span></p> -<p id='t254' 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='t255' class='pln'><span class='str'> prologue</span><span class='strut'> </span></p> -<p id='t256' class='pln'><span class='str'> [[[cog</span><span class='strut'> </span></p> -<p id='t257' class='pln'><span class='str'> import cog</span><span class='strut'> </span></p> -<p id='t258' class='pln'><span class='str'> for i in range(3):</span><span class='strut'> </span></p> -<p id='t259' class='pln'><span class='str'> cog.out("%d" % i)</span><span class='strut'> </span></p> -<p id='t260' class='pln'><span class='str'> ]]]</span><span class='strut'> </span></p> -<p id='t261' class='pln'><span class='str'> 012</span><span class='strut'> </span></p> -<p id='t262' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p> -<p id='t263' class='pln'><span class='str'> epilogue</span><span class='strut'> </span></p> -<p id='t264' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t265' class='pln'><span class='strut'> </span></p> -<p id='t266' 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='t267' 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='t268' class='pln'><span class='strut'> </span></p> -<p id='t269' 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='t270' class='pln'> <span class='com'># If there is absolutely no cog output, that's ok.</span><span class='strut'> </span></p> -<p id='t271' 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='t272' class='pln'><span class='str'> prologue</span><span class='strut'> </span></p> -<p id='t273' class='pln'><span class='str'> [[[cog</span><span class='strut'> </span></p> -<p id='t274' class='pln'><span class='str'> i = 1</span><span class='strut'> </span></p> -<p id='t275' class='pln'><span class='str'> ]]]</span><span class='strut'> </span></p> -<p id='t276' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p> -<p id='t277' class='pln'><span class='str'> epilogue</span><span class='strut'> </span></p> -<p id='t278' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t279' class='pln'><span class='strut'> </span></p> -<p id='t280' 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='t281' 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='t282' class='pln'><span class='strut'> </span></p> -<p id='t283' 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='t284' 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='t285' class='pln'> <span class='com'># prefix, that should be OK.</span><span class='strut'> </span></p> -<p id='t286' class='pln'><span class='strut'> </span></p> -<p id='t287' 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='t288' class='pln'><span class='str'> prologue</span><span class='strut'> </span></p> -<p id='t289' class='pln'><span class='str'> [[[cog</span><span class='strut'> </span></p> -<p id='t290' class='pln'><span class='str'> import sys</span><span class='strut'> </span></p> -<p id='t291' class='pln'><span class='str'> cog.out("Hello")</span><span class='strut'> </span></p> -<p id='t292' class='pln'><span class='str'> $</span><span class='strut'> </span></p> -<p id='t293' class='pln'><span class='str'> cog.out("There")</span><span class='strut'> </span></p> -<p id='t294' class='pln'><span class='str'> ]]]</span><span class='strut'> </span></p> -<p id='t295' class='pln'><span class='str'> HelloThere</span><span class='strut'> </span></p> -<p id='t296' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p> -<p id='t297' class='pln'><span class='str'> epilogue</span><span class='strut'> </span></p> -<p id='t298' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t299' class='pln'><span class='strut'> </span></p> -<p id='t300' 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='t301' 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='t302' class='pln'><span class='strut'> </span></p> -<p id='t303' 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='t304' class='pln'> <span class='com'># Alexander Belchenko suggested the string argument to outl should</span><span class='strut'> </span></p> -<p id='t305' class='pln'> <span class='com'># be optional. Does it work?</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='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t308' class='pln'><span class='str'> prologue</span><span class='strut'> </span></p> -<p id='t309' class='pln'><span class='str'> [[[cog</span><span class='strut'> </span></p> -<p id='t310' class='pln'><span class='str'> cog.outl("x")</span><span class='strut'> </span></p> -<p id='t311' class='pln'><span class='str'> cog.outl()</span><span class='strut'> </span></p> -<p id='t312' class='pln'><span class='str'> cog.outl("y")</span><span class='strut'> </span></p> -<p id='t313' class='pln'><span class='str'> cog.outl(trimblanklines=True)</span><span class='strut'> </span></p> -<p id='t314' class='pln'><span class='str'> cog.outl("z")</span><span class='strut'> </span></p> -<p id='t315' class='pln'><span class='str'> ]]]</span><span class='strut'> </span></p> -<p id='t316' class='pln'><span class='str'> x</span><span class='strut'> </span></p> -<p id='t317' class='pln'><span class='strut'> </span></p> -<p id='t318' class='pln'><span class='str'> y</span><span class='strut'> </span></p> -<p id='t319' class='pln'><span class='str'> </span><span class='strut'> </span></p> -<p id='t320' class='pln'><span class='str'> z</span><span class='strut'> </span></p> -<p id='t321' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p> -<p id='t322' class='pln'><span class='str'> epilogue</span><span class='strut'> </span></p> -<p id='t323' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t324' class='pln'><span class='strut'> </span></p> -<p id='t325' 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='t326' 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='t327' class='pln'><span class='strut'> </span></p> -<p id='t328' 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='t329' 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='t330' class='pln'><span class='str'> fooey</span><span class='strut'> </span></p> -<p id='t331' class='pln'><span class='str'> [[[cog</span><span class='strut'> </span></p> -<p id='t332' class='pln'><span class='str'> cog.outl("started at line number %d" % cog.firstLineNum)</span><span class='strut'> </span></p> -<p id='t333' class='pln'><span class='str'> ]]]</span><span class='strut'> </span></p> -<p id='t334' class='pln'><span class='str'> started at line number 2</span><span class='strut'> </span></p> -<p id='t335' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p> -<p id='t336' class='pln'><span class='str'> blah blah</span><span class='strut'> </span></p> -<p id='t337' class='pln'><span class='str'> [[[cog</span><span class='strut'> </span></p> -<p id='t338' class='pln'><span class='str'> cog.outl("and again at line %d" % cog.firstLineNum)</span><span class='strut'> </span></p> -<p id='t339' class='pln'><span class='str'> ]]]</span><span class='strut'> </span></p> -<p id='t340' class='pln'><span class='str'> and again at line 8</span><span class='strut'> </span></p> -<p id='t341' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p> -<p id='t342' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t343' class='pln'><span class='strut'> </span></p> -<p id='t344' 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='t345' 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='t346' class='pln'><span class='strut'> </span></p> -<p id='t347' 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='t348' 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='t349' class='pln'><span class='str'> first line</span><span class='strut'> </span></p> -<p id='t350' class='pln'><span class='str'> hey: [[[cog cog.outl("hello %d" % (3*3*3*3)) ]]] looky!</span><span class='strut'> </span></p> -<p id='t351' class='pln'><span class='str'> get rid of this!</span><span class='strut'> </span></p> -<p id='t352' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p> -<p id='t353' class='pln'><span class='str'> last line</span><span class='strut'> </span></p> -<p id='t354' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t355' class='pln'><span class='strut'> </span></p> -<p id='t356' 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='t357' class='pln'><span class='str'> first line</span><span class='strut'> </span></p> -<p id='t358' class='pln'><span class='str'> hey: [[[cog cog.outl("hello %d" % (3*3*3*3)) ]]] looky!</span><span class='strut'> </span></p> -<p id='t359' class='pln'><span class='str'> hello 81</span><span class='strut'> </span></p> -<p id='t360' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p> -<p id='t361' class='pln'><span class='str'> last line</span><span class='strut'> </span></p> -<p id='t362' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t363' class='pln'><span class='strut'> </span></p> -<p id='t364' 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='t365' 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='t366' class='pln'><span class='strut'> </span></p> -<p id='t367' 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='t368' 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='t369' class='pln'><span class='str'> first line</span><span class='strut'> </span></p> -<p id='t370' class='pln'><span class='str'> hey?: ]]] what is this? [[[cog strange!</span><span class='strut'> </span></p> -<p id='t371' class='pln'><span class='str'> get rid of this!</span><span class='strut'> </span></p> -<p id='t372' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p> -<p id='t373' class='pln'><span class='str'> last line</span><span class='strut'> </span></p> -<p id='t374' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t375' 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='t376' class='pln'> <span class='str'>"infile.txt(2): Cog code markers inverted"</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t377' 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='t378' 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='t379' class='pln'><span class='strut'> </span></p> -<p id='t380' 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='t381' 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='t382' class='pln'><span class='str'> first line</span><span class='strut'> </span></p> -<p id='t383' class='pln'><span class='str'> hey: [[[cog s="hey there" ]]] looky!</span><span class='strut'> </span></p> -<p id='t384' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p> -<p id='t385' class='pln'><span class='str'> more literal junk.</span><span class='strut'> </span></p> -<p id='t386' class='pln'><span class='str'> [[[cog cog.outl(s) ]]]</span><span class='strut'> </span></p> -<p id='t387' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p> -<p id='t388' class='pln'><span class='str'> last line</span><span class='strut'> </span></p> -<p id='t389' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t390' class='pln'><span class='strut'> </span></p> -<p id='t391' 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='t392' class='pln'><span class='str'> first line</span><span class='strut'> </span></p> -<p id='t393' class='pln'><span class='str'> hey: [[[cog s="hey there" ]]] looky!</span><span class='strut'> </span></p> -<p id='t394' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p> -<p id='t395' class='pln'><span class='str'> more literal junk.</span><span class='strut'> </span></p> -<p id='t396' class='pln'><span class='str'> [[[cog cog.outl(s) ]]]</span><span class='strut'> </span></p> -<p id='t397' class='pln'><span class='str'> hey there</span><span class='strut'> </span></p> -<p id='t398' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p> -<p id='t399' class='pln'><span class='str'> last line</span><span class='strut'> </span></p> -<p id='t400' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t401' class='pln'><span class='strut'> </span></p> -<p id='t402' 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='t403' 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='t404' class='pln'><span class='strut'> </span></p> -<p id='t405' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testAssertInCogCode</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='t406' class='pln'> <span class='com'># Check that we can test assertions in cog code in the test framework.</span><span class='strut'> </span></p> -<p id='t407' 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='t408' class='pln'><span class='str'> [[[cog</span><span class='strut'> </span></p> -<p id='t409' class='pln'><span class='str'> assert 1 == 2, "Oops"</span><span class='strut'> </span></p> -<p id='t410' class='pln'><span class='str'> ]]]</span><span class='strut'> </span></p> -<p id='t411' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p> -<p id='t412' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t413' 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='t414' 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'>AssertionError</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t415' class='pln'> <span class='str'>"Oops"</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t416' 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='strut'> </span></p> -<p id='t417' class='pln'> <span class='op'>)</span><span class='strut'> </span></p> -<p id='t418' class='pln'><span class='strut'> </span></p> -<p id='t419' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testCogPrevious</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='t420' class='pln'> <span class='com'># Check that we can access the previous run's output.</span><span class='strut'> </span></p> -<p id='t421' 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='t422' class='pln'><span class='str'> [[[cog</span><span class='strut'> </span></p> -<p id='t423' class='pln'><span class='str'> assert cog.previous == "Hello there!\\n", "WTF??"</span><span class='strut'> </span></p> -<p id='t424' class='pln'><span class='str'> cog.out(cog.previous)</span><span class='strut'> </span></p> -<p id='t425' class='pln'><span class='str'> cog.outl("Ran again!")</span><span class='strut'> </span></p> -<p id='t426' class='pln'><span class='str'> ]]]</span><span class='strut'> </span></p> -<p id='t427' class='pln'><span class='str'> Hello there!</span><span class='strut'> </span></p> -<p id='t428' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p> -<p id='t429' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t430' class='pln'><span class='strut'> </span></p> -<p id='t431' 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='t432' class='pln'><span class='str'> [[[cog</span><span class='strut'> </span></p> -<p id='t433' class='pln'><span class='str'> assert cog.previous == "Hello there!\\n", "WTF??"</span><span class='strut'> </span></p> -<p id='t434' class='pln'><span class='str'> cog.out(cog.previous)</span><span class='strut'> </span></p> -<p id='t435' class='pln'><span class='str'> cog.outl("Ran again!")</span><span class='strut'> </span></p> -<p id='t436' class='pln'><span class='str'> ]]]</span><span class='strut'> </span></p> -<p id='t437' class='pln'><span class='str'> Hello there!</span><span class='strut'> </span></p> -<p id='t438' class='pln'><span class='str'> Ran again!</span><span class='strut'> </span></p> -<p id='t439' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p> -<p id='t440' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t441' class='pln'><span class='strut'> </span></p> -<p id='t442' 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='t443' 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='t444' class='pln'><span class='strut'> </span></p> -<p id='t445' 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='t446' class='pln'> <span class='str'>""" Test the CogOptions class.</span><span class='strut'> </span></p> -<p id='t447' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t448' class='pln'><span class='strut'> </span></p> -<p id='t449' 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='t450' 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='t451' 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='t452' 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='t453' 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='t454' 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='t455' 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='t456' 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='t457' class='pln'><span class='strut'> </span></p> -<p id='t458' 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='t459' 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='t460' 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='t461' 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='t462' 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='t463' 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='t464' 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='t465' 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='t466' 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='t467' 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='t468' class='pln'><span class='strut'> </span></p> -<p id='t469' 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='t470' class='pln'> <span class='com'># Single-character flags can be combined.</span><span class='strut'> </span></p> -<p id='t471' 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='t472' 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='t473' 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='t474' 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='t475' 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='t476' class='pln'><span class='strut'> </span></p> -<p id='t477' 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='t478' 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='t479' class='pln'><span class='str'> of files.</span><span class='strut'> </span></p> -<p id='t480' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t481' class='pln'><span class='strut'> </span></p> -<p id='t482' 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='t483' 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='t484' 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='t485' class='pln'> <span class='nam'>msg</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t486' 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='t487' class='pln'><span class='strut'> </span></p> -<p id='t488' 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='t489' class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t490' class='pln'><span class='str'> Fooey</span><span class='strut'> </span></p> -<p id='t491' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p> -<p id='t492' class='pln'><span class='str'> cog.outl('hello')</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(2): Cog block begun but never ended."</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 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='t497' class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t498' class='pln'><span class='str'> Fooey</span><span class='strut'> </span></p> -<p id='t499' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p> -<p id='t500' class='pln'><span class='str'> cog.outl('hello')</span><span class='strut'> </span></p> -<p id='t501' class='pln'><span class='str'> #]]]</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'>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='t504' class='pln'><span class='strut'> </span></p> -<p id='t505' class='stm mis'> <span class='nam'>infile2</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t506' class='pln'><span class='str'> Fooey</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'> #]]]</span><span class='strut'> </span></p> -<p id='t510' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p> -<p id='t511' class='pln'><span class='str'> cog.outl('goodbye')</span><span class='strut'> </span></p> -<p id='t512' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p> -<p id='t513' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t514' 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='t515' class='pln'><span class='strut'> </span></p> -<p id='t516' 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='t517' class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t518' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p> -<p id='t519' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t520' 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='t521' class='pln'><span class='strut'> </span></p> -<p id='t522' class='stm mis'> <span class='nam'>infile2</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t523' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p> -<p id='t524' class='pln'><span class='str'> cog.outl('hello')</span><span class='strut'> </span></p> -<p id='t525' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p> -<p id='t526' class='pln'><span class='str'> #[[[end]]] </span><span class='strut'> </span></p> -<p id='t527' class='pln'><span class='str'> #]]]</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='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='t530' class='pln'><span class='strut'> </span></p> -<p id='t531' 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='t532' class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t533' class='pln'><span class='str'> #[[[end]]]</span><span class='strut'> </span></p> -<p id='t534' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t535' 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='t536' class='pln'><span class='strut'> </span></p> -<p id='t537' class='stm mis'> <span class='nam'>infile2</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t538' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p> -<p id='t539' class='pln'><span class='str'> cog.outl('hello')</span><span class='strut'> </span></p> -<p id='t540' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p> -<p id='t541' class='pln'><span class='str'> #[[[end]]]</span><span class='strut'> </span></p> -<p id='t542' class='pln'><span class='str'> #[[[end]]]</span><span class='strut'> </span></p> -<p id='t543' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t544' 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='t545' class='pln'><span class='strut'> </span></p> -<p id='t546' 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='t547' class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t548' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p> -<p id='t549' class='pln'><span class='str'> cog.outl("hello")</span><span class='strut'> </span></p> -<p id='t550' class='pln'><span class='str'> #[[[end]]]</span><span class='strut'> </span></p> -<p id='t551' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t552' 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='t553' class='pln'><span class='strut'> </span></p> -<p id='t554' class='stm mis'> <span class='nam'>infile2</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t555' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p> -<p id='t556' class='pln'><span class='str'> cog.outl('hello')</span><span class='strut'> </span></p> -<p id='t557' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p> -<p id='t558' class='pln'><span class='str'> #[[[end]]]</span><span class='strut'> </span></p> -<p id='t559' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p> -<p id='t560' class='pln'><span class='str'> cog.outl("hello")</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'> """</span><span class='strut'> </span></p> -<p id='t563' 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='t564' class='pln'><span class='strut'> </span></p> -<p id='t565' 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='t566' class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t567' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p> -<p id='t568' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p> -<p id='t569' class='pln'><span class='str'> cog.outl("hello")</span><span class='strut'> </span></p> -<p id='t570' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p> -<p id='t571' class='pln'><span class='str'> #[[[end]]]</span><span class='strut'> </span></p> -<p id='t572' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t573' 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='t574' class='pln'><span class='strut'> </span></p> -<p id='t575' class='stm mis'> <span class='nam'>infile2</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t576' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p> -<p id='t577' class='pln'><span class='str'> cog.outl("hello")</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='str'> #[[[end]]]</span><span class='strut'> </span></p> -<p id='t580' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p> -<p id='t581' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p> -<p id='t582' class='pln'><span class='str'> cog.outl("hello")</span><span class='strut'> </span></p> -<p id='t583' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p> -<p id='t584' class='pln'><span class='str'> #[[[end]]]</span><span class='strut'> </span></p> -<p id='t585' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t586' 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='t587' class='pln'><span class='strut'> </span></p> -<p id='t588' 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='t589' class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t590' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p> -<p id='t591' class='pln'><span class='str'> cog.outl("hello")</span><span class='strut'> </span></p> -<p id='t592' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p> -<p id='t593' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p> -<p id='t594' class='pln'><span class='str'> #[[[end]]]</span><span class='strut'> </span></p> -<p id='t595' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t596' 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='t597' class='pln'><span class='strut'> </span></p> -<p id='t598' class='stm mis'> <span class='nam'>infile2</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t599' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p> -<p id='t600' class='pln'><span class='str'> cog.outl("hello")</span><span class='strut'> </span></p> -<p id='t601' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p> -<p id='t602' class='pln'><span class='str'> #[[[end]]]</span><span class='strut'> </span></p> -<p id='t603' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p> -<p id='t604' class='pln'><span class='str'> cog.outl("hello")</span><span class='strut'> </span></p> -<p id='t605' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p> -<p id='t606' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p> -<p id='t607' class='pln'><span class='str'> #[[[end]]]</span><span class='strut'> </span></p> -<p id='t608' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t609' 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='t610' class='pln'><span class='strut'> </span></p> -<p id='t611' 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='t612' class='pln'> <span class='str'>""" Test cases for cog.error().</span><span class='strut'> </span></p> -<p id='t613' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t614' class='pln'><span class='strut'> </span></p> -<p id='t615' 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='t616' class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t617' class='pln'><span class='str'> [[[cog cog.error("This ain't right!")]]]</span><span class='strut'> </span></p> -<p id='t618' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p> -<p id='t619' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t620' class='pln'><span class='strut'> </span></p> -<p id='t621' 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='t622' 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='t623' class='pln'> <span class='str'>"This ain't right!"</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t624' 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='t625' class='pln'><span class='strut'> </span></p> -<p id='t626' 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='t627' class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t628' class='pln'><span class='str'> [[[cog cog.error()]]]</span><span class='strut'> </span></p> -<p id='t629' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p> -<p id='t630' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t631' class='pln'><span class='strut'> </span></p> -<p id='t632' 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='t633' 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='t634' class='pln'> <span class='str'>"Error raised by cog generator."</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t635' 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='t636' class='pln'><span class='strut'> </span></p> -<p id='t637' 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='t638' class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t639' class='pln'><span class='str'> --[[[cog</span><span class='strut'> </span></p> -<p id='t640' class='pln'><span class='str'> --import cog</span><span class='strut'> </span></p> -<p id='t641' class='pln'><span class='str'> --for i in range(3):</span><span class='strut'> </span></p> -<p id='t642' class='pln'><span class='str'> -- if i > 10:</span><span class='strut'> </span></p> -<p id='t643' class='pln'><span class='str'> -- cog.error("Something is amiss!")</span><span class='strut'> </span></p> -<p id='t644' class='pln'><span class='str'> -- cog.out("xx%d\\n" % i)</span><span class='strut'> </span></p> -<p id='t645' class='pln'><span class='str'> --]]]</span><span class='strut'> </span></p> -<p id='t646' class='pln'><span class='str'> xx0</span><span class='strut'> </span></p> -<p id='t647' class='pln'><span class='str'> xx1</span><span class='strut'> </span></p> -<p id='t648' class='pln'><span class='str'> xx2</span><span class='strut'> </span></p> -<p id='t649' class='pln'><span class='str'> --[[[end]]]</span><span class='strut'> </span></p> -<p id='t650' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t651' class='pln'><span class='strut'> </span></p> -<p id='t652' 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='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'>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='t654' class='pln'><span class='strut'> </span></p> -<p id='t655' 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='t656' class='pln'> <span class='str'>""" Unit tests against CogGenerator to see if its getCode() method works</span><span class='strut'> </span></p> -<p id='t657' class='pln'><span class='str'> properly.</span><span class='strut'> </span></p> -<p id='t658' class='pln'><span class='str'> """</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'>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='t661' 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='t662' class='pln'><span class='str'> the functions we're going to use.</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'>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='t665' 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='t666' 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='t667' class='pln'><span class='strut'> </span></p> -<p id='t668' 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='t669' 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='t670' 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='t671' 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='t672' class='pln'><span class='strut'> </span></p> -<p id='t673' 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='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'>'// [[[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'>' print "hello"'</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'>' print "bye"'</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'>m</span><span class='op'>(</span><span class='str'>'// ]]]'</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'>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='t679' class='pln'><span class='strut'> </span></p> -<p id='t680' 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='t681' class='pln'> <span class='com'># For a while, I supported compressed code blocks, but no longer.</span><span class='strut'> </span></p> -<p id='t682' 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='t683' 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='t684' 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='t685' 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='t686' 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='t687' class='pln'><span class='strut'> </span></p> -<p id='t688' 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='t689' class='pln'> <span class='com'># For a while, I supported compressed code blocks, but no longer.</span><span class='strut'> </span></p> -<p id='t690' 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='t691' 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='t692' 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='t693' 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='t694' 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='t695' class='pln'><span class='strut'> </span></p> -<p id='t696' 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='t697' class='pln'> <span class='com'># For a while, I supported compressed code blocks, but no longer.</span><span class='strut'> </span></p> -<p id='t698' 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='t699' 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='t700' 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='t701' 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='t702' 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='t703' class='pln'><span class='strut'> </span></p> -<p id='t704' 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='t705' class='pln'> <span class='com'># For a while, I supported compressed code blocks, but no longer.</span><span class='strut'> </span></p> -<p id='t706' 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='t707' 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='t708' 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='t709' 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='t710' 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='t711' class='pln'><span class='strut'> </span></p> -<p id='t712' 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='t713' 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='t714' class='pln'> <span class='com'># C++ compiler.</span><span class='strut'> </span></p> -<p id='t715' 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='t716' 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='t717' 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='t718' 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='t719' 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='t720' 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='t721' class='pln'><span class='strut'> </span></p> -<p id='t722' 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='t723' class='pln'><span class='strut'> </span></p> -<p id='t724' 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='t725' class='pln'> <span class='str'>""" Initialize the cog members for another run.</span><span class='strut'> </span></p> -<p id='t726' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t727' class='pln'> <span class='com'># Create a cog engine, and catch its output.</span><span class='strut'> </span></p> -<p id='t728' 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='t729' 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='op'>)</span><span class='strut'> </span></p> -<p id='t730' 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='t731' class='pln'><span class='strut'> </span></p> -<p id='t732' 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='t733' class='pln'> <span class='com'># Create a temporary directory.</span><span class='strut'> </span></p> -<p id='t734' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>tempdir</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'>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='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='t735' 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'>tempdir</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t736' 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='t737' 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='t738' 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='t739' class='pln'><span class='strut'> </span></p> -<p id='t740' 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='t741' 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='t742' class='pln'> <span class='com'># Get rid of the temporary directory.</span><span class='strut'> </span></p> -<p id='t743' class='stm mis'> <span class='nam'>shutil</span><span class='op'>.</span><span class='nam'>rmtree</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='t744' class='pln'><span class='strut'> </span></p> -<p id='t745' 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='t746' class='stm mis'> <span class='nam'>text1</span> <span class='op'>=</span> <span class='nam'>open</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'>tempdir</span><span class='op'>,</span> <span class='nam'>sFName1</span><span class='op'>)</span><span class='op'>)</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='t747' class='stm mis'> <span class='nam'>text2</span> <span class='op'>=</span> <span class='nam'>open</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'>tempdir</span><span class='op'>,</span> <span class='nam'>sFName2</span><span class='op'>)</span><span class='op'>)</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='t748' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>text1</span><span class='op'>,</span> <span class='nam'>text2</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t749' class='pln'><span class='strut'> </span></p> -<p id='t750' 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='t751' class='stm mis'> <span class='nam'>sAbsName</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'>tempdir</span><span class='op'>,</span> <span class='nam'>sFName</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t752' 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='t753' class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t754' 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='t755' class='pln'> <span class='key'>finally</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t756' 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='t757' 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'>to_bytes</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='t758' class='pln'><span class='strut'> </span></p> -<p id='t759' class='pln'><span class='strut'> </span></p> -<p id='t760' 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='t761' class='pln'><span class='strut'> </span></p> -<p id='t762' 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='t763' class='pln'> <span class='com'># Return value 2 means usage problem.</span><span class='strut'> </span></p> -<p id='t764' 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='t765' 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='t766' 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='t767' 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='t768' 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='t769' class='pln'><span class='strut'> </span></p> -<p id='t770' 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='t771' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t772' class='pln'> <span class='str'>'cogfiles.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t773' class='pln'><span class='str'> # Please run cog</span><span class='strut'> </span></p> -<p id='t774' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t775' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t776' class='pln'><span class='strut'> </span></p> -<p id='t777' 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='t778' 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='t779' class='pln'><span class='strut'> </span></p> -<p id='t780' 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='t781' 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='t782' 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='t783' 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='t784' class='pln'><span class='strut'> </span></p> -<p id='t785' 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='t786' 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='t787' 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='t788' 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='t789' 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='t790' class='pln'><span class='strut'> </span></p> -<p id='t791' 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='t792' class='pln'> <span class='com'># -h or -? anywhere on the command line should just print help.</span><span class='strut'> </span></p> -<p id='t793' 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='t794' 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='t795' 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='t796' 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='t797' class='pln'><span class='strut'> </span></p> -<p id='t798' 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='t799' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t800' class='pln'> <span class='str'>'cogfile.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t801' class='pln'><span class='str'> # Please run cog</span><span class='strut'> </span></p> -<p id='t802' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t803' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t804' class='pln'><span class='strut'> </span></p> -<p id='t805' 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='t806' 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='t807' class='pln'><span class='strut'> </span></p> -<p id='t808' 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='t809' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t810' class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t811' class='pln'><span class='str'> // This is my C++ file.</span><span class='strut'> </span></p> -<p id='t812' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t813' class='pln'><span class='str'> fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing']</span><span class='strut'> </span></p> -<p id='t814' class='pln'><span class='str'> for fn in fnames:</span><span class='strut'> </span></p> -<p id='t815' class='pln'><span class='str'> cog.outl("void %s();" % fn)</span><span class='strut'> </span></p> -<p id='t816' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t817' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t818' class='pln'><span class='strut'> </span></p> -<p id='t819' class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t820' class='pln'><span class='str'> // This is my C++ file.</span><span class='strut'> </span></p> -<p id='t821' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t822' class='pln'><span class='str'> fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing']</span><span class='strut'> </span></p> -<p id='t823' class='pln'><span class='str'> for fn in fnames:</span><span class='strut'> </span></p> -<p id='t824' class='pln'><span class='str'> cog.outl("void %s();" % fn)</span><span class='strut'> </span></p> -<p id='t825' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t826' class='pln'><span class='str'> void DoSomething();</span><span class='strut'> </span></p> -<p id='t827' class='pln'><span class='str'> void DoAnotherThing();</span><span class='strut'> </span></p> -<p id='t828' class='pln'><span class='str'> void DoLastThing();</span><span class='strut'> </span></p> -<p id='t829' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t830' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t831' class='pln'><span class='strut'> </span></p> -<p id='t832' 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='t833' 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='t834' 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='t835' 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='t836' 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='t837' 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='t838' 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='t839' class='pln'><span class='strut'> </span></p> -<p id='t840' 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='t841' 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='t842' 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='t843' class='pln'><span class='strut'> </span></p> -<p id='t844' class='pln'><span class='strut'> </span></p> -<p id='t845' 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='t846' class='pln'><span class='strut'> </span></p> -<p id='t847' 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='t848' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t849' class='pln'> <span class='str'>'test.cog'</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'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t857' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t858' class='pln'><span class='strut'> </span></p> -<p id='t859' class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t860' class='pln'><span class='str'> // This is my C++ file.</span><span class='strut'> </span></p> -<p id='t861' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t862' class='pln'><span class='str'> fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing']</span><span class='strut'> </span></p> -<p id='t863' class='pln'><span class='str'> for fn in fnames:</span><span class='strut'> </span></p> -<p id='t864' class='pln'><span class='str'> cog.outl("void %s();" % fn)</span><span class='strut'> </span></p> -<p id='t865' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t866' class='pln'><span class='str'> void DoSomething();</span><span class='strut'> </span></p> -<p id='t867' class='pln'><span class='str'> void DoAnotherThing();</span><span class='strut'> </span></p> -<p id='t868' class='pln'><span class='str'> void DoLastThing();</span><span class='strut'> </span></p> -<p id='t869' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t870' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t871' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t872' class='pln'><span class='strut'> </span></p> -<p id='t873' 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='t874' 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='t875' 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='t876' 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='t877' 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='t878' class='pln'><span class='strut'> </span></p> -<p id='t879' 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='t880' class='pln'> <span class='com'># -o sets the output file.</span><span class='strut'> </span></p> -<p id='t881' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t882' class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t883' class='pln'><span class='str'> // This is my C++ file.</span><span class='strut'> </span></p> -<p id='t884' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t885' class='pln'><span class='str'> fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing']</span><span class='strut'> </span></p> -<p id='t886' class='pln'><span class='str'> for fn in fnames:</span><span class='strut'> </span></p> -<p id='t887' class='pln'><span class='str'> cog.outl("void %s();" % fn)</span><span class='strut'> </span></p> -<p id='t888' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t889' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t890' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t891' class='pln'><span class='strut'> </span></p> -<p id='t892' class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t893' class='pln'><span class='str'> // This is my C++ file.</span><span class='strut'> </span></p> -<p id='t894' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t895' class='pln'><span class='str'> fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing']</span><span class='strut'> </span></p> -<p id='t896' class='pln'><span class='str'> for fn in fnames:</span><span class='strut'> </span></p> -<p id='t897' class='pln'><span class='str'> cog.outl("void %s();" % fn)</span><span class='strut'> </span></p> -<p id='t898' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t899' class='pln'><span class='str'> void DoSomething();</span><span class='strut'> </span></p> -<p id='t900' class='pln'><span class='str'> void DoAnotherThing();</span><span class='strut'> </span></p> -<p id='t901' class='pln'><span class='str'> void DoLastThing();</span><span class='strut'> </span></p> -<p id='t902' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t903' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t904' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t905' class='pln'><span class='strut'> </span></p> -<p id='t906' 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='t907' 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='t908' 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='t909' class='pln'><span class='strut'> </span></p> -<p id='t910' 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='t911' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t912' class='pln'> <span class='str'>'one.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t913' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t914' class='pln'><span class='str'> cog.outl("hello world")</span><span class='strut'> </span></p> -<p id='t915' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t916' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t917' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t918' class='pln'><span class='strut'> </span></p> -<p id='t919' class='pln'> <span class='str'>'one.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t920' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t921' class='pln'><span class='str'> cog.outl("hello world")</span><span class='strut'> </span></p> -<p id='t922' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t923' class='pln'><span class='str'> hello world</span><span class='strut'> </span></p> -<p id='t924' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t925' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t926' class='pln'><span class='strut'> </span></p> -<p id='t927' class='pln'> <span class='str'>'two.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t928' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t929' class='pln'><span class='str'> cog.outl("goodbye cruel world")</span><span class='strut'> </span></p> -<p id='t930' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t931' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t932' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t933' class='pln'><span class='strut'> </span></p> -<p id='t934' class='pln'> <span class='str'>'two.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t935' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t936' class='pln'><span class='str'> cog.outl("goodbye cruel world")</span><span class='strut'> </span></p> -<p id='t937' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t938' class='pln'><span class='str'> goodbye cruel world</span><span class='strut'> </span></p> -<p id='t939' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t940' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t941' class='pln'><span class='strut'> </span></p> -<p id='t942' class='pln'> <span class='str'>'cogfiles.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t943' class='pln'><span class='str'> # Please run cog</span><span class='strut'> </span></p> -<p id='t944' class='pln'><span class='str'> one.cog</span><span class='strut'> </span></p> -<p id='t945' class='pln'><span class='str'> </span><span class='strut'> </span></p> -<p id='t946' class='pln'><span class='str'> two.cog</span><span class='strut'> </span></p> -<p id='t947' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t948' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t949' class='pln'><span class='strut'> </span></p> -<p id='t950' 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='t951' 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='t952' 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='t953' 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='t954' 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='t955' 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='t956' class='pln'><span class='strut'> </span></p> -<p id='t957' 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='t958' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t959' class='pln'> <span class='str'>'one.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t960' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t961' class='pln'><span class='str'> cog.outl("hello world")</span><span class='strut'> </span></p> -<p id='t962' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t963' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t964' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t965' class='pln'><span class='strut'> </span></p> -<p id='t966' class='pln'> <span class='str'>'one.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t967' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t968' class='pln'><span class='str'> cog.outl("hello world")</span><span class='strut'> </span></p> -<p id='t969' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t970' class='pln'><span class='str'> hello world</span><span class='strut'> </span></p> -<p id='t971' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t972' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t973' class='pln'><span class='strut'> </span></p> -<p id='t974' class='pln'> <span class='str'>'two.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t975' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t976' class='pln'><span class='str'> cog.outl("goodbye cruel world")</span><span class='strut'> </span></p> -<p id='t977' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t978' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t979' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t980' class='pln'><span class='strut'> </span></p> -<p id='t981' class='pln'> <span class='str'>'two.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t982' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t983' class='pln'><span class='str'> cog.outl("goodbye cruel world")</span><span class='strut'> </span></p> -<p id='t984' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t985' class='pln'><span class='str'> goodbye cruel world</span><span class='strut'> </span></p> -<p id='t986' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t987' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t988' class='pln'><span class='strut'> </span></p> -<p id='t989' class='pln'> <span class='str'>'cogfiles.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t990' class='pln'><span class='str'> # Please run cog</span><span class='strut'> </span></p> -<p id='t991' class='pln'><span class='str'> one.cog</span><span class='strut'> </span></p> -<p id='t992' class='pln'><span class='str'> @cogfiles2.txt</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'>'cogfiles2.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t996' class='pln'><span class='str'> # This one too, please.</span><span class='strut'> </span></p> -<p id='t997' class='pln'><span class='str'> two.cog</span><span class='strut'> </span></p> -<p id='t998' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t999' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t1000' class='pln'><span class='strut'> </span></p> -<p id='t1001' 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='t1002' 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='t1003' 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='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'>'two.cog'</span><span class='op'>,</span> <span class='str'>'two.out'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t1005' 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='t1006' 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='t1007' class='pln'><span class='strut'> </span></p> -<p id='t1008' 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='t1009' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t1010' class='pln'> <span class='str'>'both.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1011' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1012' class='pln'><span class='str'> cog.outl("one: %s" % ('one' in globals()))</span><span class='strut'> </span></p> -<p id='t1013' class='pln'><span class='str'> cog.outl("two: %s" % ('two' in globals()))</span><span class='strut'> </span></p> -<p id='t1014' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1015' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t1016' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1017' class='pln'><span class='strut'> </span></p> -<p id='t1018' class='pln'> <span class='str'>'one.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1019' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1020' class='pln'><span class='str'> cog.outl("one: %s" % ('one' in globals()))</span><span class='strut'> </span></p> -<p id='t1021' class='pln'><span class='str'> cog.outl("two: %s" % ('two' in globals()))</span><span class='strut'> </span></p> -<p id='t1022' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1023' class='pln'><span class='str'> one: True // ONE</span><span class='strut'> </span></p> -<p id='t1024' class='pln'><span class='str'> two: False // ONE</span><span class='strut'> </span></p> -<p id='t1025' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t1026' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1027' class='pln'><span class='strut'> </span></p> -<p id='t1028' class='pln'> <span class='str'>'two.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1029' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1030' class='pln'><span class='str'> cog.outl("one: %s" % ('one' in globals()))</span><span class='strut'> </span></p> -<p id='t1031' class='pln'><span class='str'> cog.outl("two: %s" % ('two' in globals()))</span><span class='strut'> </span></p> -<p id='t1032' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1033' class='pln'><span class='str'> one: False // TWO</span><span class='strut'> </span></p> -<p id='t1034' class='pln'><span class='str'> two: True // TWO</span><span class='strut'> </span></p> -<p id='t1035' class='pln'><span class='str'> //[[[end]]]</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'>'cogfiles.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1039' class='pln'><span class='str'> # Please run cog</span><span class='strut'> </span></p> -<p id='t1040' class='pln'><span class='str'> both.cog -o both.one -s ' // ONE' -D one=x</span><span class='strut'> </span></p> -<p id='t1041' class='pln'><span class='str'> both.cog -o both.two -s ' // TWO' -D two=x</span><span class='strut'> </span></p> -<p id='t1042' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t1043' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t1044' class='pln'><span class='strut'> </span></p> -<p id='t1045' 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='t1046' 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='t1047' 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='t1048' 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='t1049' class='pln'><span class='strut'> </span></p> -<p id='t1050' 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='t1051' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t1052' class='pln'> <span class='str'>'both.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1053' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1054' class='pln'><span class='str'> cog.outl("one: %s" % ('one' in globals()))</span><span class='strut'> </span></p> -<p id='t1055' class='pln'><span class='str'> cog.outl("two: %s" % ('two' in globals()))</span><span class='strut'> </span></p> -<p id='t1056' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1057' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t1058' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1059' class='pln'><span class='strut'> </span></p> -<p id='t1060' class='pln'> <span class='str'>'cogfiles.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1061' class='pln'><span class='str'> # Please run cog</span><span class='strut'> </span></p> -<p id='t1062' class='pln'><span class='str'> both.cog </span><span class='strut'> </span></p> -<p id='t1063' class='pln'><span class='str'> both.cog -d # This is bad: -r and -d</span><span class='strut'> </span></p> -<p id='t1064' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t1065' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t1066' class='pln'><span class='strut'> </span></p> -<p id='t1067' 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='t1068' 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='t1069' class='pln'><span class='strut'> </span></p> -<p id='t1070' 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='t1071' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t1072' class='pln'> <span class='str'>'one 1.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1073' class='pln'><span class='str'> //[[[cog cog.outl("hello world") ]]]</span><span class='strut'> </span></p> -<p id='t1074' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1075' class='pln'><span class='strut'> </span></p> -<p id='t1076' class='pln'> <span class='str'>'one.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1077' class='pln'><span class='str'> //[[[cog cog.outl("hello world") ]]]</span><span class='strut'> </span></p> -<p id='t1078' class='pln'><span class='str'> hello world //xxx</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='strut'> </span></p> -<p id='t1081' class='pln'> <span class='str'>'subdir'</span><span class='op'>:</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t1082' class='pln'> <span class='str'>'subback.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1083' class='pln'><span class='str'> //[[[cog cog.outl("down deep with backslashes") ]]]</span><span class='strut'> </span></p> -<p id='t1084' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1085' class='pln'><span class='strut'> </span></p> -<p id='t1086' class='pln'> <span class='str'>'subfwd.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1087' class='pln'><span class='str'> //[[[cog cog.outl("down deep with slashes") ]]]</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='op'>}</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1090' class='pln'><span class='strut'> </span></p> -<p id='t1091' class='pln'> <span class='str'>'subback.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1092' class='pln'><span class='str'> //[[[cog cog.outl("down deep with backslashes") ]]]</span><span class='strut'> </span></p> -<p id='t1093' class='pln'><span class='str'> down deep with backslashes //yyy</span><span class='strut'> </span></p> -<p id='t1094' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1095' class='pln'><span class='strut'> </span></p> -<p id='t1096' class='pln'> <span class='str'>'subfwd.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1097' class='pln'><span class='str'> //[[[cog cog.outl("down deep with slashes") ]]]</span><span class='strut'> </span></p> -<p id='t1098' class='pln'><span class='str'> down deep with slashes //zzz</span><span class='strut'> </span></p> -<p id='t1099' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1100' class='pln'><span class='strut'> </span></p> -<p id='t1101' class='pln'> <span class='str'>'cogfiles.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1102' class='pln'><span class='str'> # Please run cog</span><span class='strut'> </span></p> -<p id='t1103' class='pln'><span class='str'> 'one 1.cog' -s ' //xxx'</span><span class='strut'> </span></p> -<p id='t1104' class='pln'><span class='str'> subdir\subback.cog -s ' //yyy'</span><span class='strut'> </span></p> -<p id='t1105' class='pln'><span class='str'> subdir/subfwd.cog -s ' //zzz'</span><span class='strut'> </span></p> -<p id='t1106' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t1107' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t1108' class='pln'><span class='strut'> </span></p> -<p id='t1109' 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='t1110' 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='t1111' 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='t1112' 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='t1113' 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='t1114' class='pln'><span class='strut'> </span></p> -<p id='t1115' class='pln'><span class='strut'> </span></p> -<p id='t1116' 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='t1117' class='pln'> <span class='str'>"""Tests for -U option (force LF line-endings in output)."""</span><span class='strut'> </span></p> -<p id='t1118' class='pln'><span class='strut'> </span></p> -<p id='t1119' 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='t1120' class='pln'> <span class='str'>'//[[[cog'</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1121' class='pln'> <span class='str'>'cog.outl("Cog text")'</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1122' class='pln'> <span class='str'>'//]]]'</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1123' class='pln'> <span class='str'>'gobbledegook.'</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1124' class='pln'> <span class='str'>'//[[[end]]]'</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1125' class='pln'> <span class='str'>'epilogue.'</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1126' class='pln'> <span class='str'>''</span><span class='op'>]</span><span class='strut'> </span></p> -<p id='t1127' class='pln'><span class='strut'> </span></p> -<p id='t1128' 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='t1129' class='pln'> <span class='str'>'//[[[cog'</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1130' class='pln'> <span class='str'>'cog.outl("Cog text")'</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1131' class='pln'> <span class='str'>'//]]]'</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1132' class='pln'> <span class='str'>'Cog text'</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1133' class='pln'> <span class='str'>'//[[[end]]]'</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1134' class='pln'> <span class='str'>'epilogue.'</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1135' class='pln'> <span class='str'>''</span><span class='op'>]</span><span class='strut'> </span></p> -<p id='t1136' class='pln'><span class='strut'> </span></p> -<p id='t1137' 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='t1138' 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='t1139' 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='t1140' 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='t1141' class='pln'><span class='strut'> </span></p> -<p id='t1142' 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='t1143' 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='t1144' 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='t1145' 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='t1146' class='pln'><span class='strut'> </span></p> -<p id='t1147' 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='t1148' 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='t1149' 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='t1150' 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='t1151' class='pln'><span class='strut'> </span></p> -<p id='t1152' 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='t1153' 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='t1154' 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='t1155' 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='t1156' class='pln'><span class='strut'> </span></p> -<p id='t1157' class='pln'><span class='strut'> </span></p> -<p id='t1158' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>CogTestCharacterEncoding</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='t1159' class='pln'><span class='strut'> </span></p> -<p id='t1160' 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='t1161' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t1162' class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='nam'>b</span><span class='op'>(</span><span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1163' class='pln'><span class='str'> // This is my C++ file.</span><span class='strut'> </span></p> -<p id='t1164' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1165' class='pln'><span class='str'> cog.outl("// Unicode: \xe1\x88\xb4 (U+1234)")</span><span class='strut'> </span></p> -<p id='t1166' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1167' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t1168' class='pln'><span class='str'> """</span><span class='op'>)</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1169' class='pln'><span class='strut'> </span></p> -<p id='t1170' class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='nam'>b</span><span class='op'>(</span><span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1171' class='pln'><span class='str'> // This is my C++ file.</span><span class='strut'> </span></p> -<p id='t1172' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1173' class='pln'><span class='str'> cog.outl("// Unicode: \xe1\x88\xb4 (U+1234)")</span><span class='strut'> </span></p> -<p id='t1174' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1175' class='pln'><span class='str'> // Unicode: \xe1\x88\xb4 (U+1234)</span><span class='strut'> </span></p> -<p id='t1176' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t1177' class='pln'><span class='str'> """</span><span class='op'>)</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1178' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t1179' class='pln'><span class='strut'> </span></p> -<p id='t1180' 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='t1181' 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='t1182' 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='t1183' 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='t1184' 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='t1185' class='pln'><span class='strut'> </span></p> -<p id='t1186' class='pln'><span class='strut'> </span></p> -<p id='t1187' 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='t1188' class='pln'> <span class='str'>""" When running tests which import modules, the sys.modules list</span><span class='strut'> </span></p> -<p id='t1189' 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='t1190' 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='t1191' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t1192' class='pln'><span class='strut'> </span></p> -<p id='t1193' 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='t1194' 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='t1195' 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='t1196' class='pln'><span class='strut'> </span></p> -<p id='t1197' 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='t1198' class='stm mis'> <span class='nam'>modstoscrub</span> <span class='op'>=</span> <span class='op'>[</span><span class='strut'> </span></p> -<p id='t1199' class='pln'> <span class='nam'>modname</span><span class='strut'> </span></p> -<p id='t1200' 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='t1201' 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='t1202' class='pln'> <span class='op'>]</span><span class='strut'> </span></p> -<p id='t1203' 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='t1204' 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='t1205' 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='t1206' class='pln'><span class='strut'> </span></p> -<p id='t1207' class='pln'><span class='strut'> </span></p> -<p id='t1208' 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='t1209' 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='t1210' class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1211' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1212' class='pln'><span class='str'> import mymodule</span><span class='strut'> </span></p> -<p id='t1213' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1214' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t1215' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1216' class='pln'><span class='strut'> </span></p> -<p id='t1217' class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1218' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1219' class='pln'><span class='str'> import mymodule</span><span class='strut'> </span></p> -<p id='t1220' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1221' class='pln'><span class='str'> Hello from mymodule</span><span class='strut'> </span></p> -<p id='t1222' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t1223' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1224' class='pln'><span class='strut'> </span></p> -<p id='t1225' class='pln'> <span class='str'>'test2.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1226' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1227' class='pln'><span class='str'> import mymodule</span><span class='strut'> </span></p> -<p id='t1228' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1229' class='pln'><span class='str'> Hello from mymodule in inc2</span><span class='strut'> </span></p> -<p id='t1230' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t1231' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1232' class='pln'><span class='strut'> </span></p> -<p id='t1233' class='pln'> <span class='str'>'include'</span><span class='op'>:</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t1234' class='pln'> <span class='str'>'mymodule.py'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1235' class='pln'><span class='str'> import cog</span><span class='strut'> </span></p> -<p id='t1236' class='pln'><span class='str'> cog.outl("Hello from mymodule")</span><span class='strut'> </span></p> -<p id='t1237' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t1238' class='pln'> <span class='op'>}</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1239' class='pln'><span class='strut'> </span></p> -<p id='t1240' class='pln'> <span class='str'>'inc2'</span><span class='op'>:</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t1241' class='pln'> <span class='str'>'mymodule.py'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1242' class='pln'><span class='str'> import cog</span><span class='strut'> </span></p> -<p id='t1243' class='pln'><span class='str'> cog.outl("Hello from mymodule in inc2")</span><span class='strut'> </span></p> -<p id='t1244' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t1245' class='pln'> <span class='op'>}</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1246' class='pln'><span class='strut'> </span></p> -<p id='t1247' class='pln'> <span class='str'>'inc3'</span><span class='op'>:</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t1248' class='pln'> <span class='str'>'someothermodule.py'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1249' class='pln'><span class='str'> import cog</span><span class='strut'> </span></p> -<p id='t1250' class='pln'><span class='str'> cog.outl("This is some other module.")</span><span class='strut'> </span></p> -<p id='t1251' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t1252' class='pln'> <span class='op'>}</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1253' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t1254' class='pln'><span class='strut'> </span></p> -<p id='t1255' 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='t1256' class='pln'> <span class='com'># Try it without the -I, to see that an ImportError happens.</span><span class='strut'> </span></p> -<p id='t1257' 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='t1258' 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='t1259' class='pln'><span class='strut'> </span></p> -<p id='t1260' 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='t1261' class='pln'> <span class='com'># Test that -I adds include directories properly.</span><span class='strut'> </span></p> -<p id='t1262' 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='t1263' 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='t1264' 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='t1265' class='pln'><span class='strut'> </span></p> -<p id='t1266' 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='t1267' class='pln'> <span class='com'># Test that two -I's add include directories properly.</span><span class='strut'> </span></p> -<p id='t1268' 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='t1269' 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='t1270' 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='t1271' class='pln'><span class='strut'> </span></p> -<p id='t1272' 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='t1273' class='pln'> <span class='com'># Test that two -I's add include directories properly.</span><span class='strut'> </span></p> -<p id='t1274' 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='t1275' 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='t1276' 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='t1277' class='pln'><span class='strut'> </span></p> -<p id='t1278' 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='t1279' class='pln'> <span class='com'># Test that the search will continue past the first directory.</span><span class='strut'> </span></p> -<p id='t1280' 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='t1281' 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='t1282' 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='t1283' class='pln'><span class='strut'> </span></p> -<p id='t1284' 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='t1285' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t1286' class='pln'> <span class='str'>'bad.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1287' class='pln'><span class='str'> //[[[cog cog.error("Oh no!") ]]]</span><span class='strut'> </span></p> -<p id='t1288' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t1289' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1290' class='pln'> <span class='str'>'good.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1291' class='pln'><span class='str'> //[[[cog cog.outl("Oh yes!") ]]]</span><span class='strut'> </span></p> -<p id='t1292' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t1293' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1294' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t1295' class='pln'><span class='strut'> </span></p> -<p id='t1296' 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='t1297' class='pln'> <span class='com'># Is it unchanged just by creating a cog engine?</span><span class='strut'> </span></p> -<p id='t1298' 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='t1299' 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='t1300' 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='t1301' class='pln'> <span class='com'># Is it unchanged for a successful run?</span><span class='strut'> </span></p> -<p id='t1302' 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='t1303' 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='t1304' 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='t1305' class='pln'> <span class='com'># Is it unchanged for a successful run with includes?</span><span class='strut'> </span></p> -<p id='t1306' 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='t1307' 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='t1308' 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='t1309' class='pln'> <span class='com'># Is it unchanged for a successful run with two includes?</span><span class='strut'> </span></p> -<p id='t1310' 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='t1311' 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='t1312' 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='t1313' class='pln'> <span class='com'># Is it unchanged for a failed run?</span><span class='strut'> </span></p> -<p id='t1314' 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='t1315' 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='t1316' 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='t1317' class='pln'> <span class='com'># Is it unchanged for a failed run with includes?</span><span class='strut'> </span></p> -<p id='t1318' 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='t1319' 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='t1320' 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='t1321' class='pln'> <span class='com'># Is it unchanged for a failed run with two includes?</span><span class='strut'> </span></p> -<p id='t1322' 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='t1323' 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='t1324' 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='t1325' class='pln'><span class='strut'> </span></p> -<p id='t1326' 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='t1327' class='pln'> <span class='com'># Test that relative paths on the command line work, with includes.</span><span class='strut'> </span></p> -<p id='t1328' class='pln'><span class='strut'> </span></p> -<p id='t1329' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t1330' class='pln'> <span class='str'>'code'</span><span class='op'>:</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t1331' class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1332' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1333' class='pln'><span class='str'> import mysubmodule</span><span class='strut'> </span></p> -<p id='t1334' class='pln'><span class='str'> //]]]</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'>'test.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'> import mysubmodule</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'> Hello from mysubmodule</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='strut'> </span></p> -<p id='t1346' class='pln'> <span class='str'>'mysubmodule.py'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1347' class='pln'><span class='str'> import cog</span><span class='strut'> </span></p> -<p id='t1348' class='pln'><span class='str'> cog.outl("Hello from mysubmodule")</span><span class='strut'> </span></p> -<p id='t1349' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t1350' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t1351' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t1352' class='pln'><span class='strut'> </span></p> -<p id='t1353' 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='t1354' 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='t1355' class='pln'> <span class='com'># auto-include the current directory</span><span class='strut'> </span></p> -<p id='t1356' 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='t1357' 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='t1358' class='pln'><span class='strut'> </span></p> -<p id='t1359' class='pln'><span class='strut'> </span></p> -<p id='t1360' 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='t1361' class='pln'><span class='strut'> </span></p> -<p id='t1362' 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='t1363' 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='t1364' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t1365' class='pln'> <span class='str'>'with.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1366' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1367' class='pln'><span class='str'> cog.outl("hello world")</span><span class='strut'> </span></p> -<p id='t1368' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1369' class='pln'><span class='str'> hello world</span><span class='strut'> </span></p> -<p id='t1370' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t1371' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1372' class='pln'><span class='strut'> </span></p> -<p id='t1373' class='pln'> <span class='str'>'without.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1374' class='pln'><span class='str'> There's no cog</span><span class='strut'> </span></p> -<p id='t1375' class='pln'><span class='str'> code in this file.</span><span class='strut'> </span></p> -<p id='t1376' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1377' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t1378' class='pln'><span class='strut'> </span></p> -<p id='t1379' 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='t1380' 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='t1381' 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='t1382' 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='t1383' 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='t1384' 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='t1385' 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='t1386' 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='t1387' 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='t1388' 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='t1389' 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='t1390' 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='t1391' class='pln'><span class='strut'> </span></p> -<p id='t1392' 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='t1393' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t1394' class='pln'> <span class='str'>'cog1.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1395' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1396' 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='t1397' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1398' class='pln'><span class='str'> this is cog1.txt in, cog1.txt out</span><span class='strut'> </span></p> -<p id='t1399' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p> -<p id='t1400' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1401' class='pln'><span class='strut'> </span></p> -<p id='t1402' class='pln'> <span class='str'>'cog1.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1403' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1404' 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='t1405' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1406' class='pln'><span class='str'> This is cog1.txt in, cog1.txt out</span><span class='strut'> </span></p> -<p id='t1407' class='pln'><span class='str'> [[[end]]]</span><span class='strut'> </span></p> -<p id='t1408' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1409' class='pln'><span class='strut'> </span></p> -<p id='t1410' class='pln'> <span class='str'>'cog1out.out'</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 is %s in, %s out" % (cog.inFile, cog.outFile))</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 is cog1.txt in, cog1out.txt out</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'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1417' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t1418' class='pln'><span class='strut'> </span></p> -<p id='t1419' 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='t1420' 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='t1421' 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='t1422' 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='t1423' 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='t1424' 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='t1425' class='pln'><span class='strut'> </span></p> -<p id='t1426' 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='t1427' class='pln'> <span class='com'># Make sure that global values don't get shared between files.</span><span class='strut'> </span></p> -<p id='t1428' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t1429' class='pln'> <span class='str'>'one.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1430' class='pln'><span class='str'> //[[[cog s = "This was set in one.cog" ]]]</span><span class='strut'> </span></p> -<p id='t1431' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t1432' class='pln'><span class='str'> //[[[cog cog.outl(s) ]]]</span><span class='strut'> </span></p> -<p id='t1433' class='pln'><span class='str'> //[[[end]]]</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='strut'> </span></p> -<p id='t1436' class='pln'> <span class='str'>'one.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1437' class='pln'><span class='str'> //[[[cog s = "This was set in one.cog" ]]]</span><span class='strut'> </span></p> -<p id='t1438' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t1439' class='pln'><span class='str'> //[[[cog cog.outl(s) ]]]</span><span class='strut'> </span></p> -<p id='t1440' class='pln'><span class='str'> This was set in one.cog</span><span class='strut'> </span></p> -<p id='t1441' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t1442' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1443' class='pln'><span class='strut'> </span></p> -<p id='t1444' class='pln'> <span class='str'>'two.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1445' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1446' class='pln'><span class='str'> try:</span><span class='strut'> </span></p> -<p id='t1447' class='pln'><span class='str'> cog.outl(s)</span><span class='strut'> </span></p> -<p id='t1448' class='pln'><span class='str'> except NameError:</span><span class='strut'> </span></p> -<p id='t1449' class='pln'><span class='str'> cog.outl("s isn't set!")</span><span class='strut'> </span></p> -<p id='t1450' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1451' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t1452' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1453' class='pln'><span class='strut'> </span></p> -<p id='t1454' class='pln'> <span class='str'>'two.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1455' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1456' class='pln'><span class='str'> try:</span><span class='strut'> </span></p> -<p id='t1457' class='pln'><span class='str'> cog.outl(s)</span><span class='strut'> </span></p> -<p id='t1458' class='pln'><span class='str'> except NameError:</span><span class='strut'> </span></p> -<p id='t1459' class='pln'><span class='str'> cog.outl("s isn't set!")</span><span class='strut'> </span></p> -<p id='t1460' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1461' class='pln'><span class='str'> s isn't set!</span><span class='strut'> </span></p> -<p id='t1462' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t1463' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1464' class='pln'><span class='strut'> </span></p> -<p id='t1465' class='pln'> <span class='str'>'cogfiles.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1466' class='pln'><span class='str'> # Please run cog</span><span class='strut'> </span></p> -<p id='t1467' class='pln'><span class='str'> one.cog</span><span class='strut'> </span></p> -<p id='t1468' class='pln'><span class='str'> </span><span class='strut'> </span></p> -<p id='t1469' class='pln'><span class='str'> two.cog</span><span class='strut'> </span></p> -<p id='t1470' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t1471' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t1472' class='pln'><span class='strut'> </span></p> -<p id='t1473' 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='t1474' 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='t1475' 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='t1476' 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='t1477' 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='t1478' 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='t1479' class='pln'><span class='strut'> </span></p> -<p id='t1480' 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='t1481' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t1482' class='pln'> <span class='str'>'cog1.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1483' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1484' class='pln'><span class='str'> cog.outl("This line was generated.")</span><span class='strut'> </span></p> -<p id='t1485' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1486' class='pln'><span class='str'> This line was generated.</span><span class='strut'> </span></p> -<p id='t1487' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t1488' class='pln'><span class='str'> This line was not.</span><span class='strut'> </span></p> -<p id='t1489' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1490' class='pln'><span class='strut'> </span></p> -<p id='t1491' class='pln'> <span class='str'>'cog1.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1492' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1493' class='pln'><span class='str'> cog.outl("This line was generated.")</span><span class='strut'> </span></p> -<p id='t1494' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1495' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t1496' class='pln'><span class='str'> This line was not.</span><span class='strut'> </span></p> -<p id='t1497' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1498' class='pln'><span class='strut'> </span></p> -<p id='t1499' class='pln'> <span class='str'>'cog1.out2'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1500' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1501' class='pln'><span class='str'> cog.outl("This line was generated.")</span><span class='strut'> </span></p> -<p id='t1502' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1503' class='pln'><span class='str'> This line was generated.</span><span class='strut'> </span></p> -<p id='t1504' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t1505' class='pln'><span class='str'> This line was not.</span><span class='strut'> </span></p> -<p id='t1506' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1507' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t1508' class='pln'><span class='strut'> </span></p> -<p id='t1509' 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='t1510' class='pln'> <span class='com'># Remove generated output.</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'>'-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='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'>'cog1.txt'</span><span class='op'>,</span> <span class='str'>'cog1.out'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t1513' 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='t1514' class='pln'> <span class='com'># Regenerate the generated output.</span><span class='strut'> </span></p> -<p id='t1515' 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='t1516' 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='t1517' 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='t1518' class='pln'> <span class='com'># Remove the generated output again.</span><span class='strut'> </span></p> -<p id='t1519' 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='t1520' 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='t1521' class='pln'><span class='strut'> </span></p> -<p id='t1522' 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='t1523' class='stm mis'> <span class='nam'>infile</span> <span class='op'>=</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1524' class='pln'><span class='str'> #[[[cog</span><span class='strut'> </span></p> -<p id='t1525' class='pln'><span class='str'> cog.msg("Hello there!")</span><span class='strut'> </span></p> -<p id='t1526' class='pln'><span class='str'> #]]]</span><span class='strut'> </span></p> -<p id='t1527' class='pln'><span class='str'> #[[[end]]]</span><span class='strut'> </span></p> -<p id='t1528' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t1529' 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='t1530' 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='t1531' 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='t1532' 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='t1533' class='pln'><span class='strut'> </span></p> -<p id='t1534' 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='t1535' 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='t1536' class='pln'><span class='strut'> </span></p> -<p id='t1537' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t1538' class='pln'> <span class='str'>'cog1.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1539' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1540' class='pln'><span class='str'> cog.outl("This line was newly")</span><span class='strut'> </span></p> -<p id='t1541' class='pln'><span class='str'> cog.outl("generated by cog")</span><span class='strut'> </span></p> -<p id='t1542' class='pln'><span class='str'> cog.outl("blah blah.")</span><span class='strut'> </span></p> -<p id='t1543' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1544' class='pln'><span class='str'> Xhis line was newly</span><span class='strut'> </span></p> -<p id='t1545' class='pln'><span class='str'> generated by cog</span><span class='strut'> </span></p> -<p id='t1546' class='pln'><span class='str'> blah blah.</span><span class='strut'> </span></p> -<p id='t1547' class='pln'><span class='str'> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class='strut'> </span></p> -<p id='t1548' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1549' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t1550' class='pln'><span class='strut'> </span></p> -<p id='t1551' 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='t1552' class='stm mis'> <span class='nam'>stderr</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='t1553' 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='t1554' 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='t1555' 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='t1556' 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='t1557' 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='t1558' class='pln'><span class='strut'> </span></p> -<p id='t1559' 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='t1560' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t1561' class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1562' class='pln'><span class='str'> --[[[cog cog.outl("Defined fooey as " + fooey) ]]]</span><span class='strut'> </span></p> -<p id='t1563' class='pln'><span class='str'> --[[[end]]]</span><span class='strut'> </span></p> -<p id='t1564' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1565' class='pln'><span class='strut'> </span></p> -<p id='t1566' class='pln'> <span class='str'>'test.kablooey'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1567' class='pln'><span class='str'> --[[[cog cog.outl("Defined fooey as " + fooey) ]]]</span><span class='strut'> </span></p> -<p id='t1568' class='pln'><span class='str'> Defined fooey as kablooey</span><span class='strut'> </span></p> -<p id='t1569' class='pln'><span class='str'> --[[[end]]]</span><span class='strut'> </span></p> -<p id='t1570' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1571' class='pln'><span class='strut'> </span></p> -<p id='t1572' class='pln'> <span class='str'>'test.einstein'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1573' class='pln'><span class='str'> --[[[cog cog.outl("Defined fooey as " + fooey) ]]]</span><span class='strut'> </span></p> -<p id='t1574' class='pln'><span class='str'> Defined fooey as e=mc2</span><span class='strut'> </span></p> -<p id='t1575' class='pln'><span class='str'> --[[[end]]]</span><span class='strut'> </span></p> -<p id='t1576' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1577' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t1578' class='pln'><span class='strut'> </span></p> -<p id='t1579' 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='t1580' 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='t1581' 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='t1582' 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='t1583' 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='t1584' 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='t1585' 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='t1586' 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='t1587' 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='t1588' 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='t1589' 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='t1590' 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='t1591' 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='t1592' 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='t1593' 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='t1594' 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='t1595' 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='t1596' 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='t1597' class='pln'><span class='strut'> </span></p> -<p id='t1598' 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='t1599' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t1600' class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1601' class='pln'><span class='str'> --[[[cog cog.outl('Hey there!') ]]]</span><span class='strut'> </span></p> -<p id='t1602' class='pln'><span class='str'> --[[[end]]]</span><span class='strut'> </span></p> -<p id='t1603' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t1604' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t1605' class='pln'><span class='strut'> </span></p> -<p id='t1606' 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='t1607' class='stm mis'> <span class='nam'>stderr</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='t1608' 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='t1609' 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='t1610' 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='t1611' 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='t1612' 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='t1613' 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='t1614' class='pln'><span class='strut'> </span></p> -<p id='t1615' 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='t1616' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t1617' class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1618' class='pln'><span class='str'> Hey there.</span><span class='strut'> </span></p> -<p id='t1619' class='pln'><span class='str'> ;[[[cog cog.outl('a\\nb\\n \\nc') ]]]</span><span class='strut'> </span></p> -<p id='t1620' class='pln'><span class='str'> ;[[[end]]]</span><span class='strut'> </span></p> -<p id='t1621' class='pln'><span class='str'> Good bye.</span><span class='strut'> </span></p> -<p id='t1622' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1623' class='pln'><span class='strut'> </span></p> -<p id='t1624' class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1625' class='pln'><span class='str'> Hey there.</span><span class='strut'> </span></p> -<p id='t1626' class='pln'><span class='str'> ;[[[cog cog.outl('a\\nb\\n \\nc') ]]]</span><span class='strut'> </span></p> -<p id='t1627' class='pln'><span class='str'> a (foo)</span><span class='strut'> </span></p> -<p id='t1628' class='pln'><span class='str'> b (foo)</span><span class='strut'> </span></p> -<p id='t1629' class='pln'><span class='str'> </span><span class='strut'> </span></p> -<p id='t1630' class='pln'><span class='str'> c (foo)</span><span class='strut'> </span></p> -<p id='t1631' class='pln'><span class='str'> ;[[[end]]]</span><span class='strut'> </span></p> -<p id='t1632' class='pln'><span class='str'> Good bye.</span><span class='strut'> </span></p> -<p id='t1633' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1634' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t1635' class='pln'><span class='strut'> </span></p> -<p id='t1636' 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='t1637' 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='t1638' 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='t1639' class='pln'><span class='strut'> </span></p> -<p id='t1640' 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='t1641' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t1642' class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1643' class='pln'><span class='str'> ;[[[cog cog.outl('a\\nb\\nc') ]]]</span><span class='strut'> </span></p> -<p id='t1644' class='pln'><span class='str'> ;[[[end]]]</span><span class='strut'> </span></p> -<p id='t1645' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1646' class='pln'><span class='strut'> </span></p> -<p id='t1647' class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1648' class='pln'><span class='str'> ;[[[cog cog.outl('a\\nb\\nc') ]]]</span><span class='strut'> </span></p> -<p id='t1649' class='pln'><span class='str'> a</span><span class='strut'> </span></p> -<p id='t1650' class='pln'><span class='str'> b</span><span class='strut'> </span></p> -<p id='t1651' class='pln'><span class='str'> c</span><span class='strut'> </span></p> -<p id='t1652' class='pln'><span class='str'> ;[[[end]]]</span><span class='strut'> </span></p> -<p id='t1653' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1654' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t1655' class='pln'><span class='strut'> </span></p> -<p id='t1656' 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='t1657' 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='t1658' 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='t1659' class='pln'><span class='strut'> </span></p> -<p id='t1660' 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='t1661' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t1662' class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1663' class='pln'><span class='str'> ;[[[cog cog.outl('a\\n\\nb') ]]]</span><span class='strut'> </span></p> -<p id='t1664' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1665' class='pln'><span class='strut'> </span></p> -<p id='t1666' class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1667' class='pln'><span class='str'> ;[[[cog cog.outl('a\\n\\nb') ]]]</span><span class='strut'> </span></p> -<p id='t1668' class='pln'><span class='str'> a /\\n*+([)]><</span><span class='strut'> </span></p> -<p id='t1669' class='pln'><span class='str'> </span><span class='strut'> </span></p> -<p id='t1670' class='pln'><span class='str'> b /\\n*+([)]><</span><span class='strut'> </span></p> -<p id='t1671' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1672' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t1673' class='pln'><span class='strut'> </span></p> -<p id='t1674' 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='t1675' 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='t1676' 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='t1677' class='pln'><span class='strut'> </span></p> -<p id='t1678' 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='t1679' class='pln'><span class='strut'> </span></p> -<p id='t1680' 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='t1681' class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1682' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1683' class='pln'><span class='str'> for fn in ['DoSomething', 'DoAnotherThing', 'DoLastThing']:</span><span class='strut'> </span></p> -<p id='t1684' class='pln'><span class='str'> cog.outl("void %s();" % fn)</span><span class='strut'> </span></p> -<p id='t1685' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1686' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t1687' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1688' class='pln'><span class='strut'> </span></p> -<p id='t1689' class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1690' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1691' class='pln'><span class='str'> for fn in ['DoSomething', 'DoAnotherThing', 'DoLastThing']:</span><span class='strut'> </span></p> -<p id='t1692' class='pln'><span class='str'> cog.outl("void %s();" % fn)</span><span class='strut'> </span></p> -<p id='t1693' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1694' class='pln'><span class='str'> void DoSomething();</span><span class='strut'> </span></p> -<p id='t1695' class='pln'><span class='str'> void DoAnotherThing();</span><span class='strut'> </span></p> -<p id='t1696' class='pln'><span class='str'> void DoLastThing();</span><span class='strut'> </span></p> -<p id='t1697' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t1698' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1699' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t1700' class='pln'><span class='strut'> </span></p> -<p id='t1701' 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='t1702' class='pln'> <span class='com'># for Windows</span><span class='strut'> </span></p> -<p id='t1703' 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='t1704' 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='t1705' 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='t1706' class='pln'> <span class='com'># for unix-like</span><span class='strut'> </span></p> -<p id='t1707' 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='t1708' 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='t1709' class='pln'><span class='strut'> </span></p> -<p id='t1710' 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='t1711' 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='t1712' 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='t1713' class='stm mis'> <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'>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'>tempdir</span><span class='op'>,</span> <span class='str'>'test.cog'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t1714' 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'>testcog</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='t1715' 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='t1716' class='pln'><span class='strut'> </span></p> -<p id='t1717' 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='t1718' 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'>testcog</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='t1719' 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='t1720' class='pln'><span class='strut'> </span></p> -<p id='t1721' 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='t1722' 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='t1723' 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='t1724' 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='t1725' 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='t1726' class='pln'><span class='strut'> </span></p> -<p id='t1727' 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='t1728' 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='t1729' 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='t1730' 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='t1731' class='pln'><span class='strut'> </span></p> -<p id='t1732' 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='t1733' 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='t1734' 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='t1735' 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='t1736' class='pln'><span class='strut'> </span></p> -<p id='t1737' 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='t1738' 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='t1739' 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='t1740' 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='t1741' 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='t1742' class='pln'><span class='strut'> </span></p> -<p id='t1743' 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='t1744' class='pln'><span class='strut'> </span></p> -<p id='t1745' 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='t1746' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t1747' class='pln'> <span class='str'>'cog1.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1748' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1749' class='pln'><span class='str'> cog.outl("This line was generated.")</span><span class='strut'> </span></p> -<p id='t1750' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1751' class='pln'><span class='str'> This line was generated.</span><span class='strut'> </span></p> -<p id='t1752' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t1753' class='pln'><span class='str'> This line was not.</span><span class='strut'> </span></p> -<p id='t1754' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1755' class='pln'><span class='strut'> </span></p> -<p id='t1756' class='pln'> <span class='str'>'cog1.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1757' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1758' class='pln'><span class='str'> cog.outl("This line was generated.")</span><span class='strut'> </span></p> -<p id='t1759' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1760' class='pln'><span class='str'> This line was generated.</span><span class='strut'> </span></p> -<p id='t1761' class='pln'><span class='str'> //[[[end]]] (checksum: 8adb13fb59b996a1c7f0065ea9f3d893)</span><span class='strut'> </span></p> -<p id='t1762' class='pln'><span class='str'> This line was not.</span><span class='strut'> </span></p> -<p id='t1763' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1764' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t1765' class='pln'><span class='strut'> </span></p> -<p id='t1766' 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='t1767' 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='t1768' 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='t1769' class='pln'><span class='strut'> </span></p> -<p id='t1770' 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='t1771' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t1772' class='pln'> <span class='str'>'cog1.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1773' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1774' class='pln'><span class='str'> cog.outl("This line was newly")</span><span class='strut'> </span></p> -<p id='t1775' class='pln'><span class='str'> cog.outl("generated by cog")</span><span class='strut'> </span></p> -<p id='t1776' class='pln'><span class='str'> cog.outl("blah blah.")</span><span class='strut'> </span></p> -<p id='t1777' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1778' class='pln'><span class='str'> This line was generated.</span><span class='strut'> </span></p> -<p id='t1779' class='pln'><span class='str'> //[[[end]]] (checksum: 8adb13fb59b996a1c7f0065ea9f3d893)</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'>'cog1.out'</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'> This line was newly</span><span class='strut'> </span></p> -<p id='t1789' class='pln'><span class='str'> generated by cog</span><span class='strut'> </span></p> -<p id='t1790' class='pln'><span class='str'> blah blah.</span><span class='strut'> </span></p> -<p id='t1791' class='pln'><span class='str'> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class='strut'> </span></p> -<p id='t1792' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1793' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t1794' class='pln'><span class='strut'> </span></p> -<p id='t1795' 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='t1796' 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='t1797' 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='t1798' class='pln'><span class='strut'> </span></p> -<p id='t1799' 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='t1800' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t1801' class='pln'> <span class='str'>'cog1.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1802' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1803' class='pln'><span class='str'> cog.outl("This line was newly")</span><span class='strut'> </span></p> -<p id='t1804' class='pln'><span class='str'> cog.outl("generated by cog")</span><span class='strut'> </span></p> -<p id='t1805' class='pln'><span class='str'> cog.outl("blah blah.")</span><span class='strut'> </span></p> -<p id='t1806' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1807' class='pln'><span class='str'> This line was generated.</span><span class='strut'> </span></p> -<p id='t1808' class='pln'><span class='str'> //[[[end]]] (checksum: 8adb13fb59b996a1c7f0065ea9f3d893) fooey</span><span class='strut'> </span></p> -<p id='t1809' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1810' class='pln'><span class='strut'> </span></p> -<p id='t1811' class='pln'> <span class='str'>'cog1.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1812' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1813' class='pln'><span class='str'> cog.outl("This line was newly")</span><span class='strut'> </span></p> -<p id='t1814' class='pln'><span class='str'> cog.outl("generated by cog")</span><span class='strut'> </span></p> -<p id='t1815' class='pln'><span class='str'> cog.outl("blah blah.")</span><span class='strut'> </span></p> -<p id='t1816' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1817' class='pln'><span class='str'> This line was newly</span><span class='strut'> </span></p> -<p id='t1818' class='pln'><span class='str'> generated by cog</span><span class='strut'> </span></p> -<p id='t1819' class='pln'><span class='str'> blah blah.</span><span class='strut'> </span></p> -<p id='t1820' class='pln'><span class='str'> //[[[end]]] fooey</span><span class='strut'> </span></p> -<p id='t1821' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1822' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t1823' class='pln'><span class='strut'> </span></p> -<p id='t1824' 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='t1825' 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='t1826' 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='t1827' class='pln'><span class='strut'> </span></p> -<p id='t1828' 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='t1829' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t1830' class='pln'> <span class='str'>'cog1.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1831' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1832' class='pln'><span class='str'> cog.outl("This line was newly")</span><span class='strut'> </span></p> -<p id='t1833' class='pln'><span class='str'> cog.outl("generated by cog")</span><span class='strut'> </span></p> -<p id='t1834' class='pln'><span class='str'> cog.outl("blah blah.")</span><span class='strut'> </span></p> -<p id='t1835' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1836' class='pln'><span class='str'> Xhis line was newly</span><span class='strut'> </span></p> -<p id='t1837' class='pln'><span class='str'> generated by cog</span><span class='strut'> </span></p> -<p id='t1838' class='pln'><span class='str'> blah blah.</span><span class='strut'> </span></p> -<p id='t1839' class='pln'><span class='str'> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class='strut'> </span></p> -<p id='t1840' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1841' class='pln'><span class='strut'> </span></p> -<p id='t1842' class='pln'> <span class='str'>'cog2.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1843' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1844' class='pln'><span class='str'> cog.outl("This line was newly")</span><span class='strut'> </span></p> -<p id='t1845' class='pln'><span class='str'> cog.outl("generated by cog")</span><span class='strut'> </span></p> -<p id='t1846' class='pln'><span class='str'> cog.outl("blah blah.")</span><span class='strut'> </span></p> -<p id='t1847' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1848' class='pln'><span class='str'> This line was newly</span><span class='strut'> </span></p> -<p id='t1849' class='pln'><span class='str'> generated by cog</span><span class='strut'> </span></p> -<p id='t1850' class='pln'><span class='str'> blah blah!</span><span class='strut'> </span></p> -<p id='t1851' class='pln'><span class='str'> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class='strut'> </span></p> -<p id='t1852' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1853' class='pln'><span class='strut'> </span></p> -<p id='t1854' class='pln'> <span class='str'>'cog3.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1855' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1856' class='pln'><span class='str'> cog.outl("This line was newly")</span><span class='strut'> </span></p> -<p id='t1857' class='pln'><span class='str'> cog.outl("generated by cog")</span><span class='strut'> </span></p> -<p id='t1858' class='pln'><span class='str'> cog.outl("blah blah.")</span><span class='strut'> </span></p> -<p id='t1859' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1860' class='pln'><span class='str'> </span><span class='strut'> </span></p> -<p id='t1861' class='pln'><span class='str'> This line was newly</span><span class='strut'> </span></p> -<p id='t1862' class='pln'><span class='str'> generated by cog</span><span class='strut'> </span></p> -<p id='t1863' class='pln'><span class='str'> blah blah.</span><span class='strut'> </span></p> -<p id='t1864' class='pln'><span class='str'> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class='strut'> </span></p> -<p id='t1865' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1866' class='pln'><span class='strut'> </span></p> -<p id='t1867' class='pln'> <span class='str'>'cog4.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1868' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1869' class='pln'><span class='str'> cog.outl("This line was newly")</span><span class='strut'> </span></p> -<p id='t1870' class='pln'><span class='str'> cog.outl("generated by cog")</span><span class='strut'> </span></p> -<p id='t1871' class='pln'><span class='str'> cog.outl("blah blah.")</span><span class='strut'> </span></p> -<p id='t1872' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1873' class='pln'><span class='str'> This line was newly</span><span class='strut'> </span></p> -<p id='t1874' class='pln'><span class='str'> generated by cog</span><span class='strut'> </span></p> -<p id='t1875' class='pln'><span class='str'> blah blah..</span><span class='strut'> </span></p> -<p id='t1876' class='pln'><span class='str'> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class='strut'> </span></p> -<p id='t1877' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1878' class='pln'><span class='strut'> </span></p> -<p id='t1879' class='pln'> <span class='str'>'cog5.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1880' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1881' class='pln'><span class='str'> cog.outl("This line was newly")</span><span class='strut'> </span></p> -<p id='t1882' class='pln'><span class='str'> cog.outl("generated by cog")</span><span class='strut'> </span></p> -<p id='t1883' class='pln'><span class='str'> cog.outl("blah blah.")</span><span class='strut'> </span></p> -<p id='t1884' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1885' class='pln'><span class='str'> This line was newly</span><span class='strut'> </span></p> -<p id='t1886' class='pln'><span class='str'> generated by cog</span><span class='strut'> </span></p> -<p id='t1887' class='pln'><span class='str'> blah blah.</span><span class='strut'> </span></p> -<p id='t1888' class='pln'><span class='str'> extra</span><span class='strut'> </span></p> -<p id='t1889' class='pln'><span class='str'> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class='strut'> </span></p> -<p id='t1890' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1891' class='pln'><span class='strut'> </span></p> -<p id='t1892' class='pln'> <span class='str'>'cog6.txt'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1893' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1894' class='pln'><span class='str'> cog.outl("This line was newly")</span><span class='strut'> </span></p> -<p id='t1895' class='pln'><span class='str'> cog.outl("generated by cog")</span><span class='strut'> </span></p> -<p id='t1896' class='pln'><span class='str'> cog.outl("blah blah.")</span><span class='strut'> </span></p> -<p id='t1897' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1898' class='pln'><span class='str'> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class='strut'> </span></p> -<p id='t1899' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1900' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t1901' class='pln'><span class='strut'> </span></p> -<p id='t1902' 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='t1903' 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='t1904' 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='t1905' 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='t1906' 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='t1907' 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='t1908' 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='t1909' 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='t1910' 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='t1911' 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='t1912' 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='t1913' 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='t1914' 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='t1915' 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='t1916' 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='t1917' 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='t1918' 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='t1919' 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='t1920' 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='t1921' class='pln'><span class='strut'> </span></p> -<p id='t1922' class='stm run hide_run'> <span class='key'>def</span> <span class='nam'>testArgvIsntModified</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='t1923' 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='str'>'-v'</span><span class='op'>]</span><span class='strut'> </span></p> -<p id='t1924' class='stm mis'> <span class='nam'>orig_argv</span> <span class='op'>=</span> <span class='nam'>argv</span><span class='op'>[</span><span class='op'>:</span><span class='op'>]</span><span class='strut'> </span></p> -<p id='t1925' 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='nam'>argv</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t1926' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>argv</span><span class='op'>,</span> <span class='nam'>orig_argv</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t1927' class='pln'><span class='strut'> </span></p> -<p id='t1928' 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='t1929' class='pln'><span class='strut'> </span></p> -<p id='t1930' class='pln'> <span class='com'># Blake Winton's contributions. </span><span class='strut'> </span></p> -<p id='t1931' 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='t1932' class='pln'> <span class='com'># -o sets the output file.</span><span class='strut'> </span></p> -<p id='t1933' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t1934' class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1935' class='pln'><span class='str'> // This is my C++ file.</span><span class='strut'> </span></p> -<p id='t1936' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1937' class='pln'><span class='str'> fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing']</span><span class='strut'> </span></p> -<p id='t1938' class='pln'><span class='str'> for fn in fnames:</span><span class='strut'> </span></p> -<p id='t1939' class='pln'><span class='str'> cog.outl("void %s();" % fn)</span><span class='strut'> </span></p> -<p id='t1940' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1941' class='pln'><span class='str'> Some Sample Code Here</span><span class='strut'> </span></p> -<p id='t1942' class='pln'><span class='str'> //[[[end]]]Data Data</span><span class='strut'> </span></p> -<p id='t1943' class='pln'><span class='str'> And Some More</span><span class='strut'> </span></p> -<p id='t1944' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1945' class='pln'><span class='strut'> </span></p> -<p id='t1946' class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1947' class='pln'><span class='str'> // This is my C++ file.</span><span class='strut'> </span></p> -<p id='t1948' class='pln'><span class='str'> void DoSomething();</span><span class='strut'> </span></p> -<p id='t1949' class='pln'><span class='str'> void DoAnotherThing();</span><span class='strut'> </span></p> -<p id='t1950' class='pln'><span class='str'> void DoLastThing();</span><span class='strut'> </span></p> -<p id='t1951' class='pln'><span class='str'> And Some More</span><span class='strut'> </span></p> -<p id='t1952' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1953' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t1954' class='pln'><span class='strut'> </span></p> -<p id='t1955' 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='t1956' 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='t1957' 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='t1958' class='pln'><span class='strut'> </span></p> -<p id='t1959' 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='t1960' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t1961' class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1962' class='pln'><span class='str'> // This is my C++ file.</span><span class='strut'> </span></p> -<p id='t1963' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t1964' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t1965' class='pln'><span class='strut'> </span></p> -<p id='t1966' 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='t1967' 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='t1968' class='pln'><span class='strut'> </span></p> -<p id='t1969' 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='t1970' 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='t1971' class='pln'> <span class='com'># processFile().</span><span class='strut'> </span></p> -<p id='t1972' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t1973' class='pln'> <span class='str'>'test.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1974' class='pln'><span class='str'> // This is my C++ file.</span><span class='strut'> </span></p> -<p id='t1975' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t1976' class='pln'><span class='str'> for fn in fnames:</span><span class='strut'> </span></p> -<p id='t1977' class='pln'><span class='str'> cog.outl("void %s();" % fn)</span><span class='strut'> </span></p> -<p id='t1978' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t1979' class='pln'><span class='str'> Some Sample Code Here</span><span class='strut'> </span></p> -<p id='t1980' class='pln'><span class='str'> //[[[end]]]"""</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1981' class='pln'><span class='strut'> </span></p> -<p id='t1982' class='pln'> <span class='str'>'test.out'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t1983' class='pln'><span class='str'> // This is my C++ file.</span><span class='strut'> </span></p> -<p id='t1984' class='pln'><span class='str'> void DoBlake();</span><span class='strut'> </span></p> -<p id='t1985' class='pln'><span class='str'> void DoWinton();</span><span class='strut'> </span></p> -<p id='t1986' class='pln'><span class='str'> void DoContribution();</span><span class='strut'> </span></p> -<p id='t1987' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t1988' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t1989' class='pln'><span class='strut'> </span></p> -<p id='t1990' 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='t1991' 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='t1992' 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='t1993' 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='t1994' 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='t1995' 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='t1996' class='pln'><span class='strut'> </span></p> -<p id='t1997' 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='t1998' class='pln'><span class='strut'> </span></p> -<p id='t1999' 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='t2000' class='pln'> <span class='com'># Test that cog.error() doesn't show a traceback.</span><span class='strut'> </span></p> -<p id='t2001' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t2002' class='pln'> <span class='str'>'error.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t2003' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t2004' class='pln'><span class='str'> cog.error("Something Bad!")</span><span class='strut'> </span></p> -<p id='t2005' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t2006' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t2007' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t2008' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t2009' class='pln'><span class='strut'> </span></p> -<p id='t2010' 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='t2011' 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='t2012' 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='t2013' 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='t2014' class='pln'><span class='strut'> </span></p> -<p id='t2015' 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='t2016' class='pln'> <span class='com'># Test that a genuine error does show a traceback.</span><span class='strut'> </span></p> -<p id='t2017' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t2018' class='pln'> <span class='str'>'error.cog'</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t2019' class='pln'><span class='str'> //[[[cog</span><span class='strut'> </span></p> -<p id='t2020' class='pln'><span class='str'> raise RuntimeError("Hey!")</span><span class='strut'> </span></p> -<p id='t2021' class='pln'><span class='str'> //]]]</span><span class='strut'> </span></p> -<p id='t2022' class='pln'><span class='str'> //[[[end]]]</span><span class='strut'> </span></p> -<p id='t2023' class='pln'><span class='str'> """</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t2024' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t2025' class='pln'><span class='strut'> </span></p> -<p id='t2026' 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='t2027' 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='t2028' 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='t2029' 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='t2030' 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='t2031' 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='t2032' class='pln'><span class='strut'> </span></p> -<p id='t2033' class='pln'><span class='strut'> </span></p> -<p id='t2034' 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='t2035' 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='t2036' class='pln'><span class='strut'> </span></p> -<p id='t2037' class='pln'><span class='com'># Things not yet tested:</span><span class='strut'> </span></p> -<p id='t2038' class='pln'><span class='com'># - A bad -w command (currently fails silently).</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.7.1</a> - </p> - </div> -</div> - -</body> -</html> diff --git a/doc/sample_html/cogapp_test_cogapp_py.html b/doc/sample_html/cogapp_test_cogapp_py.html new file mode 100644 index 00000000..d6ee3711 --- /dev/null +++ b/doc/sample_html/cogapp_test_cogapp_py.html @@ -0,0 +1,4535 @@ + + + +<!DOCTYPE html> +<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 cogapp/test_cogapp.py: 30.99%</title> + <link rel="stylesheet" href="style.css" type="text/css"> + + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> + jQuery(document).ready(coverage.pyfile_ready); + </script> +</head> +<body class="pyfile"> + +<div id="header"> + <div class="content"> + <h1>Coverage for <b>cogapp/test_cogapp.py</b> : + <span class="pc_cov">30.99%</span> + </h1> + + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> + + <h2 class="stats"> + 704 statements + <span class="run hide_run shortkey_r button_toggle_run">218 run</span> + <span class="mis shortkey_m button_toggle_mis">486 missing</span> + <span class="exc shortkey_x button_toggle_exc">6 excluded</span> + + + <span class="par run hide_run shortkey_p button_toggle_par">0 partial</span> + + </h2> + </div> +</div> + +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> + <div> +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays + </p> +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk + </p> +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page + </p> +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk + </p> + </div> +</div> + +<div id="source"> + <table> + <tr> + <td class="linenos"> +<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="pln"><a href="#n4">4</a></p> +<p id="n5" class="pln"><a href="#n5">5</a></p> +<p id="n6" class="pln"><a href="#n6">6</a></p> +<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p> +<p id="n8" class="pln"><a href="#n8">8</a></p> +<p id="n9" class="stm run hide_run"><a href="#n9">9</a></p> +<p id="n10" class="pln"><a href="#n10">10</a></p> +<p id="n11" class="pln"><a href="#n11">11</a></p> +<p id="n12" class="pln"><a href="#n12">12</a></p> +<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p> +<p id="n14" class="stm 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="stm run hide_run"><a href="#n16">16</a></p> +<p id="n17" class="pln"><a href="#n17">17</a></p> +<p id="n18" class="stm run hide_run"><a href="#n18">18</a></p> +<p id="n19" class="stm run hide_run"><a href="#n19">19</a></p> +<p id="n20" class="stm run hide_run"><a href="#n20">20</a></p> +<p id="n21" class="stm 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="pln"><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="pln"><a href="#n28">28</a></p> +<p id="n29" class="stm run hide_run"><a href="#n29">29</a></p> +<p id="n30" class="pln"><a href="#n30">30</a></p> +<p id="n31" class="pln"><a href="#n31">31</a></p> +<p id="n32" class="pln"><a href="#n32">32</a></p> +<p id="n33" class="stm run hide_run"><a href="#n33">33</a></p> +<p id="n34" class="stm run hide_run"><a href="#n34">34</a></p> +<p id="n35" class="pln"><a href="#n35">35</a></p> +<p id="n36" class="pln"><a href="#n36">36</a></p> +<p id="n37" class="pln"><a href="#n37">37</a></p> +<p id="n38" class="pln"><a href="#n38">38</a></p> +<p id="n39" class="pln"><a href="#n39">39</a></p> +<p id="n40" class="pln"><a href="#n40">40</a></p> +<p id="n41" class="pln"><a href="#n41">41</a></p> +<p id="n42" class="stm run hide_run"><a href="#n42">42</a></p> +<p id="n43" class="stm run hide_run"><a href="#n43">43</a></p> +<p id="n44" class="pln"><a href="#n44">44</a></p> +<p id="n45" class="stm run hide_run"><a href="#n45">45</a></p> +<p id="n46" class="stm run hide_run"><a href="#n46">46</a></p> +<p id="n47" class="pln"><a href="#n47">47</a></p> +<p id="n48" class="pln"><a href="#n48">48</a></p> +<p id="n49" class="pln"><a href="#n49">49</a></p> +<p id="n50" class="pln"><a href="#n50">50</a></p> +<p id="n51" class="pln"><a href="#n51">51</a></p> +<p id="n52" class="pln"><a href="#n52">52</a></p> +<p id="n53" class="pln"><a href="#n53">53</a></p> +<p id="n54" class="pln"><a href="#n54">54</a></p> +<p id="n55" class="pln"><a href="#n55">55</a></p> +<p id="n56" class="pln"><a href="#n56">56</a></p> +<p id="n57" class="pln"><a href="#n57">57</a></p> +<p id="n58" class="stm run hide_run"><a href="#n58">58</a></p> +<p id="n59" class="pln"><a href="#n59">59</a></p> +<p id="n60" class="pln"><a href="#n60">60</a></p> +<p id="n61" class="pln"><a href="#n61">61</a></p> +<p id="n62" class="pln"><a href="#n62">62</a></p> +<p id="n63" class="pln"><a href="#n63">63</a></p> +<p id="n64" class="pln"><a href="#n64">64</a></p> +<p id="n65" class="pln"><a href="#n65">65</a></p> +<p id="n66" class="pln"><a href="#n66">66</a></p> +<p id="n67" class="pln"><a href="#n67">67</a></p> +<p id="n68" class="pln"><a href="#n68">68</a></p> +<p id="n69" class="pln"><a href="#n69">69</a></p> +<p id="n70" class="pln"><a href="#n70">70</a></p> +<p id="n71" class="pln"><a href="#n71">71</a></p> +<p id="n72" class="stm run hide_run"><a href="#n72">72</a></p> +<p id="n73" class="pln"><a href="#n73">73</a></p> +<p id="n74" class="stm run hide_run"><a href="#n74">74</a></p> +<p id="n75" class="pln"><a href="#n75">75</a></p> +<p id="n76" class="pln"><a href="#n76">76</a></p> +<p id="n77" class="stm run hide_run"><a href="#n77">77</a></p> +<p id="n78" class="pln"><a href="#n78">78</a></p> +<p id="n79" class="pln"><a href="#n79">79</a></p> +<p id="n80" class="pln"><a href="#n80">80</a></p> +<p id="n81" class="pln"><a href="#n81">81</a></p> +<p id="n82" class="pln"><a href="#n82">82</a></p> +<p id="n83" class="pln"><a href="#n83">83</a></p> +<p id="n84" class="pln"><a href="#n84">84</a></p> +<p id="n85" class="stm run hide_run"><a href="#n85">85</a></p> +<p id="n86" class="stm run hide_run"><a href="#n86">86</a></p> +<p id="n87" class="pln"><a href="#n87">87</a></p> +<p id="n88" class="stm run hide_run"><a href="#n88">88</a></p> +<p id="n89" class="pln"><a href="#n89">89</a></p> +<p id="n90" class="stm run hide_run"><a href="#n90">90</a></p> +<p id="n91" class="pln"><a href="#n91">91</a></p> +<p id="n92" class="pln"><a href="#n92">92</a></p> +<p id="n93" class="pln"><a href="#n93">93</a></p> +<p id="n94" class="pln"><a href="#n94">94</a></p> +<p id="n95" class="pln"><a href="#n95">95</a></p> +<p id="n96" class="pln"><a href="#n96">96</a></p> +<p id="n97" class="pln"><a href="#n97">97</a></p> +<p id="n98" class="pln"><a href="#n98">98</a></p> +<p id="n99" class="pln"><a href="#n99">99</a></p> +<p id="n100" class="pln"><a href="#n100">100</a></p> +<p id="n101" class="pln"><a href="#n101">101</a></p> +<p id="n102" class="pln"><a href="#n102">102</a></p> +<p id="n103" class="pln"><a href="#n103">103</a></p> +<p id="n104" class="pln"><a href="#n104">104</a></p> +<p id="n105" class="pln"><a href="#n105">105</a></p> +<p id="n106" class="pln"><a href="#n106">106</a></p> +<p id="n107" class="pln"><a href="#n107">107</a></p> +<p id="n108" class="pln"><a href="#n108">108</a></p> +<p id="n109" class="stm run hide_run"><a href="#n109">109</a></p> +<p id="n110" class="stm run hide_run"><a href="#n110">110</a></p> +<p id="n111" class="pln"><a href="#n111">111</a></p> +<p id="n112" class="stm run hide_run"><a href="#n112">112</a></p> +<p id="n113" class="stm run hide_run"><a href="#n113">113</a></p> +<p id="n114" class="pln"><a href="#n114">114</a></p> +<p id="n115" class="pln"><a href="#n115">115</a></p> +<p id="n116" class="pln"><a href="#n116">116</a></p> +<p id="n117" class="pln"><a href="#n117">117</a></p> +<p id="n118" class="pln"><a href="#n118">118</a></p> +<p id="n119" class="pln"><a href="#n119">119</a></p> +<p id="n120" class="pln"><a href="#n120">120</a></p> +<p id="n121" class="pln"><a href="#n121">121</a></p> +<p id="n122" class="pln"><a href="#n122">122</a></p> +<p id="n123" class="pln"><a href="#n123">123</a></p> +<p id="n124" class="pln"><a href="#n124">124</a></p> +<p id="n125" class="pln"><a href="#n125">125</a></p> +<p id="n126" class="pln"><a href="#n126">126</a></p> +<p id="n127" class="stm run hide_run"><a href="#n127">127</a></p> +<p id="n128" class="stm run hide_run"><a href="#n128">128</a></p> +<p id="n129" class="pln"><a href="#n129">129</a></p> +<p id="n130" class="stm run hide_run"><a href="#n130">130</a></p> +<p id="n131" class="stm run hide_run"><a href="#n131">131</a></p> +<p id="n132" class="pln"><a href="#n132">132</a></p> +<p id="n133" class="pln"><a href="#n133">133</a></p> +<p id="n134" class="pln"><a href="#n134">134</a></p> +<p id="n135" class="pln"><a href="#n135">135</a></p> +<p id="n136" class="pln"><a href="#n136">136</a></p> +<p id="n137" class="pln"><a href="#n137">137</a></p> +<p id="n138" class="pln"><a href="#n138">138</a></p> +<p id="n139" class="pln"><a href="#n139">139</a></p> +<p id="n140" class="pln"><a href="#n140">140</a></p> +<p id="n141" class="pln"><a href="#n141">141</a></p> +<p id="n142" class="pln"><a href="#n142">142</a></p> +<p id="n143" class="pln"><a href="#n143">143</a></p> +<p id="n144" class="pln"><a href="#n144">144</a></p> +<p id="n145" class="pln"><a href="#n145">145</a></p> +<p id="n146" class="stm run hide_run"><a href="#n146">146</a></p> +<p id="n147" class="stm run hide_run"><a href="#n147">147</a></p> +<p id="n148" class="pln"><a href="#n148">148</a></p> +<p id="n149" class="stm run hide_run"><a href="#n149">149</a></p> +<p id="n150" class="pln"><a href="#n150">150</a></p> +<p id="n151" class="pln"><a href="#n151">151</a></p> +<p id="n152" class="stm run hide_run"><a href="#n152">152</a></p> +<p id="n153" class="pln"><a href="#n153">153</a></p> +<p id="n154" class="pln"><a href="#n154">154</a></p> +<p id="n155" class="pln"><a href="#n155">155</a></p> +<p id="n156" class="pln"><a href="#n156">156</a></p> +<p id="n157" class="pln"><a href="#n157">157</a></p> +<p id="n158" class="pln"><a href="#n158">158</a></p> +<p id="n159" class="pln"><a href="#n159">159</a></p> +<p id="n160" class="pln"><a href="#n160">160</a></p> +<p id="n161" class="pln"><a href="#n161">161</a></p> +<p id="n162" class="pln"><a href="#n162">162</a></p> +<p id="n163" class="pln"><a href="#n163">163</a></p> +<p id="n164" class="stm run hide_run"><a href="#n164">164</a></p> +<p id="n165" class="stm run hide_run"><a href="#n165">165</a></p> +<p id="n166" class="pln"><a href="#n166">166</a></p> +<p id="n167" class="stm run hide_run"><a href="#n167">167</a></p> +<p id="n168" class="stm run hide_run"><a href="#n168">168</a></p> +<p id="n169" class="pln"><a href="#n169">169</a></p> +<p id="n170" class="pln"><a href="#n170">170</a></p> +<p id="n171" class="pln"><a href="#n171">171</a></p> +<p id="n172" class="pln"><a href="#n172">172</a></p> +<p id="n173" class="pln"><a href="#n173">173</a></p> +<p id="n174" class="pln"><a href="#n174">174</a></p> +<p id="n175" class="pln"><a href="#n175">175</a></p> +<p id="n176" class="pln"><a href="#n176">176</a></p> +<p id="n177" class="pln"><a href="#n177">177</a></p> +<p id="n178" class="pln"><a href="#n178">178</a></p> +<p id="n179" class="pln"><a href="#n179">179</a></p> +<p id="n180" class="pln"><a href="#n180">180</a></p> +<p id="n181" class="pln"><a href="#n181">181</a></p> +<p id="n182" class="stm run hide_run"><a href="#n182">182</a></p> +<p id="n183" class="stm run hide_run"><a href="#n183">183</a></p> +<p id="n184" class="pln"><a href="#n184">184</a></p> +<p id="n185" class="stm run hide_run"><a href="#n185">185</a></p> +<p id="n186" class="stm run hide_run"><a href="#n186">186</a></p> +<p id="n187" class="pln"><a href="#n187">187</a></p> +<p id="n188" class="pln"><a href="#n188">188</a></p> +<p id="n189" class="pln"><a href="#n189">189</a></p> +<p id="n190" class="pln"><a href="#n190">190</a></p> +<p id="n191" class="pln"><a href="#n191">191</a></p> +<p id="n192" class="pln"><a href="#n192">192</a></p> +<p id="n193" class="pln"><a href="#n193">193</a></p> +<p id="n194" class="pln"><a href="#n194">194</a></p> +<p id="n195" class="pln"><a href="#n195">195</a></p> +<p id="n196" class="pln"><a href="#n196">196</a></p> +<p id="n197" class="pln"><a href="#n197">197</a></p> +<p id="n198" class="stm run hide_run"><a href="#n198">198</a></p> +<p id="n199" class="stm run hide_run"><a href="#n199">199</a></p> +<p id="n200" class="pln"><a href="#n200">200</a></p> +<p id="n201" class="stm run hide_run"><a href="#n201">201</a></p> +<p id="n202" class="stm run hide_run"><a href="#n202">202</a></p> +<p id="n203" class="pln"><a href="#n203">203</a></p> +<p id="n204" class="pln"><a href="#n204">204</a></p> +<p id="n205" class="pln"><a href="#n205">205</a></p> +<p id="n206" class="pln"><a href="#n206">206</a></p> +<p id="n207" class="pln"><a href="#n207">207</a></p> +<p id="n208" class="pln"><a href="#n208">208</a></p> +<p id="n209" class="pln"><a href="#n209">209</a></p> +<p id="n210" class="pln"><a href="#n210">210</a></p> +<p id="n211" class="pln"><a href="#n211">211</a></p> +<p id="n212" class="pln"><a href="#n212">212</a></p> +<p id="n213" class="pln"><a href="#n213">213</a></p> +<p id="n214" class="pln"><a href="#n214">214</a></p> +<p id="n215" class="stm run hide_run"><a href="#n215">215</a></p> +<p id="n216" class="stm run hide_run"><a href="#n216">216</a></p> +<p id="n217" class="pln"><a href="#n217">217</a></p> +<p id="n218" class="stm run hide_run"><a href="#n218">218</a></p> +<p id="n219" class="stm run hide_run"><a href="#n219">219</a></p> +<p id="n220" class="pln"><a href="#n220">220</a></p> +<p id="n221" class="pln"><a href="#n221">221</a></p> +<p id="n222" class="pln"><a href="#n222">222</a></p> +<p id="n223" class="pln"><a href="#n223">223</a></p> +<p id="n224" class="pln"><a href="#n224">224</a></p> +<p id="n225" class="pln"><a href="#n225">225</a></p> +<p id="n226" class="pln"><a href="#n226">226</a></p> +<p id="n227" class="pln"><a href="#n227">227</a></p> +<p id="n228" class="pln"><a href="#n228">228</a></p> +<p id="n229" class="pln"><a href="#n229">229</a></p> +<p id="n230" class="pln"><a href="#n230">230</a></p> +<p id="n231" class="pln"><a href="#n231">231</a></p> +<p id="n232" class="pln"><a href="#n232">232</a></p> +<p id="n233" class="stm run hide_run"><a href="#n233">233</a></p> +<p id="n234" class="stm run hide_run"><a href="#n234">234</a></p> +<p id="n235" class="pln"><a href="#n235">235</a></p> +<p id="n236" class="stm run hide_run"><a href="#n236">236</a></p> +<p id="n237" class="pln"><a href="#n237">237</a></p> +<p id="n238" class="pln"><a href="#n238">238</a></p> +<p id="n239" class="stm run hide_run"><a href="#n239">239</a></p> +<p id="n240" class="pln"><a href="#n240">240</a></p> +<p id="n241" class="pln"><a href="#n241">241</a></p> +<p id="n242" class="pln"><a href="#n242">242</a></p> +<p id="n243" class="pln"><a href="#n243">243</a></p> +<p id="n244" class="pln"><a href="#n244">244</a></p> +<p id="n245" class="pln"><a href="#n245">245</a></p> +<p id="n246" class="pln"><a href="#n246">246</a></p> +<p id="n247" class="pln"><a href="#n247">247</a></p> +<p id="n248" class="pln"><a href="#n248">248</a></p> +<p id="n249" class="pln"><a href="#n249">249</a></p> +<p id="n250" class="pln"><a href="#n250">250</a></p> +<p id="n251" class="stm run hide_run"><a href="#n251">251</a></p> +<p id="n252" class="stm run hide_run"><a href="#n252">252</a></p> +<p id="n253" class="pln"><a href="#n253">253</a></p> +<p id="n254" class="stm run hide_run"><a href="#n254">254</a></p> +<p id="n255" class="pln"><a href="#n255">255</a></p> +<p id="n256" class="stm run hide_run"><a href="#n256">256</a></p> +<p id="n257" class="pln"><a href="#n257">257</a></p> +<p id="n258" class="pln"><a href="#n258">258</a></p> +<p id="n259" class="pln"><a href="#n259">259</a></p> +<p id="n260" class="pln"><a href="#n260">260</a></p> +<p id="n261" class="pln"><a href="#n261">261</a></p> +<p id="n262" class="pln"><a href="#n262">262</a></p> +<p id="n263" class="pln"><a href="#n263">263</a></p> +<p id="n264" class="pln"><a href="#n264">264</a></p> +<p id="n265" class="stm run hide_run"><a href="#n265">265</a></p> +<p id="n266" class="stm run hide_run"><a href="#n266">266</a></p> +<p id="n267" class="pln"><a href="#n267">267</a></p> +<p id="n268" class="stm run hide_run"><a href="#n268">268</a></p> +<p id="n269" class="pln"><a href="#n269">269</a></p> +<p id="n270" class="pln"><a href="#n270">270</a></p> +<p id="n271" class="pln"><a href="#n271">271</a></p> +<p id="n272" class="stm run hide_run"><a href="#n272">272</a></p> +<p id="n273" class="pln"><a href="#n273">273</a></p> +<p id="n274" class="pln"><a href="#n274">274</a></p> +<p id="n275" class="pln"><a href="#n275">275</a></p> +<p id="n276" class="pln"><a href="#n276">276</a></p> +<p id="n277" class="pln"><a href="#n277">277</a></p> +<p id="n278" class="pln"><a href="#n278">278</a></p> +<p id="n279" class="pln"><a href="#n279">279</a></p> +<p id="n280" class="pln"><a href="#n280">280</a></p> +<p id="n281" class="pln"><a href="#n281">281</a></p> +<p id="n282" class="pln"><a href="#n282">282</a></p> +<p id="n283" class="pln"><a href="#n283">283</a></p> +<p id="n284" class="pln"><a href="#n284">284</a></p> +<p id="n285" class="stm run hide_run"><a href="#n285">285</a></p> +<p id="n286" class="stm run hide_run"><a href="#n286">286</a></p> +<p id="n287" class="pln"><a href="#n287">287</a></p> +<p id="n288" class="stm run hide_run"><a href="#n288">288</a></p> +<p id="n289" class="pln"><a href="#n289">289</a></p> +<p id="n290" class="pln"><a href="#n290">290</a></p> +<p id="n291" class="pln"><a href="#n291">291</a></p> +<p id="n292" class="stm run hide_run"><a href="#n292">292</a></p> +<p id="n293" class="pln"><a href="#n293">293</a></p> +<p id="n294" class="pln"><a href="#n294">294</a></p> +<p id="n295" class="pln"><a href="#n295">295</a></p> +<p id="n296" class="pln"><a href="#n296">296</a></p> +<p id="n297" class="pln"><a href="#n297">297</a></p> +<p id="n298" class="pln"><a href="#n298">298</a></p> +<p id="n299" class="pln"><a href="#n299">299</a></p> +<p id="n300" class="pln"><a href="#n300">300</a></p> +<p id="n301" class="pln"><a href="#n301">301</a></p> +<p id="n302" class="pln"><a href="#n302">302</a></p> +<p id="n303" class="pln"><a href="#n303">303</a></p> +<p id="n304" class="pln"><a href="#n304">304</a></p> +<p id="n305" class="pln"><a href="#n305">305</a></p> +<p id="n306" class="pln"><a href="#n306">306</a></p> +<p id="n307" class="pln"><a href="#n307">307</a></p> +<p id="n308" class="pln"><a href="#n308">308</a></p> +<p id="n309" class="pln"><a href="#n309">309</a></p> +<p id="n310" class="stm run hide_run"><a href="#n310">310</a></p> +<p id="n311" class="stm run hide_run"><a href="#n311">311</a></p> +<p id="n312" class="pln"><a href="#n312">312</a></p> +<p id="n313" class="stm run hide_run"><a href="#n313">313</a></p> +<p id="n314" class="stm run hide_run"><a href="#n314">314</a></p> +<p id="n315" class="pln"><a href="#n315">315</a></p> +<p id="n316" class="pln"><a href="#n316">316</a></p> +<p id="n317" class="pln"><a href="#n317">317</a></p> +<p id="n318" class="pln"><a href="#n318">318</a></p> +<p id="n319" class="pln"><a href="#n319">319</a></p> +<p id="n320" class="pln"><a href="#n320">320</a></p> +<p id="n321" class="pln"><a href="#n321">321</a></p> +<p id="n322" class="pln"><a href="#n322">322</a></p> +<p id="n323" class="pln"><a href="#n323">323</a></p> +<p id="n324" class="pln"><a href="#n324">324</a></p> +<p id="n325" class="pln"><a href="#n325">325</a></p> +<p id="n326" class="pln"><a href="#n326">326</a></p> +<p id="n327" class="pln"><a href="#n327">327</a></p> +<p id="n328" class="pln"><a href="#n328">328</a></p> +<p id="n329" class="stm run hide_run"><a href="#n329">329</a></p> +<p id="n330" class="stm run hide_run"><a href="#n330">330</a></p> +<p id="n331" class="pln"><a href="#n331">331</a></p> +<p id="n332" class="stm run hide_run"><a href="#n332">332</a></p> +<p id="n333" class="stm run hide_run"><a href="#n333">333</a></p> +<p id="n334" class="pln"><a href="#n334">334</a></p> +<p id="n335" class="pln"><a href="#n335">335</a></p> +<p id="n336" class="pln"><a href="#n336">336</a></p> +<p id="n337" class="pln"><a href="#n337">337</a></p> +<p id="n338" class="pln"><a href="#n338">338</a></p> +<p id="n339" class="pln"><a href="#n339">339</a></p> +<p id="n340" class="pln"><a href="#n340">340</a></p> +<p id="n341" class="stm run hide_run"><a href="#n341">341</a></p> +<p id="n342" class="pln"><a href="#n342">342</a></p> +<p id="n343" class="pln"><a href="#n343">343</a></p> +<p id="n344" class="pln"><a href="#n344">344</a></p> +<p id="n345" class="pln"><a href="#n345">345</a></p> +<p id="n346" class="pln"><a href="#n346">346</a></p> +<p id="n347" class="pln"><a href="#n347">347</a></p> +<p id="n348" class="pln"><a href="#n348">348</a></p> +<p id="n349" class="stm run hide_run"><a href="#n349">349</a></p> +<p id="n350" class="stm run hide_run"><a href="#n350">350</a></p> +<p id="n351" class="pln"><a href="#n351">351</a></p> +<p id="n352" class="stm run hide_run"><a href="#n352">352</a></p> +<p id="n353" class="stm run hide_run"><a href="#n353">353</a></p> +<p id="n354" class="pln"><a href="#n354">354</a></p> +<p id="n355" class="pln"><a href="#n355">355</a></p> +<p id="n356" class="pln"><a href="#n356">356</a></p> +<p id="n357" class="pln"><a href="#n357">357</a></p> +<p id="n358" class="pln"><a href="#n358">358</a></p> +<p id="n359" class="pln"><a href="#n359">359</a></p> +<p id="n360" class="stm run hide_run"><a href="#n360">360</a></p> +<p id="n361" class="stm run hide_run"><a href="#n361">361</a></p> +<p id="n362" class="pln"><a href="#n362">362</a></p> +<p id="n363" class="stm run hide_run"><a href="#n363">363</a></p> +<p id="n364" class="stm run hide_run"><a href="#n364">364</a></p> +<p id="n365" class="pln"><a href="#n365">365</a></p> +<p id="n366" class="pln"><a href="#n366">366</a></p> +<p id="n367" class="pln"><a href="#n367">367</a></p> +<p id="n368" class="pln"><a href="#n368">368</a></p> +<p id="n369" class="pln"><a href="#n369">369</a></p> +<p id="n370" class="pln"><a href="#n370">370</a></p> +<p id="n371" class="pln"><a href="#n371">371</a></p> +<p id="n372" class="pln"><a href="#n372">372</a></p> +<p id="n373" class="pln"><a href="#n373">373</a></p> +<p id="n374" class="stm run hide_run"><a href="#n374">374</a></p> +<p id="n375" class="pln"><a href="#n375">375</a></p> +<p id="n376" class="pln"><a href="#n376">376</a></p> +<p id="n377" class="pln"><a href="#n377">377</a></p> +<p id="n378" class="pln"><a href="#n378">378</a></p> +<p id="n379" class="pln"><a href="#n379">379</a></p> +<p id="n380" class="pln"><a href="#n380">380</a></p> +<p id="n381" class="pln"><a href="#n381">381</a></p> +<p id="n382" class="pln"><a href="#n382">382</a></p> +<p id="n383" class="pln"><a href="#n383">383</a></p> +<p id="n384" class="pln"><a href="#n384">384</a></p> +<p id="n385" class="stm run hide_run"><a href="#n385">385</a></p> +<p id="n386" class="stm run hide_run"><a href="#n386">386</a></p> +<p id="n387" class="pln"><a href="#n387">387</a></p> +<p id="n388" class="stm run hide_run"><a href="#n388">388</a></p> +<p id="n389" class="pln"><a href="#n389">389</a></p> +<p id="n390" class="stm run hide_run"><a href="#n390">390</a></p> +<p id="n391" class="pln"><a href="#n391">391</a></p> +<p id="n392" class="pln"><a href="#n392">392</a></p> +<p id="n393" class="pln"><a href="#n393">393</a></p> +<p id="n394" class="pln"><a href="#n394">394</a></p> +<p id="n395" class="pln"><a href="#n395">395</a></p> +<p id="n396" class="stm run hide_run"><a href="#n396">396</a></p> +<p id="n397" class="stm run hide_run"><a href="#n397">397</a></p> +<p id="n398" class="stm run hide_run"><a href="#n398">398</a></p> +<p id="n399" class="pln"><a href="#n399">399</a></p> +<p id="n400" class="stm run hide_run"><a href="#n400">400</a></p> +<p id="n401" class="pln"><a href="#n401">401</a></p> +<p id="n402" class="stm run hide_run"><a href="#n402">402</a></p> +<p id="n403" class="pln"><a href="#n403">403</a></p> +<p id="n404" class="pln"><a href="#n404">404</a></p> +<p id="n405" class="pln"><a href="#n405">405</a></p> +<p id="n406" class="pln"><a href="#n406">406</a></p> +<p id="n407" class="pln"><a href="#n407">407</a></p> +<p id="n408" class="pln"><a href="#n408">408</a></p> +<p id="n409" class="pln"><a href="#n409">409</a></p> +<p id="n410" class="pln"><a href="#n410">410</a></p> +<p id="n411" class="pln"><a href="#n411">411</a></p> +<p id="n412" class="stm run hide_run"><a href="#n412">412</a></p> +<p id="n413" class="pln"><a href="#n413">413</a></p> +<p id="n414" class="pln"><a href="#n414">414</a></p> +<p id="n415" class="pln"><a href="#n415">415</a></p> +<p id="n416" class="pln"><a href="#n416">416</a></p> +<p id="n417" class="pln"><a href="#n417">417</a></p> +<p id="n418" class="pln"><a href="#n418">418</a></p> +<p id="n419" class="pln"><a href="#n419">419</a></p> +<p id="n420" class="pln"><a href="#n420">420</a></p> +<p id="n421" class="pln"><a href="#n421">421</a></p> +<p id="n422" class="pln"><a href="#n422">422</a></p> +<p id="n423" class="stm run hide_run"><a href="#n423">423</a></p> +<p id="n424" class="stm run hide_run"><a href="#n424">424</a></p> +<p id="n425" class="pln"><a href="#n425">425</a></p> +<p id="n426" class="pln"><a href="#n426">426</a></p> +<p id="n427" class="stm run hide_run"><a href="#n427">427</a></p> +<p id="n428" class="pln"><a href="#n428">428</a></p> +<p id="n429" class="pln"><a href="#n429">429</a></p> +<p id="n430" class="pln"><a href="#n430">430</a></p> +<p id="n431" class="stm run hide_run"><a href="#n431">431</a></p> +<p id="n432" class="stm mis"><a href="#n432">432</a></p> +<p id="n433" class="stm mis"><a href="#n433">433</a></p> +<p id="n434" class="stm mis"><a href="#n434">434</a></p> +<p id="n435" class="stm mis"><a href="#n435">435</a></p> +<p id="n436" class="stm mis"><a href="#n436">436</a></p> +<p id="n437" class="stm mis"><a href="#n437">437</a></p> +<p id="n438" class="stm mis"><a href="#n438">438</a></p> +<p id="n439" class="pln"><a href="#n439">439</a></p> +<p id="n440" class="stm run hide_run"><a href="#n440">440</a></p> +<p id="n441" class="stm mis"><a href="#n441">441</a></p> +<p id="n442" class="stm mis"><a href="#n442">442</a></p> +<p id="n443" class="stm mis"><a href="#n443">443</a></p> +<p id="n444" class="stm mis"><a href="#n444">444</a></p> +<p id="n445" class="stm mis"><a href="#n445">445</a></p> +<p id="n446" class="stm mis"><a href="#n446">446</a></p> +<p id="n447" class="stm mis"><a href="#n447">447</a></p> +<p id="n448" class="stm mis"><a href="#n448">448</a></p> +<p id="n449" class="stm mis"><a href="#n449">449</a></p> +<p id="n450" class="pln"><a href="#n450">450</a></p> +<p id="n451" class="stm run hide_run"><a href="#n451">451</a></p> +<p id="n452" class="pln"><a href="#n452">452</a></p> +<p id="n453" class="stm mis"><a href="#n453">453</a></p> +<p id="n454" class="stm mis"><a href="#n454">454</a></p> +<p id="n455" class="stm mis"><a href="#n455">455</a></p> +<p id="n456" class="stm mis"><a href="#n456">456</a></p> +<p id="n457" class="stm mis"><a href="#n457">457</a></p> +<p id="n458" class="pln"><a href="#n458">458</a></p> +<p id="n459" class="stm run hide_run"><a href="#n459">459</a></p> +<p id="n460" class="stm mis"><a href="#n460">460</a></p> +<p id="n461" class="stm mis"><a href="#n461">461</a></p> +<p id="n462" class="stm mis"><a href="#n462">462</a></p> +<p id="n463" class="stm mis"><a href="#n463">463</a></p> +<p id="n464" class="stm mis"><a href="#n464">464</a></p> +<p id="n465" class="pln"><a href="#n465">465</a></p> +<p id="n466" class="stm run hide_run"><a href="#n466">466</a></p> +<p id="n467" class="stm mis"><a href="#n467">467</a></p> +<p id="n468" class="stm mis"><a href="#n468">468</a></p> +<p id="n469" class="stm mis"><a href="#n469">469</a></p> +<p id="n470" class="stm mis"><a href="#n470">470</a></p> +<p id="n471" class="stm mis"><a href="#n471">471</a></p> +<p id="n472" class="pln"><a href="#n472">472</a></p> +<p id="n473" class="pln"><a href="#n473">473</a></p> +<p id="n474" class="stm run hide_run"><a href="#n474">474</a></p> +<p id="n475" class="pln"><a href="#n475">475</a></p> +<p id="n476" class="pln"><a href="#n476">476</a></p> +<p id="n477" class="pln"><a href="#n477">477</a></p> +<p id="n478" class="pln"><a href="#n478">478</a></p> +<p id="n479" class="stm run hide_run"><a href="#n479">479</a></p> +<p id="n480" class="stm mis"><a href="#n480">480</a></p> +<p id="n481" class="stm mis"><a href="#n481">481</a></p> +<p id="n482" class="stm mis"><a href="#n482">482</a></p> +<p id="n483" class="pln"><a href="#n483">483</a></p> +<p id="n484" class="stm run hide_run"><a href="#n484">484</a></p> +<p id="n485" class="stm mis"><a href="#n485">485</a></p> +<p id="n486" class="pln"><a href="#n486">486</a></p> +<p id="n487" class="pln"><a href="#n487">487</a></p> +<p id="n488" class="pln"><a href="#n488">488</a></p> +<p id="n489" class="pln"><a href="#n489">489</a></p> +<p id="n490" class="stm mis"><a href="#n490">490</a></p> +<p id="n491" class="pln"><a href="#n491">491</a></p> +<p id="n492" class="stm run hide_run"><a href="#n492">492</a></p> +<p id="n493" class="stm mis"><a href="#n493">493</a></p> +<p id="n494" class="pln"><a href="#n494">494</a></p> +<p id="n495" class="pln"><a href="#n495">495</a></p> +<p id="n496" class="pln"><a href="#n496">496</a></p> +<p id="n497" class="pln"><a href="#n497">497</a></p> +<p id="n498" class="pln"><a href="#n498">498</a></p> +<p id="n499" class="stm mis"><a href="#n499">499</a></p> +<p id="n500" class="pln"><a href="#n500">500</a></p> +<p id="n501" class="stm mis"><a href="#n501">501</a></p> +<p id="n502" class="pln"><a href="#n502">502</a></p> +<p id="n503" class="pln"><a href="#n503">503</a></p> +<p id="n504" class="pln"><a href="#n504">504</a></p> +<p id="n505" class="pln"><a href="#n505">505</a></p> +<p id="n506" class="pln"><a href="#n506">506</a></p> +<p id="n507" class="pln"><a href="#n507">507</a></p> +<p id="n508" class="pln"><a href="#n508">508</a></p> +<p id="n509" class="pln"><a href="#n509">509</a></p> +<p id="n510" class="stm mis"><a href="#n510">510</a></p> +<p id="n511" class="pln"><a href="#n511">511</a></p> +<p id="n512" class="stm run hide_run"><a href="#n512">512</a></p> +<p id="n513" class="stm mis"><a href="#n513">513</a></p> +<p id="n514" class="pln"><a href="#n514">514</a></p> +<p id="n515" class="pln"><a href="#n515">515</a></p> +<p id="n516" class="stm mis"><a href="#n516">516</a></p> +<p id="n517" class="pln"><a href="#n517">517</a></p> +<p id="n518" class="stm mis"><a href="#n518">518</a></p> +<p id="n519" class="pln"><a href="#n519">519</a></p> +<p id="n520" class="pln"><a href="#n520">520</a></p> +<p id="n521" class="pln"><a href="#n521">521</a></p> +<p id="n522" class="pln"><a href="#n522">522</a></p> +<p id="n523" class="pln"><a href="#n523">523</a></p> +<p id="n524" class="pln"><a href="#n524">524</a></p> +<p id="n525" class="stm mis"><a href="#n525">525</a></p> +<p id="n526" class="pln"><a href="#n526">526</a></p> +<p id="n527" class="stm run hide_run"><a href="#n527">527</a></p> +<p id="n528" class="stm mis"><a href="#n528">528</a></p> +<p id="n529" class="pln"><a href="#n529">529</a></p> +<p id="n530" class="pln"><a href="#n530">530</a></p> +<p id="n531" class="stm mis"><a href="#n531">531</a></p> +<p id="n532" class="pln"><a href="#n532">532</a></p> +<p id="n533" class="stm mis"><a href="#n533">533</a></p> +<p id="n534" class="pln"><a href="#n534">534</a></p> +<p id="n535" class="pln"><a href="#n535">535</a></p> +<p id="n536" class="pln"><a href="#n536">536</a></p> +<p id="n537" class="pln"><a href="#n537">537</a></p> +<p id="n538" class="pln"><a href="#n538">538</a></p> +<p id="n539" class="pln"><a href="#n539">539</a></p> +<p id="n540" class="stm mis"><a href="#n540">540</a></p> +<p id="n541" class="pln"><a href="#n541">541</a></p> +<p id="n542" class="stm run hide_run"><a href="#n542">542</a></p> +<p id="n543" class="stm mis"><a href="#n543">543</a></p> +<p id="n544" class="pln"><a href="#n544">544</a></p> +<p id="n545" class="pln"><a href="#n545">545</a></p> +<p id="n546" class="pln"><a href="#n546">546</a></p> +<p id="n547" class="pln"><a href="#n547">547</a></p> +<p id="n548" class="stm mis"><a href="#n548">548</a></p> +<p id="n549" class="pln"><a href="#n549">549</a></p> +<p id="n550" class="stm mis"><a href="#n550">550</a></p> +<p id="n551" class="pln"><a href="#n551">551</a></p> +<p id="n552" class="pln"><a href="#n552">552</a></p> +<p id="n553" class="pln"><a href="#n553">553</a></p> +<p id="n554" class="pln"><a href="#n554">554</a></p> +<p id="n555" class="pln"><a href="#n555">555</a></p> +<p id="n556" class="pln"><a href="#n556">556</a></p> +<p id="n557" class="pln"><a href="#n557">557</a></p> +<p id="n558" class="pln"><a href="#n558">558</a></p> +<p id="n559" class="stm mis"><a href="#n559">559</a></p> +<p id="n560" class="pln"><a href="#n560">560</a></p> +<p id="n561" class="stm run hide_run"><a href="#n561">561</a></p> +<p id="n562" class="stm mis"><a href="#n562">562</a></p> +<p id="n563" class="pln"><a href="#n563">563</a></p> +<p id="n564" class="pln"><a href="#n564">564</a></p> +<p id="n565" class="pln"><a href="#n565">565</a></p> +<p id="n566" class="pln"><a href="#n566">566</a></p> +<p id="n567" class="pln"><a href="#n567">567</a></p> +<p id="n568" class="pln"><a href="#n568">568</a></p> +<p id="n569" class="stm mis"><a href="#n569">569</a></p> +<p id="n570" class="pln"><a href="#n570">570</a></p> +<p id="n571" class="stm mis"><a href="#n571">571</a></p> +<p id="n572" class="pln"><a href="#n572">572</a></p> +<p id="n573" class="pln"><a href="#n573">573</a></p> +<p id="n574" class="pln"><a href="#n574">574</a></p> +<p id="n575" class="pln"><a href="#n575">575</a></p> +<p id="n576" class="pln"><a href="#n576">576</a></p> +<p id="n577" class="pln"><a href="#n577">577</a></p> +<p id="n578" class="pln"><a href="#n578">578</a></p> +<p id="n579" class="pln"><a href="#n579">579</a></p> +<p id="n580" class="pln"><a href="#n580">580</a></p> +<p id="n581" class="pln"><a href="#n581">581</a></p> +<p id="n582" class="stm mis"><a href="#n582">582</a></p> +<p id="n583" class="pln"><a href="#n583">583</a></p> +<p id="n584" class="stm run hide_run"><a href="#n584">584</a></p> +<p id="n585" class="stm mis"><a href="#n585">585</a></p> +<p id="n586" class="pln"><a href="#n586">586</a></p> +<p id="n587" class="pln"><a href="#n587">587</a></p> +<p id="n588" class="pln"><a href="#n588">588</a></p> +<p id="n589" class="pln"><a href="#n589">589</a></p> +<p id="n590" class="pln"><a href="#n590">590</a></p> +<p id="n591" class="pln"><a href="#n591">591</a></p> +<p id="n592" class="stm mis"><a href="#n592">592</a></p> +<p id="n593" class="pln"><a href="#n593">593</a></p> +<p id="n594" class="stm mis"><a href="#n594">594</a></p> +<p id="n595" class="pln"><a href="#n595">595</a></p> +<p id="n596" class="pln"><a href="#n596">596</a></p> +<p id="n597" class="pln"><a href="#n597">597</a></p> +<p id="n598" class="pln"><a href="#n598">598</a></p> +<p id="n599" class="pln"><a href="#n599">599</a></p> +<p id="n600" class="pln"><a href="#n600">600</a></p> +<p id="n601" class="pln"><a href="#n601">601</a></p> +<p id="n602" class="pln"><a href="#n602">602</a></p> +<p id="n603" class="pln"><a href="#n603">603</a></p> +<p id="n604" class="pln"><a href="#n604">604</a></p> +<p id="n605" class="stm mis"><a href="#n605">605</a></p> +<p id="n606" class="pln"><a href="#n606">606</a></p> +<p id="n607" class="pln"><a href="#n607">607</a></p> +<p id="n608" class="stm run hide_run"><a href="#n608">608</a></p> +<p id="n609" class="pln"><a href="#n609">609</a></p> +<p id="n610" class="pln"><a href="#n610">610</a></p> +<p id="n611" class="pln"><a href="#n611">611</a></p> +<p id="n612" class="stm run hide_run"><a href="#n612">612</a></p> +<p id="n613" class="stm mis"><a href="#n613">613</a></p> +<p id="n614" class="pln"><a href="#n614">614</a></p> +<p id="n615" class="pln"><a href="#n615">615</a></p> +<p id="n616" class="pln"><a href="#n616">616</a></p> +<p id="n617" class="pln"><a href="#n617">617</a></p> +<p id="n618" class="stm mis"><a href="#n618">618</a></p> +<p id="n619" class="stm mis"><a href="#n619">619</a></p> +<p id="n620" class="stm mis"><a href="#n620">620</a></p> +<p id="n621" class="pln"><a href="#n621">621</a></p> +<p id="n622" class="stm run hide_run"><a href="#n622">622</a></p> +<p id="n623" class="stm mis"><a href="#n623">623</a></p> +<p id="n624" class="pln"><a href="#n624">624</a></p> +<p id="n625" class="pln"><a href="#n625">625</a></p> +<p id="n626" class="pln"><a href="#n626">626</a></p> +<p id="n627" class="pln"><a href="#n627">627</a></p> +<p id="n628" class="stm mis"><a href="#n628">628</a></p> +<p id="n629" class="stm mis"><a href="#n629">629</a></p> +<p id="n630" class="stm mis"><a href="#n630">630</a></p> +<p id="n631" class="pln"><a href="#n631">631</a></p> +<p id="n632" class="stm run hide_run"><a href="#n632">632</a></p> +<p id="n633" class="stm mis"><a href="#n633">633</a></p> +<p id="n634" class="pln"><a href="#n634">634</a></p> +<p id="n635" class="pln"><a href="#n635">635</a></p> +<p id="n636" class="pln"><a href="#n636">636</a></p> +<p id="n637" class="pln"><a href="#n637">637</a></p> +<p id="n638" class="pln"><a href="#n638">638</a></p> +<p id="n639" class="pln"><a href="#n639">639</a></p> +<p id="n640" class="pln"><a href="#n640">640</a></p> +<p id="n641" class="pln"><a href="#n641">641</a></p> +<p id="n642" class="pln"><a href="#n642">642</a></p> +<p id="n643" class="pln"><a href="#n643">643</a></p> +<p id="n644" class="pln"><a href="#n644">644</a></p> +<p id="n645" class="pln"><a href="#n645">645</a></p> +<p id="n646" class="pln"><a href="#n646">646</a></p> +<p id="n647" class="stm mis"><a href="#n647">647</a></p> +<p id="n648" class="stm mis"><a href="#n648">648</a></p> +<p id="n649" class="pln"><a href="#n649">649</a></p> +<p id="n650" class="pln"><a href="#n650">650</a></p> +<p id="n651" class="stm run hide_run"><a href="#n651">651</a></p> +<p id="n652" class="pln"><a href="#n652">652</a></p> +<p id="n653" class="pln"><a href="#n653">653</a></p> +<p id="n654" class="pln"><a href="#n654">654</a></p> +<p id="n655" class="pln"><a href="#n655">655</a></p> +<p id="n656" class="stm run hide_run"><a href="#n656">656</a></p> +<p id="n657" class="pln"><a href="#n657">657</a></p> +<p id="n658" class="pln"><a href="#n658">658</a></p> +<p id="n659" class="pln"><a href="#n659">659</a></p> +<p id="n660" class="stm mis"><a href="#n660">660</a></p> +<p id="n661" class="stm mis"><a href="#n661">661</a></p> +<p id="n662" class="stm mis"><a href="#n662">662</a></p> +<p id="n663" class="pln"><a href="#n663">663</a></p> +<p id="n664" class="stm run hide_run"><a href="#n664">664</a></p> +<p id="n665" class="stm mis"><a href="#n665">665</a></p> +<p id="n666" class="stm mis"><a href="#n666">666</a></p> +<p id="n667" class="stm mis"><a href="#n667">667</a></p> +<p id="n668" class="pln"><a href="#n668">668</a></p> +<p id="n669" class="stm run hide_run"><a href="#n669">669</a></p> +<p id="n670" class="stm mis"><a href="#n670">670</a></p> +<p id="n671" class="stm mis"><a href="#n671">671</a></p> +<p id="n672" class="stm mis"><a href="#n672">672</a></p> +<p id="n673" class="stm mis"><a href="#n673">673</a></p> +<p id="n674" class="stm mis"><a href="#n674">674</a></p> +<p id="n675" class="pln"><a href="#n675">675</a></p> +<p id="n676" class="stm run hide_run"><a href="#n676">676</a></p> +<p id="n677" class="pln"><a href="#n677">677</a></p> +<p id="n678" class="stm mis"><a href="#n678">678</a></p> +<p id="n679" class="stm mis"><a href="#n679">679</a></p> +<p id="n680" class="stm mis"><a href="#n680">680</a></p> +<p id="n681" class="stm mis"><a href="#n681">681</a></p> +<p id="n682" class="stm mis"><a href="#n682">682</a></p> +<p id="n683" class="pln"><a href="#n683">683</a></p> +<p id="n684" class="stm run hide_run"><a href="#n684">684</a></p> +<p id="n685" class="pln"><a href="#n685">685</a></p> +<p id="n686" class="stm mis"><a href="#n686">686</a></p> +<p id="n687" class="stm mis"><a href="#n687">687</a></p> +<p id="n688" class="stm mis"><a href="#n688">688</a></p> +<p id="n689" class="stm mis"><a href="#n689">689</a></p> +<p id="n690" class="stm mis"><a href="#n690">690</a></p> +<p id="n691" class="pln"><a href="#n691">691</a></p> +<p id="n692" class="stm run hide_run"><a href="#n692">692</a></p> +<p id="n693" class="pln"><a href="#n693">693</a></p> +<p id="n694" class="stm mis"><a href="#n694">694</a></p> +<p id="n695" class="stm mis"><a href="#n695">695</a></p> +<p id="n696" class="stm mis"><a href="#n696">696</a></p> +<p id="n697" class="stm mis"><a href="#n697">697</a></p> +<p id="n698" class="stm mis"><a href="#n698">698</a></p> +<p id="n699" class="pln"><a href="#n699">699</a></p> +<p id="n700" class="stm run hide_run"><a href="#n700">700</a></p> +<p id="n701" class="pln"><a href="#n701">701</a></p> +<p id="n702" class="stm mis"><a href="#n702">702</a></p> +<p id="n703" class="stm mis"><a href="#n703">703</a></p> +<p id="n704" class="stm mis"><a href="#n704">704</a></p> +<p id="n705" class="stm mis"><a href="#n705">705</a></p> +<p id="n706" class="stm mis"><a href="#n706">706</a></p> +<p id="n707" class="pln"><a href="#n707">707</a></p> +<p id="n708" class="stm run hide_run"><a href="#n708">708</a></p> +<p id="n709" class="pln"><a href="#n709">709</a></p> +<p id="n710" class="pln"><a href="#n710">710</a></p> +<p id="n711" class="stm mis"><a href="#n711">711</a></p> +<p id="n712" class="stm mis"><a href="#n712">712</a></p> +<p id="n713" class="stm mis"><a href="#n713">713</a></p> +<p id="n714" class="stm mis"><a href="#n714">714</a></p> +<p id="n715" class="stm mis"><a href="#n715">715</a></p> +<p id="n716" class="stm mis"><a href="#n716">716</a></p> +<p id="n717" class="pln"><a href="#n717">717</a></p> +<p id="n718" class="pln"><a href="#n718">718</a></p> +<p id="n719" class="stm run hide_run"><a href="#n719">719</a></p> +<p id="n720" class="pln"><a href="#n720">720</a></p> +<p id="n721" class="stm run hide_run"><a href="#n721">721</a></p> +<p id="n722" class="pln"><a href="#n722">722</a></p> +<p id="n723" class="pln"><a href="#n723">723</a></p> +<p id="n724" class="pln"><a href="#n724">724</a></p> +<p id="n725" class="stm mis"><a href="#n725">725</a></p> +<p id="n726" class="stm mis"><a href="#n726">726</a></p> +<p id="n727" class="stm mis"><a href="#n727">727</a></p> +<p id="n728" class="pln"><a href="#n728">728</a></p> +<p id="n729" class="stm run hide_run"><a href="#n729">729</a></p> +<p id="n730" class="pln"><a href="#n730">730</a></p> +<p id="n731" class="stm mis"><a href="#n731">731</a></p> +<p id="n732" class="stm mis"><a href="#n732">732</a></p> +<p id="n733" class="stm mis"><a href="#n733">733</a></p> +<p id="n734" class="stm mis"><a href="#n734">734</a></p> +<p id="n735" class="stm mis"><a href="#n735">735</a></p> +<p id="n736" class="pln"><a href="#n736">736</a></p> +<p id="n737" class="stm run hide_run"><a href="#n737">737</a></p> +<p id="n738" class="stm mis"><a href="#n738">738</a></p> +<p id="n739" class="pln"><a href="#n739">739</a></p> +<p id="n740" class="stm mis"><a href="#n740">740</a></p> +<p id="n741" class="pln"><a href="#n741">741</a></p> +<p id="n742" class="stm run hide_run"><a href="#n742">742</a></p> +<p id="n743" class="stm mis"><a href="#n743">743</a></p> +<p id="n744" class="stm mis"><a href="#n744">744</a></p> +<p id="n745" class="stm mis"><a href="#n745">745</a></p> +<p id="n746" class="pln"><a href="#n746">746</a></p> +<p id="n747" class="stm run hide_run"><a href="#n747">747</a></p> +<p id="n748" class="stm mis"><a href="#n748">748</a></p> +<p id="n749" class="stm mis"><a href="#n749">749</a></p> +<p id="n750" class="stm mis"><a href="#n750">750</a></p> +<p id="n751" class="stm mis"><a href="#n751">751</a></p> +<p id="n752" class="pln"><a href="#n752">752</a></p> +<p id="n753" class="stm mis"><a href="#n753">753</a></p> +<p id="n754" class="stm mis"><a href="#n754">754</a></p> +<p id="n755" class="pln"><a href="#n755">755</a></p> +<p id="n756" class="pln"><a href="#n756">756</a></p> +<p id="n757" class="stm run hide_run"><a href="#n757">757</a></p> +<p id="n758" class="pln"><a href="#n758">758</a></p> +<p id="n759" class="stm run hide_run"><a href="#n759">759</a></p> +<p id="n760" class="pln"><a href="#n760">760</a></p> +<p id="n761" class="stm mis"><a href="#n761">761</a></p> +<p id="n762" class="stm mis"><a href="#n762">762</a></p> +<p id="n763" class="stm mis"><a href="#n763">763</a></p> +<p id="n764" class="stm mis"><a href="#n764">764</a></p> +<p id="n765" class="stm mis"><a href="#n765">765</a></p> +<p id="n766" class="stm mis"><a href="#n766">766</a></p> +<p id="n767" class="stm mis"><a href="#n767">767</a></p> +<p id="n768" class="pln"><a href="#n768">768</a></p> +<p id="n769" class="stm run hide_run"><a href="#n769">769</a></p> +<p id="n770" class="stm mis"><a href="#n770">770</a></p> +<p id="n771" class="pln"><a href="#n771">771</a></p> +<p id="n772" class="pln"><a href="#n772">772</a></p> +<p id="n773" class="pln"><a href="#n773">773</a></p> +<p id="n774" class="pln"><a href="#n774">774</a></p> +<p id="n775" class="pln"><a href="#n775">775</a></p> +<p id="n776" class="stm mis"><a href="#n776">776</a></p> +<p id="n777" class="stm mis"><a href="#n777">777</a></p> +<p id="n778" class="stm mis"><a href="#n778">778</a></p> +<p id="n779" class="pln"><a href="#n779">779</a></p> +<p id="n780" class="stm run hide_run"><a href="#n780">780</a></p> +<p id="n781" class="stm mis"><a href="#n781">781</a></p> +<p id="n782" class="stm mis"><a href="#n782">782</a></p> +<p id="n783" class="stm mis"><a href="#n783">783</a></p> +<p id="n784" class="pln"><a href="#n784">784</a></p> +<p id="n785" class="stm run hide_run"><a href="#n785">785</a></p> +<p id="n786" class="stm mis"><a href="#n786">786</a></p> +<p id="n787" class="stm mis"><a href="#n787">787</a></p> +<p id="n788" class="stm mis"><a href="#n788">788</a></p> +<p id="n789" class="stm mis"><a href="#n789">789</a></p> +<p id="n790" class="pln"><a href="#n790">790</a></p> +<p id="n791" class="stm run hide_run"><a href="#n791">791</a></p> +<p id="n792" class="pln"><a href="#n792">792</a></p> +<p id="n793" class="stm mis"><a href="#n793">793</a></p> +<p id="n794" class="stm mis"><a href="#n794">794</a></p> +<p id="n795" class="stm mis"><a href="#n795">795</a></p> +<p id="n796" class="stm mis"><a href="#n796">796</a></p> +<p id="n797" class="pln"><a href="#n797">797</a></p> +<p id="n798" class="stm run hide_run"><a href="#n798">798</a></p> +<p id="n799" class="stm mis"><a href="#n799">799</a></p> +<p id="n800" class="pln"><a href="#n800">800</a></p> +<p id="n801" class="pln"><a href="#n801">801</a></p> +<p id="n802" class="pln"><a href="#n802">802</a></p> +<p id="n803" class="pln"><a href="#n803">803</a></p> +<p id="n804" class="pln"><a href="#n804">804</a></p> +<p id="n805" class="stm mis"><a href="#n805">805</a></p> +<p id="n806" class="stm mis"><a href="#n806">806</a></p> +<p id="n807" class="stm mis"><a href="#n807">807</a></p> +<p id="n808" class="pln"><a href="#n808">808</a></p> +<p id="n809" class="stm run hide_run"><a href="#n809">809</a></p> +<p id="n810" class="stm mis"><a href="#n810">810</a></p> +<p id="n811" class="pln"><a href="#n811">811</a></p> +<p id="n812" class="pln"><a href="#n812">812</a></p> +<p id="n813" class="pln"><a href="#n813">813</a></p> +<p id="n814" class="pln"><a href="#n814">814</a></p> +<p id="n815" class="pln"><a href="#n815">815</a></p> +<p id="n816" class="pln"><a href="#n816">816</a></p> +<p id="n817" class="pln"><a href="#n817">817</a></p> +<p id="n818" class="pln"><a href="#n818">818</a></p> +<p id="n819" class="pln"><a href="#n819">819</a></p> +<p id="n820" class="pln"><a href="#n820">820</a></p> +<p id="n821" class="pln"><a href="#n821">821</a></p> +<p id="n822" class="pln"><a href="#n822">822</a></p> +<p id="n823" class="pln"><a href="#n823">823</a></p> +<p id="n824" class="pln"><a href="#n824">824</a></p> +<p id="n825" class="pln"><a href="#n825">825</a></p> +<p id="n826" class="pln"><a href="#n826">826</a></p> +<p id="n827" class="pln"><a href="#n827">827</a></p> +<p id="n828" class="pln"><a href="#n828">828</a></p> +<p id="n829" class="pln"><a href="#n829">829</a></p> +<p id="n830" class="pln"><a href="#n830">830</a></p> +<p id="n831" class="pln"><a href="#n831">831</a></p> +<p id="n832" class="pln"><a href="#n832">832</a></p> +<p id="n833" class="stm mis"><a href="#n833">833</a></p> +<p id="n834" class="stm mis"><a href="#n834">834</a></p> +<p id="n835" class="stm mis"><a href="#n835">835</a></p> +<p id="n836" class="stm mis"><a href="#n836">836</a></p> +<p id="n837" class="stm mis"><a href="#n837">837</a></p> +<p id="n838" class="stm mis"><a href="#n838">838</a></p> +<p id="n839" class="pln"><a href="#n839">839</a></p> +<p id="n840" class="stm run hide_run"><a href="#n840">840</a></p> +<p id="n841" class="stm mis"><a href="#n841">841</a></p> +<p id="n842" class="stm mis"><a href="#n842">842</a></p> +<p id="n843" class="stm mis"><a href="#n843">843</a></p> +<p id="n844" class="stm mis"><a href="#n844">844</a></p> +<p id="n845" class="pln"><a href="#n845">845</a></p> +<p id="n846" class="stm run hide_run"><a href="#n846">846</a></p> +<p id="n847" class="stm mis"><a href="#n847">847</a></p> +<p id="n848" class="stm mis"><a href="#n848">848</a></p> +<p id="n849" class="stm mis"><a href="#n849">849</a></p> +<p id="n850" class="stm mis"><a href="#n850">850</a></p> +<p id="n851" class="pln"><a href="#n851">851</a></p> +<p id="n852" class="pln"><a href="#n852">852</a></p> +<p id="n853" class="stm run hide_run"><a href="#n853">853</a></p> +<p id="n854" class="pln"><a href="#n854">854</a></p> +<p id="n855" class="stm run hide_run"><a href="#n855">855</a></p> +<p id="n856" class="stm mis"><a href="#n856">856</a></p> +<p id="n857" class="pln"><a href="#n857">857</a></p> +<p id="n858" class="pln"><a href="#n858">858</a></p> +<p id="n859" class="pln"><a href="#n859">859</a></p> +<p id="n860" class="pln"><a href="#n860">860</a></p> +<p id="n861" class="pln"><a href="#n861">861</a></p> +<p id="n862" class="pln"><a href="#n862">862</a></p> +<p id="n863" class="pln"><a href="#n863">863</a></p> +<p id="n864" class="pln"><a href="#n864">864</a></p> +<p id="n865" class="pln"><a href="#n865">865</a></p> +<p id="n866" class="pln"><a href="#n866">866</a></p> +<p id="n867" class="pln"><a href="#n867">867</a></p> +<p id="n868" class="pln"><a href="#n868">868</a></p> +<p id="n869" class="pln"><a href="#n869">869</a></p> +<p id="n870" class="pln"><a href="#n870">870</a></p> +<p id="n871" class="pln"><a href="#n871">871</a></p> +<p id="n872" class="pln"><a href="#n872">872</a></p> +<p id="n873" class="pln"><a href="#n873">873</a></p> +<p id="n874" class="pln"><a href="#n874">874</a></p> +<p id="n875" class="pln"><a href="#n875">875</a></p> +<p id="n876" class="pln"><a href="#n876">876</a></p> +<p id="n877" class="pln"><a href="#n877">877</a></p> +<p id="n878" class="pln"><a href="#n878">878</a></p> +<p id="n879" class="pln"><a href="#n879">879</a></p> +<p id="n880" class="pln"><a href="#n880">880</a></p> +<p id="n881" class="stm mis"><a href="#n881">881</a></p> +<p id="n882" class="stm mis"><a href="#n882">882</a></p> +<p id="n883" class="stm mis"><a href="#n883">883</a></p> +<p id="n884" class="stm mis"><a href="#n884">884</a></p> +<p id="n885" class="stm mis"><a href="#n885">885</a></p> +<p id="n886" class="pln"><a href="#n886">886</a></p> +<p id="n887" class="stm run hide_run"><a href="#n887">887</a></p> +<p id="n888" class="pln"><a href="#n888">888</a></p> +<p id="n889" class="stm mis"><a href="#n889">889</a></p> +<p id="n890" class="pln"><a href="#n890">890</a></p> +<p id="n891" class="pln"><a href="#n891">891</a></p> +<p id="n892" class="pln"><a href="#n892">892</a></p> +<p id="n893" class="pln"><a href="#n893">893</a></p> +<p id="n894" class="pln"><a href="#n894">894</a></p> +<p id="n895" class="pln"><a href="#n895">895</a></p> +<p id="n896" class="pln"><a href="#n896">896</a></p> +<p id="n897" class="pln"><a href="#n897">897</a></p> +<p id="n898" class="pln"><a href="#n898">898</a></p> +<p id="n899" class="pln"><a href="#n899">899</a></p> +<p id="n900" class="pln"><a href="#n900">900</a></p> +<p id="n901" class="pln"><a href="#n901">901</a></p> +<p id="n902" class="pln"><a href="#n902">902</a></p> +<p id="n903" class="pln"><a href="#n903">903</a></p> +<p id="n904" class="pln"><a href="#n904">904</a></p> +<p id="n905" class="pln"><a href="#n905">905</a></p> +<p id="n906" class="pln"><a href="#n906">906</a></p> +<p id="n907" class="pln"><a href="#n907">907</a></p> +<p id="n908" class="pln"><a href="#n908">908</a></p> +<p id="n909" class="pln"><a href="#n909">909</a></p> +<p id="n910" class="pln"><a href="#n910">910</a></p> +<p id="n911" class="pln"><a href="#n911">911</a></p> +<p id="n912" class="pln"><a href="#n912">912</a></p> +<p id="n913" class="pln"><a href="#n913">913</a></p> +<p id="n914" class="stm mis"><a href="#n914">914</a></p> +<p id="n915" class="stm mis"><a href="#n915">915</a></p> +<p id="n916" class="stm mis"><a href="#n916">916</a></p> +<p id="n917" class="pln"><a href="#n917">917</a></p> +<p id="n918" class="stm run hide_run"><a href="#n918">918</a></p> +<p id="n919" class="stm mis"><a href="#n919">919</a></p> +<p id="n920" class="pln"><a href="#n920">920</a></p> +<p id="n921" class="pln"><a href="#n921">921</a></p> +<p id="n922" class="pln"><a href="#n922">922</a></p> +<p id="n923" class="pln"><a href="#n923">923</a></p> +<p id="n924" class="pln"><a href="#n924">924</a></p> +<p id="n925" class="pln"><a href="#n925">925</a></p> +<p id="n926" class="pln"><a href="#n926">926</a></p> +<p id="n927" class="pln"><a href="#n927">927</a></p> +<p id="n928" class="pln"><a href="#n928">928</a></p> +<p id="n929" class="pln"><a href="#n929">929</a></p> +<p id="n930" class="pln"><a href="#n930">930</a></p> +<p id="n931" class="pln"><a href="#n931">931</a></p> +<p id="n932" class="pln"><a href="#n932">932</a></p> +<p id="n933" class="pln"><a href="#n933">933</a></p> +<p id="n934" class="pln"><a href="#n934">934</a></p> +<p id="n935" class="pln"><a href="#n935">935</a></p> +<p id="n936" class="pln"><a href="#n936">936</a></p> +<p id="n937" class="pln"><a href="#n937">937</a></p> +<p id="n938" class="pln"><a href="#n938">938</a></p> +<p id="n939" class="pln"><a href="#n939">939</a></p> +<p id="n940" class="pln"><a href="#n940">940</a></p> +<p id="n941" class="pln"><a href="#n941">941</a></p> +<p id="n942" class="pln"><a href="#n942">942</a></p> +<p id="n943" class="pln"><a href="#n943">943</a></p> +<p id="n944" class="pln"><a href="#n944">944</a></p> +<p id="n945" class="pln"><a href="#n945">945</a></p> +<p id="n946" class="pln"><a href="#n946">946</a></p> +<p id="n947" class="pln"><a href="#n947">947</a></p> +<p id="n948" class="pln"><a href="#n948">948</a></p> +<p id="n949" class="pln"><a href="#n949">949</a></p> +<p id="n950" class="pln"><a href="#n950">950</a></p> +<p id="n951" class="pln"><a href="#n951">951</a></p> +<p id="n952" class="pln"><a href="#n952">952</a></p> +<p id="n953" class="pln"><a href="#n953">953</a></p> +<p id="n954" class="pln"><a href="#n954">954</a></p> +<p id="n955" class="pln"><a href="#n955">955</a></p> +<p id="n956" class="pln"><a href="#n956">956</a></p> +<p id="n957" class="pln"><a href="#n957">957</a></p> +<p id="n958" class="stm mis"><a href="#n958">958</a></p> +<p id="n959" class="stm mis"><a href="#n959">959</a></p> +<p id="n960" class="stm mis"><a href="#n960">960</a></p> +<p id="n961" class="stm mis"><a href="#n961">961</a></p> +<p id="n962" class="stm mis"><a href="#n962">962</a></p> +<p id="n963" class="stm mis"><a href="#n963">963</a></p> +<p id="n964" class="pln"><a href="#n964">964</a></p> +<p id="n965" class="stm run hide_run"><a href="#n965">965</a></p> +<p id="n966" class="stm mis"><a href="#n966">966</a></p> +<p id="n967" class="pln"><a href="#n967">967</a></p> +<p id="n968" class="pln"><a href="#n968">968</a></p> +<p id="n969" class="pln"><a href="#n969">969</a></p> +<p id="n970" class="pln"><a href="#n970">970</a></p> +<p id="n971" class="pln"><a href="#n971">971</a></p> +<p id="n972" class="pln"><a href="#n972">972</a></p> +<p id="n973" class="pln"><a href="#n973">973</a></p> +<p id="n974" class="pln"><a href="#n974">974</a></p> +<p id="n975" class="pln"><a href="#n975">975</a></p> +<p id="n976" class="pln"><a href="#n976">976</a></p> +<p id="n977" class="pln"><a href="#n977">977</a></p> +<p id="n978" class="pln"><a href="#n978">978</a></p> +<p id="n979" class="pln"><a href="#n979">979</a></p> +<p id="n980" class="pln"><a href="#n980">980</a></p> +<p id="n981" class="pln"><a href="#n981">981</a></p> +<p id="n982" class="pln"><a href="#n982">982</a></p> +<p id="n983" class="pln"><a href="#n983">983</a></p> +<p id="n984" class="pln"><a href="#n984">984</a></p> +<p id="n985" class="pln"><a href="#n985">985</a></p> +<p id="n986" class="pln"><a href="#n986">986</a></p> +<p id="n987" class="pln"><a href="#n987">987</a></p> +<p id="n988" class="pln"><a href="#n988">988</a></p> +<p id="n989" class="pln"><a href="#n989">989</a></p> +<p id="n990" class="pln"><a href="#n990">990</a></p> +<p id="n991" class="pln"><a href="#n991">991</a></p> +<p id="n992" class="pln"><a href="#n992">992</a></p> +<p id="n993" class="pln"><a href="#n993">993</a></p> +<p id="n994" class="pln"><a href="#n994">994</a></p> +<p id="n995" class="pln"><a href="#n995">995</a></p> +<p id="n996" class="pln"><a href="#n996">996</a></p> +<p id="n997" class="pln"><a href="#n997">997</a></p> +<p id="n998" class="pln"><a href="#n998">998</a></p> +<p id="n999" class="pln"><a href="#n999">999</a></p> +<p id="n1000" class="pln"><a href="#n1000">1000</a></p> +<p id="n1001" class="pln"><a href="#n1001">1001</a></p> +<p id="n1002" class="pln"><a href="#n1002">1002</a></p> +<p id="n1003" class="pln"><a href="#n1003">1003</a></p> +<p id="n1004" class="pln"><a href="#n1004">1004</a></p> +<p id="n1005" class="pln"><a href="#n1005">1005</a></p> +<p id="n1006" class="pln"><a href="#n1006">1006</a></p> +<p id="n1007" class="pln"><a href="#n1007">1007</a></p> +<p id="n1008" class="pln"><a href="#n1008">1008</a></p> +<p id="n1009" class="stm mis"><a href="#n1009">1009</a></p> +<p id="n1010" class="stm mis"><a href="#n1010">1010</a></p> +<p id="n1011" class="stm mis"><a href="#n1011">1011</a></p> +<p id="n1012" class="stm mis"><a href="#n1012">1012</a></p> +<p id="n1013" class="stm mis"><a href="#n1013">1013</a></p> +<p id="n1014" class="stm mis"><a href="#n1014">1014</a></p> +<p id="n1015" class="pln"><a href="#n1015">1015</a></p> +<p id="n1016" class="stm run hide_run"><a href="#n1016">1016</a></p> +<p id="n1017" class="stm mis"><a href="#n1017">1017</a></p> +<p id="n1018" class="pln"><a href="#n1018">1018</a></p> +<p id="n1019" class="pln"><a href="#n1019">1019</a></p> +<p id="n1020" class="pln"><a href="#n1020">1020</a></p> +<p id="n1021" class="pln"><a href="#n1021">1021</a></p> +<p id="n1022" class="pln"><a href="#n1022">1022</a></p> +<p id="n1023" class="pln"><a href="#n1023">1023</a></p> +<p id="n1024" class="pln"><a href="#n1024">1024</a></p> +<p id="n1025" class="pln"><a href="#n1025">1025</a></p> +<p id="n1026" class="pln"><a href="#n1026">1026</a></p> +<p id="n1027" class="pln"><a href="#n1027">1027</a></p> +<p id="n1028" class="pln"><a href="#n1028">1028</a></p> +<p id="n1029" class="pln"><a href="#n1029">1029</a></p> +<p id="n1030" class="pln"><a href="#n1030">1030</a></p> +<p id="n1031" class="pln"><a href="#n1031">1031</a></p> +<p id="n1032" class="pln"><a href="#n1032">1032</a></p> +<p id="n1033" class="pln"><a href="#n1033">1033</a></p> +<p id="n1034" class="pln"><a href="#n1034">1034</a></p> +<p id="n1035" class="pln"><a href="#n1035">1035</a></p> +<p id="n1036" class="pln"><a href="#n1036">1036</a></p> +<p id="n1037" class="pln"><a href="#n1037">1037</a></p> +<p id="n1038" class="pln"><a href="#n1038">1038</a></p> +<p id="n1039" class="pln"><a href="#n1039">1039</a></p> +<p id="n1040" class="pln"><a href="#n1040">1040</a></p> +<p id="n1041" class="pln"><a href="#n1041">1041</a></p> +<p id="n1042" class="pln"><a href="#n1042">1042</a></p> +<p id="n1043" class="pln"><a href="#n1043">1043</a></p> +<p id="n1044" class="pln"><a href="#n1044">1044</a></p> +<p id="n1045" class="pln"><a href="#n1045">1045</a></p> +<p id="n1046" class="pln"><a href="#n1046">1046</a></p> +<p id="n1047" class="pln"><a href="#n1047">1047</a></p> +<p id="n1048" class="pln"><a href="#n1048">1048</a></p> +<p id="n1049" class="pln"><a href="#n1049">1049</a></p> +<p id="n1050" class="pln"><a href="#n1050">1050</a></p> +<p id="n1051" class="pln"><a href="#n1051">1051</a></p> +<p id="n1052" class="pln"><a href="#n1052">1052</a></p> +<p id="n1053" class="stm mis"><a href="#n1053">1053</a></p> +<p id="n1054" class="stm mis"><a href="#n1054">1054</a></p> +<p id="n1055" class="stm mis"><a href="#n1055">1055</a></p> +<p id="n1056" class="stm mis"><a href="#n1056">1056</a></p> +<p id="n1057" class="pln"><a href="#n1057">1057</a></p> +<p id="n1058" class="stm run hide_run"><a href="#n1058">1058</a></p> +<p id="n1059" class="stm mis"><a href="#n1059">1059</a></p> +<p id="n1060" class="pln"><a href="#n1060">1060</a></p> +<p id="n1061" class="pln"><a href="#n1061">1061</a></p> +<p id="n1062" class="pln"><a href="#n1062">1062</a></p> +<p id="n1063" class="pln"><a href="#n1063">1063</a></p> +<p id="n1064" class="pln"><a href="#n1064">1064</a></p> +<p id="n1065" class="pln"><a href="#n1065">1065</a></p> +<p id="n1066" class="pln"><a href="#n1066">1066</a></p> +<p id="n1067" class="pln"><a href="#n1067">1067</a></p> +<p id="n1068" class="pln"><a href="#n1068">1068</a></p> +<p id="n1069" class="pln"><a href="#n1069">1069</a></p> +<p id="n1070" class="pln"><a href="#n1070">1070</a></p> +<p id="n1071" class="pln"><a href="#n1071">1071</a></p> +<p id="n1072" class="pln"><a href="#n1072">1072</a></p> +<p id="n1073" class="pln"><a href="#n1073">1073</a></p> +<p id="n1074" class="pln"><a href="#n1074">1074</a></p> +<p id="n1075" class="stm mis"><a href="#n1075">1075</a></p> +<p id="n1076" class="stm mis"><a href="#n1076">1076</a></p> +<p id="n1077" class="stm mis"><a href="#n1077">1077</a></p> +<p id="n1078" class="pln"><a href="#n1078">1078</a></p> +<p id="n1079" class="stm run hide_run"><a href="#n1079">1079</a></p> +<p id="n1080" class="stm mis"><a href="#n1080">1080</a></p> +<p id="n1081" class="pln"><a href="#n1081">1081</a></p> +<p id="n1082" class="stm mis"><a href="#n1082">1082</a></p> +<p id="n1083" class="stm mis"><a href="#n1083">1083</a></p> +<p id="n1084" class="stm mis"><a href="#n1084">1084</a></p> +<p id="n1085" class="pln"><a href="#n1085">1085</a></p> +<p id="n1086" class="stm mis"><a href="#n1086">1086</a></p> +<p id="n1087" class="pln"><a href="#n1087">1087</a></p> +<p id="n1088" class="pln"><a href="#n1088">1088</a></p> +<p id="n1089" class="pln"><a href="#n1089">1089</a></p> +<p id="n1090" class="pln"><a href="#n1090">1090</a></p> +<p id="n1091" class="pln"><a href="#n1091">1091</a></p> +<p id="n1092" class="pln"><a href="#n1092">1092</a></p> +<p id="n1093" class="pln"><a href="#n1093">1093</a></p> +<p id="n1094" class="pln"><a href="#n1094">1094</a></p> +<p id="n1095" class="pln"><a href="#n1095">1095</a></p> +<p id="n1096" class="pln"><a href="#n1096">1096</a></p> +<p id="n1097" class="pln"><a href="#n1097">1097</a></p> +<p id="n1098" class="pln"><a href="#n1098">1098</a></p> +<p id="n1099" class="pln"><a href="#n1099">1099</a></p> +<p id="n1100" class="pln"><a href="#n1100">1100</a></p> +<p id="n1101" class="pln"><a href="#n1101">1101</a></p> +<p id="n1102" class="pln"><a href="#n1102">1102</a></p> +<p id="n1103" class="pln"><a href="#n1103">1103</a></p> +<p id="n1104" class="pln"><a href="#n1104">1104</a></p> +<p id="n1105" class="pln"><a href="#n1105">1105</a></p> +<p id="n1106" class="pln"><a href="#n1106">1106</a></p> +<p id="n1107" class="pln"><a href="#n1107">1107</a></p> +<p id="n1108" class="pln"><a href="#n1108">1108</a></p> +<p id="n1109" class="pln"><a href="#n1109">1109</a></p> +<p id="n1110" class="pln"><a href="#n1110">1110</a></p> +<p id="n1111" class="pln"><a href="#n1111">1111</a></p> +<p id="n1112" class="pln"><a href="#n1112">1112</a></p> +<p id="n1113" class="pln"><a href="#n1113">1113</a></p> +<p id="n1114" class="pln"><a href="#n1114">1114</a></p> +<p id="n1115" class="pln"><a href="#n1115">1115</a></p> +<p id="n1116" class="pln"><a href="#n1116">1116</a></p> +<p id="n1117" class="pln"><a href="#n1117">1117</a></p> +<p id="n1118" class="pln"><a href="#n1118">1118</a></p> +<p id="n1119" class="pln"><a href="#n1119">1119</a></p> +<p id="n1120" class="pln"><a href="#n1120">1120</a></p> +<p id="n1121" class="pln"><a href="#n1121">1121</a></p> +<p id="n1122" class="pln"><a href="#n1122">1122</a></p> +<p id="n1123" class="pln"><a href="#n1123">1123</a></p> +<p id="n1124" class="stm mis"><a href="#n1124">1124</a></p> +<p id="n1125" class="stm mis"><a href="#n1125">1125</a></p> +<p id="n1126" class="stm mis"><a href="#n1126">1126</a></p> +<p id="n1127" class="stm mis"><a href="#n1127">1127</a></p> +<p id="n1128" class="stm mis"><a href="#n1128">1128</a></p> +<p id="n1129" class="pln"><a href="#n1129">1129</a></p> +<p id="n1130" class="stm run hide_run"><a href="#n1130">1130</a></p> +<p id="n1131" class="stm mis"><a href="#n1131">1131</a></p> +<p id="n1132" class="pln"><a href="#n1132">1132</a></p> +<p id="n1133" class="pln"><a href="#n1133">1133</a></p> +<p id="n1134" class="pln"><a href="#n1134">1134</a></p> +<p id="n1135" class="pln"><a href="#n1135">1135</a></p> +<p id="n1136" class="pln"><a href="#n1136">1136</a></p> +<p id="n1137" class="pln"><a href="#n1137">1137</a></p> +<p id="n1138" class="pln"><a href="#n1138">1138</a></p> +<p id="n1139" class="pln"><a href="#n1139">1139</a></p> +<p id="n1140" class="pln"><a href="#n1140">1140</a></p> +<p id="n1141" class="pln"><a href="#n1141">1141</a></p> +<p id="n1142" class="pln"><a href="#n1142">1142</a></p> +<p id="n1143" class="pln"><a href="#n1143">1143</a></p> +<p id="n1144" class="pln"><a href="#n1144">1144</a></p> +<p id="n1145" class="pln"><a href="#n1145">1145</a></p> +<p id="n1146" class="pln"><a href="#n1146">1146</a></p> +<p id="n1147" class="pln"><a href="#n1147">1147</a></p> +<p id="n1148" class="pln"><a href="#n1148">1148</a></p> +<p id="n1149" class="pln"><a href="#n1149">1149</a></p> +<p id="n1150" class="pln"><a href="#n1150">1150</a></p> +<p id="n1151" class="pln"><a href="#n1151">1151</a></p> +<p id="n1152" class="pln"><a href="#n1152">1152</a></p> +<p id="n1153" class="stm mis"><a href="#n1153">1153</a></p> +<p id="n1154" class="stm mis"><a href="#n1154">1154</a></p> +<p id="n1155" class="stm mis"><a href="#n1155">1155</a></p> +<p id="n1156" class="stm mis"><a href="#n1156">1156</a></p> +<p id="n1157" class="pln"><a href="#n1157">1157</a></p> +<p id="n1158" class="stm run hide_run"><a href="#n1158">1158</a></p> +<p id="n1159" class="stm mis"><a href="#n1159">1159</a></p> +<p id="n1160" class="stm mis"><a href="#n1160">1160</a></p> +<p id="n1161" class="pln"><a href="#n1161">1161</a></p> +<p id="n1162" class="stm run hide_run"><a href="#n1162">1162</a></p> +<p id="n1163" class="stm mis"><a href="#n1163">1163</a></p> +<p id="n1164" class="stm mis"><a href="#n1164">1164</a></p> +<p id="n1165" class="pln"><a href="#n1165">1165</a></p> +<p id="n1166" class="stm run hide_run"><a href="#n1166">1166</a></p> +<p id="n1167" class="stm mis"><a href="#n1167">1167</a></p> +<p id="n1168" class="stm mis"><a href="#n1168">1168</a></p> +<p id="n1169" class="pln"><a href="#n1169">1169</a></p> +<p id="n1170" class="pln"><a href="#n1170">1170</a></p> +<p id="n1171" class="stm run hide_run"><a href="#n1171">1171</a></p> +<p id="n1172" class="pln"><a href="#n1172">1172</a></p> +<p id="n1173" class="pln"><a href="#n1173">1173</a></p> +<p id="n1174" class="stm run hide_run"><a href="#n1174">1174</a></p> +<p id="n1175" class="pln"><a href="#n1175">1175</a></p> +<p id="n1176" class="pln"><a href="#n1176">1176</a></p> +<p id="n1177" class="pln"><a href="#n1177">1177</a></p> +<p id="n1178" class="pln"><a href="#n1178">1178</a></p> +<p id="n1179" class="pln"><a href="#n1179">1179</a></p> +<p id="n1180" class="pln"><a href="#n1180">1180</a></p> +<p id="n1181" class="pln"><a href="#n1181">1181</a></p> +<p id="n1182" class="pln"><a href="#n1182">1182</a></p> +<p id="n1183" class="stm run hide_run"><a href="#n1183">1183</a></p> +<p id="n1184" class="pln"><a href="#n1184">1184</a></p> +<p id="n1185" class="pln"><a href="#n1185">1185</a></p> +<p id="n1186" class="pln"><a href="#n1186">1186</a></p> +<p id="n1187" class="pln"><a href="#n1187">1187</a></p> +<p id="n1188" class="pln"><a href="#n1188">1188</a></p> +<p id="n1189" class="pln"><a href="#n1189">1189</a></p> +<p id="n1190" class="pln"><a href="#n1190">1190</a></p> +<p id="n1191" class="pln"><a href="#n1191">1191</a></p> +<p id="n1192" class="stm run hide_run"><a href="#n1192">1192</a></p> +<p id="n1193" class="stm mis"><a href="#n1193">1193</a></p> +<p id="n1194" class="stm mis"><a href="#n1194">1194</a></p> +<p id="n1195" class="stm mis"><a href="#n1195">1195</a></p> +<p id="n1196" class="pln"><a href="#n1196">1196</a></p> +<p id="n1197" class="stm run hide_run"><a href="#n1197">1197</a></p> +<p id="n1198" class="stm mis"><a href="#n1198">1198</a></p> +<p id="n1199" class="stm mis"><a href="#n1199">1199</a></p> +<p id="n1200" class="stm mis"><a href="#n1200">1200</a></p> +<p id="n1201" class="pln"><a href="#n1201">1201</a></p> +<p id="n1202" class="stm run hide_run"><a href="#n1202">1202</a></p> +<p id="n1203" class="stm mis"><a href="#n1203">1203</a></p> +<p id="n1204" class="stm mis"><a href="#n1204">1204</a></p> +<p id="n1205" class="stm mis"><a href="#n1205">1205</a></p> +<p id="n1206" class="pln"><a href="#n1206">1206</a></p> +<p id="n1207" class="stm run hide_run"><a href="#n1207">1207</a></p> +<p id="n1208" class="stm mis"><a href="#n1208">1208</a></p> +<p id="n1209" class="stm mis"><a href="#n1209">1209</a></p> +<p id="n1210" class="stm mis"><a href="#n1210">1210</a></p> +<p id="n1211" class="pln"><a href="#n1211">1211</a></p> +<p id="n1212" class="pln"><a href="#n1212">1212</a></p> +<p id="n1213" class="stm run hide_run"><a href="#n1213">1213</a></p> +<p id="n1214" class="pln"><a href="#n1214">1214</a></p> +<p id="n1215" class="stm run hide_run"><a href="#n1215">1215</a></p> +<p id="n1216" class="stm mis"><a href="#n1216">1216</a></p> +<p id="n1217" class="pln"><a href="#n1217">1217</a></p> +<p id="n1218" class="pln"><a href="#n1218">1218</a></p> +<p id="n1219" class="pln"><a href="#n1219">1219</a></p> +<p id="n1220" class="pln"><a href="#n1220">1220</a></p> +<p id="n1221" class="pln"><a href="#n1221">1221</a></p> +<p id="n1222" class="pln"><a href="#n1222">1222</a></p> +<p id="n1223" class="pln"><a href="#n1223">1223</a></p> +<p id="n1224" class="pln"><a href="#n1224">1224</a></p> +<p id="n1225" class="pln"><a href="#n1225">1225</a></p> +<p id="n1226" class="pln"><a href="#n1226">1226</a></p> +<p id="n1227" class="pln"><a href="#n1227">1227</a></p> +<p id="n1228" class="pln"><a href="#n1228">1228</a></p> +<p id="n1229" class="pln"><a href="#n1229">1229</a></p> +<p id="n1230" class="pln"><a href="#n1230">1230</a></p> +<p id="n1231" class="pln"><a href="#n1231">1231</a></p> +<p id="n1232" class="pln"><a href="#n1232">1232</a></p> +<p id="n1233" class="pln"><a href="#n1233">1233</a></p> +<p id="n1234" class="pln"><a href="#n1234">1234</a></p> +<p id="n1235" class="stm mis"><a href="#n1235">1235</a></p> +<p id="n1236" class="stm mis"><a href="#n1236">1236</a></p> +<p id="n1237" class="stm mis"><a href="#n1237">1237</a></p> +<p id="n1238" class="stm mis"><a href="#n1238">1238</a></p> +<p id="n1239" class="stm mis"><a href="#n1239">1239</a></p> +<p id="n1240" class="pln"><a href="#n1240">1240</a></p> +<p id="n1241" class="stm run hide_run"><a href="#n1241">1241</a></p> +<p id="n1242" class="stm mis"><a href="#n1242">1242</a></p> +<p id="n1243" class="pln"><a href="#n1243">1243</a></p> +<p id="n1244" class="pln"><a href="#n1244">1244</a></p> +<p id="n1245" class="pln"><a href="#n1245">1245</a></p> +<p id="n1246" class="pln"><a href="#n1246">1246</a></p> +<p id="n1247" class="pln"><a href="#n1247">1247</a></p> +<p id="n1248" class="pln"><a href="#n1248">1248</a></p> +<p id="n1249" class="pln"><a href="#n1249">1249</a></p> +<p id="n1250" class="pln"><a href="#n1250">1250</a></p> +<p id="n1251" class="pln"><a href="#n1251">1251</a></p> +<p id="n1252" class="pln"><a href="#n1252">1252</a></p> +<p id="n1253" class="pln"><a href="#n1253">1253</a></p> +<p id="n1254" class="pln"><a href="#n1254">1254</a></p> +<p id="n1255" class="pln"><a href="#n1255">1255</a></p> +<p id="n1256" class="pln"><a href="#n1256">1256</a></p> +<p id="n1257" class="pln"><a href="#n1257">1257</a></p> +<p id="n1258" class="pln"><a href="#n1258">1258</a></p> +<p id="n1259" class="pln"><a href="#n1259">1259</a></p> +<p id="n1260" class="pln"><a href="#n1260">1260</a></p> +<p id="n1261" class="stm mis"><a href="#n1261">1261</a></p> +<p id="n1262" class="stm mis"><a href="#n1262">1262</a></p> +<p id="n1263" class="stm mis"><a href="#n1263">1263</a></p> +<p id="n1264" class="stm mis"><a href="#n1264">1264</a></p> +<p id="n1265" class="stm mis"><a href="#n1265">1265</a></p> +<p id="n1266" class="pln"><a href="#n1266">1266</a></p> +<p id="n1267" class="pln"><a href="#n1267">1267</a></p> +<p id="n1268" class="stm run hide_run"><a href="#n1268">1268</a></p> +<p id="n1269" class="pln"><a href="#n1269">1269</a></p> +<p id="n1270" class="pln"><a href="#n1270">1270</a></p> +<p id="n1271" class="pln"><a href="#n1271">1271</a></p> +<p id="n1272" class="pln"><a href="#n1272">1272</a></p> +<p id="n1273" class="pln"><a href="#n1273">1273</a></p> +<p id="n1274" class="stm run hide_run"><a href="#n1274">1274</a></p> +<p id="n1275" class="stm mis"><a href="#n1275">1275</a></p> +<p id="n1276" class="stm mis"><a href="#n1276">1276</a></p> +<p id="n1277" class="pln"><a href="#n1277">1277</a></p> +<p id="n1278" class="stm run hide_run"><a href="#n1278">1278</a></p> +<p id="n1279" class="stm mis"><a href="#n1279">1279</a></p> +<p id="n1280" class="pln"><a href="#n1280">1280</a></p> +<p id="n1281" class="pln"><a href="#n1281">1281</a></p> +<p id="n1282" class="pln"><a href="#n1282">1282</a></p> +<p id="n1283" class="pln"><a href="#n1283">1283</a></p> +<p id="n1284" class="stm mis"><a href="#n1284">1284</a></p> +<p id="n1285" class="stm mis"><a href="#n1285">1285</a></p> +<p id="n1286" class="stm mis"><a href="#n1286">1286</a></p> +<p id="n1287" class="pln"><a href="#n1287">1287</a></p> +<p id="n1288" class="pln"><a href="#n1288">1288</a></p> +<p id="n1289" class="stm run hide_run"><a href="#n1289">1289</a></p> +<p id="n1290" class="stm run hide_run"><a href="#n1290">1290</a></p> +<p id="n1291" class="pln"><a href="#n1291">1291</a></p> +<p id="n1292" class="pln"><a href="#n1292">1292</a></p> +<p id="n1293" class="pln"><a href="#n1293">1293</a></p> +<p id="n1294" class="pln"><a href="#n1294">1294</a></p> +<p id="n1295" class="pln"><a href="#n1295">1295</a></p> +<p id="n1296" class="pln"><a href="#n1296">1296</a></p> +<p id="n1297" class="pln"><a href="#n1297">1297</a></p> +<p id="n1298" class="pln"><a href="#n1298">1298</a></p> +<p id="n1299" class="pln"><a href="#n1299">1299</a></p> +<p id="n1300" class="pln"><a href="#n1300">1300</a></p> +<p id="n1301" class="pln"><a href="#n1301">1301</a></p> +<p id="n1302" class="pln"><a href="#n1302">1302</a></p> +<p id="n1303" class="pln"><a href="#n1303">1303</a></p> +<p id="n1304" class="pln"><a href="#n1304">1304</a></p> +<p id="n1305" class="pln"><a href="#n1305">1305</a></p> +<p id="n1306" class="pln"><a href="#n1306">1306</a></p> +<p id="n1307" class="pln"><a href="#n1307">1307</a></p> +<p id="n1308" class="pln"><a href="#n1308">1308</a></p> +<p id="n1309" class="pln"><a href="#n1309">1309</a></p> +<p id="n1310" class="pln"><a href="#n1310">1310</a></p> +<p id="n1311" class="pln"><a href="#n1311">1311</a></p> +<p id="n1312" class="pln"><a href="#n1312">1312</a></p> +<p id="n1313" class="pln"><a href="#n1313">1313</a></p> +<p id="n1314" class="pln"><a href="#n1314">1314</a></p> +<p id="n1315" class="pln"><a href="#n1315">1315</a></p> +<p id="n1316" class="pln"><a href="#n1316">1316</a></p> +<p id="n1317" class="pln"><a href="#n1317">1317</a></p> +<p id="n1318" class="pln"><a href="#n1318">1318</a></p> +<p id="n1319" class="pln"><a href="#n1319">1319</a></p> +<p id="n1320" class="pln"><a href="#n1320">1320</a></p> +<p id="n1321" class="pln"><a href="#n1321">1321</a></p> +<p id="n1322" class="pln"><a href="#n1322">1322</a></p> +<p id="n1323" class="pln"><a href="#n1323">1323</a></p> +<p id="n1324" class="pln"><a href="#n1324">1324</a></p> +<p id="n1325" class="pln"><a href="#n1325">1325</a></p> +<p id="n1326" class="pln"><a href="#n1326">1326</a></p> +<p id="n1327" class="pln"><a href="#n1327">1327</a></p> +<p id="n1328" class="pln"><a href="#n1328">1328</a></p> +<p id="n1329" class="pln"><a href="#n1329">1329</a></p> +<p id="n1330" class="pln"><a href="#n1330">1330</a></p> +<p id="n1331" class="pln"><a href="#n1331">1331</a></p> +<p id="n1332" class="pln"><a href="#n1332">1332</a></p> +<p id="n1333" class="pln"><a href="#n1333">1333</a></p> +<p id="n1334" class="pln"><a href="#n1334">1334</a></p> +<p id="n1335" class="pln"><a href="#n1335">1335</a></p> +<p id="n1336" class="stm run hide_run"><a href="#n1336">1336</a></p> +<p id="n1337" class="pln"><a href="#n1337">1337</a></p> +<p id="n1338" class="stm mis"><a href="#n1338">1338</a></p> +<p id="n1339" class="stm mis"><a href="#n1339">1339</a></p> +<p id="n1340" class="stm mis"><a href="#n1340">1340</a></p> +<p id="n1341" class="pln"><a href="#n1341">1341</a></p> +<p id="n1342" class="stm run hide_run"><a href="#n1342">1342</a></p> +<p id="n1343" class="pln"><a href="#n1343">1343</a></p> +<p id="n1344" class="stm mis"><a href="#n1344">1344</a></p> +<p id="n1345" class="stm mis"><a href="#n1345">1345</a></p> +<p id="n1346" class="stm mis"><a href="#n1346">1346</a></p> +<p id="n1347" class="pln"><a href="#n1347">1347</a></p> +<p id="n1348" class="stm run hide_run"><a href="#n1348">1348</a></p> +<p id="n1349" class="pln"><a href="#n1349">1349</a></p> +<p id="n1350" class="stm mis"><a href="#n1350">1350</a></p> +<p id="n1351" class="stm mis"><a href="#n1351">1351</a></p> +<p id="n1352" class="stm mis"><a href="#n1352">1352</a></p> +<p id="n1353" class="pln"><a href="#n1353">1353</a></p> +<p id="n1354" class="stm run hide_run"><a href="#n1354">1354</a></p> +<p id="n1355" class="pln"><a href="#n1355">1355</a></p> +<p id="n1356" class="stm mis"><a href="#n1356">1356</a></p> +<p id="n1357" class="stm mis"><a href="#n1357">1357</a></p> +<p id="n1358" class="stm mis"><a href="#n1358">1358</a></p> +<p id="n1359" class="pln"><a href="#n1359">1359</a></p> +<p id="n1360" class="stm run hide_run"><a href="#n1360">1360</a></p> +<p id="n1361" class="pln"><a href="#n1361">1361</a></p> +<p id="n1362" class="stm mis"><a href="#n1362">1362</a></p> +<p id="n1363" class="stm mis"><a href="#n1363">1363</a></p> +<p id="n1364" class="stm mis"><a href="#n1364">1364</a></p> +<p id="n1365" class="pln"><a href="#n1365">1365</a></p> +<p id="n1366" class="stm run hide_run"><a href="#n1366">1366</a></p> +<p id="n1367" class="stm mis"><a href="#n1367">1367</a></p> +<p id="n1368" class="pln"><a href="#n1368">1368</a></p> +<p id="n1369" class="pln"><a href="#n1369">1369</a></p> +<p id="n1370" class="pln"><a href="#n1370">1370</a></p> +<p id="n1371" class="pln"><a href="#n1371">1371</a></p> +<p id="n1372" class="pln"><a href="#n1372">1372</a></p> +<p id="n1373" class="pln"><a href="#n1373">1373</a></p> +<p id="n1374" class="pln"><a href="#n1374">1374</a></p> +<p id="n1375" class="pln"><a href="#n1375">1375</a></p> +<p id="n1376" class="pln"><a href="#n1376">1376</a></p> +<p id="n1377" class="pln"><a href="#n1377">1377</a></p> +<p id="n1378" class="stm mis"><a href="#n1378">1378</a></p> +<p id="n1379" class="pln"><a href="#n1379">1379</a></p> +<p id="n1380" class="stm mis"><a href="#n1380">1380</a></p> +<p id="n1381" class="stm mis"><a href="#n1381">1381</a></p> +<p id="n1382" class="stm mis"><a href="#n1382">1382</a></p> +<p id="n1383" class="pln"><a href="#n1383">1383</a></p> +<p id="n1384" class="stm mis"><a href="#n1384">1384</a></p> +<p id="n1385" class="stm mis"><a href="#n1385">1385</a></p> +<p id="n1386" class="stm mis"><a href="#n1386">1386</a></p> +<p id="n1387" class="pln"><a href="#n1387">1387</a></p> +<p id="n1388" class="stm mis"><a href="#n1388">1388</a></p> +<p id="n1389" class="stm mis"><a href="#n1389">1389</a></p> +<p id="n1390" class="stm mis"><a href="#n1390">1390</a></p> +<p id="n1391" class="pln"><a href="#n1391">1391</a></p> +<p id="n1392" class="stm mis"><a href="#n1392">1392</a></p> +<p id="n1393" class="stm mis"><a href="#n1393">1393</a></p> +<p id="n1394" class="stm mis"><a href="#n1394">1394</a></p> +<p id="n1395" class="pln"><a href="#n1395">1395</a></p> +<p id="n1396" class="stm mis"><a href="#n1396">1396</a></p> +<p id="n1397" class="stm mis"><a href="#n1397">1397</a></p> +<p id="n1398" class="stm mis"><a href="#n1398">1398</a></p> +<p id="n1399" class="stm mis"><a href="#n1399">1399</a></p> +<p id="n1400" class="pln"><a href="#n1400">1400</a></p> +<p id="n1401" class="stm mis"><a href="#n1401">1401</a></p> +<p id="n1402" class="stm mis"><a href="#n1402">1402</a></p> +<p id="n1403" class="stm mis"><a href="#n1403">1403</a></p> +<p id="n1404" class="stm mis"><a href="#n1404">1404</a></p> +<p id="n1405" class="pln"><a href="#n1405">1405</a></p> +<p id="n1406" class="stm mis"><a href="#n1406">1406</a></p> +<p id="n1407" class="stm mis"><a href="#n1407">1407</a></p> +<p id="n1408" class="stm mis"><a href="#n1408">1408</a></p> +<p id="n1409" class="stm mis"><a href="#n1409">1409</a></p> +<p id="n1410" class="pln"><a href="#n1410">1410</a></p> +<p id="n1411" class="stm run hide_run"><a href="#n1411">1411</a></p> +<p id="n1412" class="pln"><a href="#n1412">1412</a></p> +<p id="n1413" class="pln"><a href="#n1413">1413</a></p> +<p id="n1414" class="stm mis"><a href="#n1414">1414</a></p> +<p id="n1415" class="pln"><a href="#n1415">1415</a></p> +<p id="n1416" class="pln"><a href="#n1416">1416</a></p> +<p id="n1417" class="pln"><a href="#n1417">1417</a></p> +<p id="n1418" class="pln"><a href="#n1418">1418</a></p> +<p id="n1419" class="pln"><a href="#n1419">1419</a></p> +<p id="n1420" class="pln"><a href="#n1420">1420</a></p> +<p id="n1421" class="pln"><a href="#n1421">1421</a></p> +<p id="n1422" class="pln"><a href="#n1422">1422</a></p> +<p id="n1423" class="pln"><a href="#n1423">1423</a></p> +<p id="n1424" class="pln"><a href="#n1424">1424</a></p> +<p id="n1425" class="pln"><a href="#n1425">1425</a></p> +<p id="n1426" class="pln"><a href="#n1426">1426</a></p> +<p id="n1427" class="pln"><a href="#n1427">1427</a></p> +<p id="n1428" class="pln"><a href="#n1428">1428</a></p> +<p id="n1429" class="pln"><a href="#n1429">1429</a></p> +<p id="n1430" class="pln"><a href="#n1430">1430</a></p> +<p id="n1431" class="pln"><a href="#n1431">1431</a></p> +<p id="n1432" class="pln"><a href="#n1432">1432</a></p> +<p id="n1433" class="pln"><a href="#n1433">1433</a></p> +<p id="n1434" class="pln"><a href="#n1434">1434</a></p> +<p id="n1435" class="pln"><a href="#n1435">1435</a></p> +<p id="n1436" class="pln"><a href="#n1436">1436</a></p> +<p id="n1437" class="pln"><a href="#n1437">1437</a></p> +<p id="n1438" class="stm mis"><a href="#n1438">1438</a></p> +<p id="n1439" class="pln"><a href="#n1439">1439</a></p> +<p id="n1440" class="pln"><a href="#n1440">1440</a></p> +<p id="n1441" class="stm mis"><a href="#n1441">1441</a></p> +<p id="n1442" class="stm mis"><a href="#n1442">1442</a></p> +<p id="n1443" class="pln"><a href="#n1443">1443</a></p> +<p id="n1444" class="pln"><a href="#n1444">1444</a></p> +<p id="n1445" class="stm run hide_run"><a href="#n1445">1445</a></p> +<p id="n1446" class="pln"><a href="#n1446">1446</a></p> +<p id="n1447" class="stm run hide_run"><a href="#n1447">1447</a></p> +<p id="n1448" class="pln"><a href="#n1448">1448</a></p> +<p id="n1449" class="stm mis"><a href="#n1449">1449</a></p> +<p id="n1450" class="pln"><a href="#n1450">1450</a></p> +<p id="n1451" class="pln"><a href="#n1451">1451</a></p> +<p id="n1452" class="pln"><a href="#n1452">1452</a></p> +<p id="n1453" class="pln"><a href="#n1453">1453</a></p> +<p id="n1454" class="pln"><a href="#n1454">1454</a></p> +<p id="n1455" class="pln"><a href="#n1455">1455</a></p> +<p id="n1456" class="pln"><a href="#n1456">1456</a></p> +<p id="n1457" class="pln"><a href="#n1457">1457</a></p> +<p id="n1458" class="pln"><a href="#n1458">1458</a></p> +<p id="n1459" class="pln"><a href="#n1459">1459</a></p> +<p id="n1460" class="pln"><a href="#n1460">1460</a></p> +<p id="n1461" class="pln"><a href="#n1461">1461</a></p> +<p id="n1462" class="pln"><a href="#n1462">1462</a></p> +<p id="n1463" class="pln"><a href="#n1463">1463</a></p> +<p id="n1464" class="stm mis"><a href="#n1464">1464</a></p> +<p id="n1465" class="stm mis"><a href="#n1465">1465</a></p> +<p id="n1466" class="stm mis"><a href="#n1466">1466</a></p> +<p id="n1467" class="stm mis"><a href="#n1467">1467</a></p> +<p id="n1468" class="stm mis"><a href="#n1468">1468</a></p> +<p id="n1469" class="stm mis"><a href="#n1469">1469</a></p> +<p id="n1470" class="stm mis"><a href="#n1470">1470</a></p> +<p id="n1471" class="stm mis"><a href="#n1471">1471</a></p> +<p id="n1472" class="stm mis"><a href="#n1472">1472</a></p> +<p id="n1473" class="stm mis"><a href="#n1473">1473</a></p> +<p id="n1474" class="stm mis"><a href="#n1474">1474</a></p> +<p id="n1475" class="stm mis"><a href="#n1475">1475</a></p> +<p id="n1476" class="pln"><a href="#n1476">1476</a></p> +<p id="n1477" class="stm run hide_run"><a href="#n1477">1477</a></p> +<p id="n1478" class="stm mis"><a href="#n1478">1478</a></p> +<p id="n1479" class="pln"><a href="#n1479">1479</a></p> +<p id="n1480" class="pln"><a href="#n1480">1480</a></p> +<p id="n1481" class="pln"><a href="#n1481">1481</a></p> +<p id="n1482" class="pln"><a href="#n1482">1482</a></p> +<p id="n1483" class="pln"><a href="#n1483">1483</a></p> +<p id="n1484" class="pln"><a href="#n1484">1484</a></p> +<p id="n1485" class="pln"><a href="#n1485">1485</a></p> +<p id="n1486" class="pln"><a href="#n1486">1486</a></p> +<p id="n1487" class="pln"><a href="#n1487">1487</a></p> +<p id="n1488" class="pln"><a href="#n1488">1488</a></p> +<p id="n1489" class="pln"><a href="#n1489">1489</a></p> +<p id="n1490" class="pln"><a href="#n1490">1490</a></p> +<p id="n1491" class="pln"><a href="#n1491">1491</a></p> +<p id="n1492" class="pln"><a href="#n1492">1492</a></p> +<p id="n1493" class="pln"><a href="#n1493">1493</a></p> +<p id="n1494" class="pln"><a href="#n1494">1494</a></p> +<p id="n1495" class="pln"><a href="#n1495">1495</a></p> +<p id="n1496" class="pln"><a href="#n1496">1496</a></p> +<p id="n1497" class="pln"><a href="#n1497">1497</a></p> +<p id="n1498" class="pln"><a href="#n1498">1498</a></p> +<p id="n1499" class="pln"><a href="#n1499">1499</a></p> +<p id="n1500" class="pln"><a href="#n1500">1500</a></p> +<p id="n1501" class="pln"><a href="#n1501">1501</a></p> +<p id="n1502" class="pln"><a href="#n1502">1502</a></p> +<p id="n1503" class="pln"><a href="#n1503">1503</a></p> +<p id="n1504" class="stm mis"><a href="#n1504">1504</a></p> +<p id="n1505" class="stm mis"><a href="#n1505">1505</a></p> +<p id="n1506" class="stm mis"><a href="#n1506">1506</a></p> +<p id="n1507" class="stm mis"><a href="#n1507">1507</a></p> +<p id="n1508" class="stm mis"><a href="#n1508">1508</a></p> +<p id="n1509" class="stm mis"><a href="#n1509">1509</a></p> +<p id="n1510" class="pln"><a href="#n1510">1510</a></p> +<p id="n1511" class="stm run hide_run"><a href="#n1511">1511</a></p> +<p id="n1512" class="pln"><a href="#n1512">1512</a></p> +<p id="n1513" class="stm mis"><a href="#n1513">1513</a></p> +<p id="n1514" class="pln"><a href="#n1514">1514</a></p> +<p id="n1515" class="pln"><a href="#n1515">1515</a></p> +<p id="n1516" class="pln"><a href="#n1516">1516</a></p> +<p id="n1517" class="pln"><a href="#n1517">1517</a></p> +<p id="n1518" class="pln"><a href="#n1518">1518</a></p> +<p id="n1519" class="pln"><a href="#n1519">1519</a></p> +<p id="n1520" class="pln"><a href="#n1520">1520</a></p> +<p id="n1521" class="pln"><a href="#n1521">1521</a></p> +<p id="n1522" class="pln"><a href="#n1522">1522</a></p> +<p id="n1523" class="pln"><a href="#n1523">1523</a></p> +<p id="n1524" class="pln"><a href="#n1524">1524</a></p> +<p id="n1525" class="pln"><a href="#n1525">1525</a></p> +<p id="n1526" class="pln"><a href="#n1526">1526</a></p> +<p id="n1527" class="pln"><a href="#n1527">1527</a></p> +<p id="n1528" class="pln"><a href="#n1528">1528</a></p> +<p id="n1529" class="pln"><a href="#n1529">1529</a></p> +<p id="n1530" class="pln"><a href="#n1530">1530</a></p> +<p id="n1531" class="pln"><a href="#n1531">1531</a></p> +<p id="n1532" class="pln"><a href="#n1532">1532</a></p> +<p id="n1533" class="pln"><a href="#n1533">1533</a></p> +<p id="n1534" class="pln"><a href="#n1534">1534</a></p> +<p id="n1535" class="pln"><a href="#n1535">1535</a></p> +<p id="n1536" class="pln"><a href="#n1536">1536</a></p> +<p id="n1537" class="pln"><a href="#n1537">1537</a></p> +<p id="n1538" class="pln"><a href="#n1538">1538</a></p> +<p id="n1539" class="pln"><a href="#n1539">1539</a></p> +<p id="n1540" class="pln"><a href="#n1540">1540</a></p> +<p id="n1541" class="pln"><a href="#n1541">1541</a></p> +<p id="n1542" class="pln"><a href="#n1542">1542</a></p> +<p id="n1543" class="pln"><a href="#n1543">1543</a></p> +<p id="n1544" class="pln"><a href="#n1544">1544</a></p> +<p id="n1545" class="pln"><a href="#n1545">1545</a></p> +<p id="n1546" class="pln"><a href="#n1546">1546</a></p> +<p id="n1547" class="pln"><a href="#n1547">1547</a></p> +<p id="n1548" class="pln"><a href="#n1548">1548</a></p> +<p id="n1549" class="pln"><a href="#n1549">1549</a></p> +<p id="n1550" class="pln"><a href="#n1550">1550</a></p> +<p id="n1551" class="pln"><a href="#n1551">1551</a></p> +<p id="n1552" class="pln"><a href="#n1552">1552</a></p> +<p id="n1553" class="pln"><a href="#n1553">1553</a></p> +<p id="n1554" class="pln"><a href="#n1554">1554</a></p> +<p id="n1555" class="pln"><a href="#n1555">1555</a></p> +<p id="n1556" class="pln"><a href="#n1556">1556</a></p> +<p id="n1557" class="pln"><a href="#n1557">1557</a></p> +<p id="n1558" class="stm mis"><a href="#n1558">1558</a></p> +<p id="n1559" class="stm mis"><a href="#n1559">1559</a></p> +<p id="n1560" class="stm mis"><a href="#n1560">1560</a></p> +<p id="n1561" class="stm mis"><a href="#n1561">1561</a></p> +<p id="n1562" class="stm mis"><a href="#n1562">1562</a></p> +<p id="n1563" class="stm mis"><a href="#n1563">1563</a></p> +<p id="n1564" class="pln"><a href="#n1564">1564</a></p> +<p id="n1565" class="stm run hide_run"><a href="#n1565">1565</a></p> +<p id="n1566" class="stm mis"><a href="#n1566">1566</a></p> +<p id="n1567" class="pln"><a href="#n1567">1567</a></p> +<p id="n1568" class="pln"><a href="#n1568">1568</a></p> +<p id="n1569" class="pln"><a href="#n1569">1569</a></p> +<p id="n1570" class="pln"><a href="#n1570">1570</a></p> +<p id="n1571" class="pln"><a href="#n1571">1571</a></p> +<p id="n1572" class="pln"><a href="#n1572">1572</a></p> +<p id="n1573" class="pln"><a href="#n1573">1573</a></p> +<p id="n1574" class="pln"><a href="#n1574">1574</a></p> +<p id="n1575" class="pln"><a href="#n1575">1575</a></p> +<p id="n1576" class="pln"><a href="#n1576">1576</a></p> +<p id="n1577" class="pln"><a href="#n1577">1577</a></p> +<p id="n1578" class="pln"><a href="#n1578">1578</a></p> +<p id="n1579" class="pln"><a href="#n1579">1579</a></p> +<p id="n1580" class="pln"><a href="#n1580">1580</a></p> +<p id="n1581" class="pln"><a href="#n1581">1581</a></p> +<p id="n1582" class="pln"><a href="#n1582">1582</a></p> +<p id="n1583" class="pln"><a href="#n1583">1583</a></p> +<p id="n1584" class="pln"><a href="#n1584">1584</a></p> +<p id="n1585" class="pln"><a href="#n1585">1585</a></p> +<p id="n1586" class="pln"><a href="#n1586">1586</a></p> +<p id="n1587" class="pln"><a href="#n1587">1587</a></p> +<p id="n1588" class="pln"><a href="#n1588">1588</a></p> +<p id="n1589" class="pln"><a href="#n1589">1589</a></p> +<p id="n1590" class="pln"><a href="#n1590">1590</a></p> +<p id="n1591" class="pln"><a href="#n1591">1591</a></p> +<p id="n1592" class="pln"><a href="#n1592">1592</a></p> +<p id="n1593" class="pln"><a href="#n1593">1593</a></p> +<p id="n1594" class="stm mis"><a href="#n1594">1594</a></p> +<p id="n1595" class="pln"><a href="#n1595">1595</a></p> +<p id="n1596" class="stm mis"><a href="#n1596">1596</a></p> +<p id="n1597" class="stm mis"><a href="#n1597">1597</a></p> +<p id="n1598" class="stm mis"><a href="#n1598">1598</a></p> +<p id="n1599" class="pln"><a href="#n1599">1599</a></p> +<p id="n1600" class="stm mis"><a href="#n1600">1600</a></p> +<p id="n1601" class="stm mis"><a href="#n1601">1601</a></p> +<p id="n1602" class="stm mis"><a href="#n1602">1602</a></p> +<p id="n1603" class="pln"><a href="#n1603">1603</a></p> +<p id="n1604" class="stm mis"><a href="#n1604">1604</a></p> +<p id="n1605" class="stm mis"><a href="#n1605">1605</a></p> +<p id="n1606" class="pln"><a href="#n1606">1606</a></p> +<p id="n1607" class="stm run hide_run"><a href="#n1607">1607</a></p> +<p id="n1608" class="stm mis"><a href="#n1608">1608</a></p> +<p id="n1609" class="pln"><a href="#n1609">1609</a></p> +<p id="n1610" class="pln"><a href="#n1610">1610</a></p> +<p id="n1611" class="pln"><a href="#n1611">1611</a></p> +<p id="n1612" class="pln"><a href="#n1612">1612</a></p> +<p id="n1613" class="pln"><a href="#n1613">1613</a></p> +<p id="n1614" class="stm mis"><a href="#n1614">1614</a></p> +<p id="n1615" class="stm mis"><a href="#n1615">1615</a></p> +<p id="n1616" class="stm mis"><a href="#n1616">1616</a></p> +<p id="n1617" class="stm mis"><a href="#n1617">1617</a></p> +<p id="n1618" class="pln"><a href="#n1618">1618</a></p> +<p id="n1619" class="stm run hide_run"><a href="#n1619">1619</a></p> +<p id="n1620" class="pln"><a href="#n1620">1620</a></p> +<p id="n1621" class="pln"><a href="#n1621">1621</a></p> +<p id="n1622" class="stm mis"><a href="#n1622">1622</a></p> +<p id="n1623" class="pln"><a href="#n1623">1623</a></p> +<p id="n1624" class="pln"><a href="#n1624">1624</a></p> +<p id="n1625" class="pln"><a href="#n1625">1625</a></p> +<p id="n1626" class="pln"><a href="#n1626">1626</a></p> +<p id="n1627" class="pln"><a href="#n1627">1627</a></p> +<p id="n1628" class="pln"><a href="#n1628">1628</a></p> +<p id="n1629" class="pln"><a href="#n1629">1629</a></p> +<p id="n1630" class="pln"><a href="#n1630">1630</a></p> +<p id="n1631" class="pln"><a href="#n1631">1631</a></p> +<p id="n1632" class="pln"><a href="#n1632">1632</a></p> +<p id="n1633" class="pln"><a href="#n1633">1633</a></p> +<p id="n1634" class="pln"><a href="#n1634">1634</a></p> +<p id="n1635" class="pln"><a href="#n1635">1635</a></p> +<p id="n1636" class="stm mis"><a href="#n1636">1636</a></p> +<p id="n1637" class="stm mis"><a href="#n1637">1637</a></p> +<p id="n1638" class="stm mis"><a href="#n1638">1638</a></p> +<p id="n1639" class="stm mis"><a href="#n1639">1639</a></p> +<p id="n1640" class="stm mis"><a href="#n1640">1640</a></p> +<p id="n1641" class="stm mis"><a href="#n1641">1641</a></p> +<p id="n1642" class="pln"><a href="#n1642">1642</a></p> +<p id="n1643" class="stm run hide_run"><a href="#n1643">1643</a></p> +<p id="n1644" class="stm mis"><a href="#n1644">1644</a></p> +<p id="n1645" class="pln"><a href="#n1645">1645</a></p> +<p id="n1646" class="pln"><a href="#n1646">1646</a></p> +<p id="n1647" class="pln"><a href="#n1647">1647</a></p> +<p id="n1648" class="pln"><a href="#n1648">1648</a></p> +<p id="n1649" class="pln"><a href="#n1649">1649</a></p> +<p id="n1650" class="pln"><a href="#n1650">1650</a></p> +<p id="n1651" class="pln"><a href="#n1651">1651</a></p> +<p id="n1652" class="pln"><a href="#n1652">1652</a></p> +<p id="n1653" class="pln"><a href="#n1653">1653</a></p> +<p id="n1654" class="pln"><a href="#n1654">1654</a></p> +<p id="n1655" class="pln"><a href="#n1655">1655</a></p> +<p id="n1656" class="pln"><a href="#n1656">1656</a></p> +<p id="n1657" class="pln"><a href="#n1657">1657</a></p> +<p id="n1658" class="pln"><a href="#n1658">1658</a></p> +<p id="n1659" class="pln"><a href="#n1659">1659</a></p> +<p id="n1660" class="pln"><a href="#n1660">1660</a></p> +<p id="n1661" class="pln"><a href="#n1661">1661</a></p> +<p id="n1662" class="pln"><a href="#n1662">1662</a></p> +<p id="n1663" class="stm mis"><a href="#n1663">1663</a></p> +<p id="n1664" class="stm mis"><a href="#n1664">1664</a></p> +<p id="n1665" class="stm mis"><a href="#n1665">1665</a></p> +<p id="n1666" class="stm mis"><a href="#n1666">1666</a></p> +<p id="n1667" class="stm mis"><a href="#n1667">1667</a></p> +<p id="n1668" class="stm mis"><a href="#n1668">1668</a></p> +<p id="n1669" class="stm mis"><a href="#n1669">1669</a></p> +<p id="n1670" class="stm mis"><a href="#n1670">1670</a></p> +<p id="n1671" class="stm mis"><a href="#n1671">1671</a></p> +<p id="n1672" class="stm mis"><a href="#n1672">1672</a></p> +<p id="n1673" class="stm mis"><a href="#n1673">1673</a></p> +<p id="n1674" class="stm mis"><a href="#n1674">1674</a></p> +<p id="n1675" class="stm mis"><a href="#n1675">1675</a></p> +<p id="n1676" class="stm mis"><a href="#n1676">1676</a></p> +<p id="n1677" class="stm mis"><a href="#n1677">1677</a></p> +<p id="n1678" class="stm mis"><a href="#n1678">1678</a></p> +<p id="n1679" class="stm mis"><a href="#n1679">1679</a></p> +<p id="n1680" class="stm mis"><a href="#n1680">1680</a></p> +<p id="n1681" class="pln"><a href="#n1681">1681</a></p> +<p id="n1682" class="stm run hide_run"><a href="#n1682">1682</a></p> +<p id="n1683" class="stm mis"><a href="#n1683">1683</a></p> +<p id="n1684" class="pln"><a href="#n1684">1684</a></p> +<p id="n1685" class="pln"><a href="#n1685">1685</a></p> +<p id="n1686" class="pln"><a href="#n1686">1686</a></p> +<p id="n1687" class="pln"><a href="#n1687">1687</a></p> +<p id="n1688" class="pln"><a href="#n1688">1688</a></p> +<p id="n1689" class="pln"><a href="#n1689">1689</a></p> +<p id="n1690" class="stm mis"><a href="#n1690">1690</a></p> +<p id="n1691" class="stm mis"><a href="#n1691">1691</a></p> +<p id="n1692" class="stm mis"><a href="#n1692">1692</a></p> +<p id="n1693" class="stm mis"><a href="#n1693">1693</a></p> +<p id="n1694" class="stm mis"><a href="#n1694">1694</a></p> +<p id="n1695" class="stm mis"><a href="#n1695">1695</a></p> +<p id="n1696" class="stm mis"><a href="#n1696">1696</a></p> +<p id="n1697" class="stm mis"><a href="#n1697">1697</a></p> +<p id="n1698" class="pln"><a href="#n1698">1698</a></p> +<p id="n1699" class="stm run hide_run"><a href="#n1699">1699</a></p> +<p id="n1700" class="stm mis"><a href="#n1700">1700</a></p> +<p id="n1701" class="stm mis"><a href="#n1701">1701</a></p> +<p id="n1702" class="stm mis"><a href="#n1702">1702</a></p> +<p id="n1703" class="stm mis"><a href="#n1703">1703</a></p> +<p id="n1704" class="stm mis"><a href="#n1704">1704</a></p> +<p id="n1705" class="pln"><a href="#n1705">1705</a></p> +<p id="n1706" class="stm mis"><a href="#n1706">1706</a></p> +<p id="n1707" class="stm mis"><a href="#n1707">1707</a></p> +<p id="n1708" class="stm mis"><a href="#n1708">1708</a></p> +<p id="n1709" class="stm mis"><a href="#n1709">1709</a></p> +<p id="n1710" class="stm mis"><a href="#n1710">1710</a></p> +<p id="n1711" class="stm mis"><a href="#n1711">1711</a></p> +<p id="n1712" class="stm mis"><a href="#n1712">1712</a></p> +<p id="n1713" class="pln"><a href="#n1713">1713</a></p> +<p id="n1714" class="pln"><a href="#n1714">1714</a></p> +<p id="n1715" class="stm run hide_run"><a href="#n1715">1715</a></p> +<p id="n1716" class="stm mis"><a href="#n1716">1716</a></p> +<p id="n1717" class="pln"><a href="#n1717">1717</a></p> +<p id="n1718" class="pln"><a href="#n1718">1718</a></p> +<p id="n1719" class="pln"><a href="#n1719">1719</a></p> +<p id="n1720" class="pln"><a href="#n1720">1720</a></p> +<p id="n1721" class="pln"><a href="#n1721">1721</a></p> +<p id="n1722" class="pln"><a href="#n1722">1722</a></p> +<p id="n1723" class="pln"><a href="#n1723">1723</a></p> +<p id="n1724" class="pln"><a href="#n1724">1724</a></p> +<p id="n1725" class="pln"><a href="#n1725">1725</a></p> +<p id="n1726" class="pln"><a href="#n1726">1726</a></p> +<p id="n1727" class="pln"><a href="#n1727">1727</a></p> +<p id="n1728" class="pln"><a href="#n1728">1728</a></p> +<p id="n1729" class="pln"><a href="#n1729">1729</a></p> +<p id="n1730" class="pln"><a href="#n1730">1730</a></p> +<p id="n1731" class="pln"><a href="#n1731">1731</a></p> +<p id="n1732" class="pln"><a href="#n1732">1732</a></p> +<p id="n1733" class="pln"><a href="#n1733">1733</a></p> +<p id="n1734" class="pln"><a href="#n1734">1734</a></p> +<p id="n1735" class="pln"><a href="#n1735">1735</a></p> +<p id="n1736" class="pln"><a href="#n1736">1736</a></p> +<p id="n1737" class="pln"><a href="#n1737">1737</a></p> +<p id="n1738" class="stm mis"><a href="#n1738">1738</a></p> +<p id="n1739" class="stm mis"><a href="#n1739">1739</a></p> +<p id="n1740" class="stm mis"><a href="#n1740">1740</a></p> +<p id="n1741" class="pln"><a href="#n1741">1741</a></p> +<p id="n1742" class="stm run hide_run"><a href="#n1742">1742</a></p> +<p id="n1743" class="stm mis"><a href="#n1743">1743</a></p> +<p id="n1744" class="pln"><a href="#n1744">1744</a></p> +<p id="n1745" class="pln"><a href="#n1745">1745</a></p> +<p id="n1746" class="pln"><a href="#n1746">1746</a></p> +<p id="n1747" class="pln"><a href="#n1747">1747</a></p> +<p id="n1748" class="pln"><a href="#n1748">1748</a></p> +<p id="n1749" class="pln"><a href="#n1749">1749</a></p> +<p id="n1750" class="pln"><a href="#n1750">1750</a></p> +<p id="n1751" class="pln"><a href="#n1751">1751</a></p> +<p id="n1752" class="pln"><a href="#n1752">1752</a></p> +<p id="n1753" class="pln"><a href="#n1753">1753</a></p> +<p id="n1754" class="pln"><a href="#n1754">1754</a></p> +<p id="n1755" class="pln"><a href="#n1755">1755</a></p> +<p id="n1756" class="pln"><a href="#n1756">1756</a></p> +<p id="n1757" class="pln"><a href="#n1757">1757</a></p> +<p id="n1758" class="stm mis"><a href="#n1758">1758</a></p> +<p id="n1759" class="stm mis"><a href="#n1759">1759</a></p> +<p id="n1760" class="stm mis"><a href="#n1760">1760</a></p> +<p id="n1761" class="pln"><a href="#n1761">1761</a></p> +<p id="n1762" class="stm run hide_run"><a href="#n1762">1762</a></p> +<p id="n1763" class="stm mis"><a href="#n1763">1763</a></p> +<p id="n1764" class="pln"><a href="#n1764">1764</a></p> +<p id="n1765" class="pln"><a href="#n1765">1765</a></p> +<p id="n1766" class="pln"><a href="#n1766">1766</a></p> +<p id="n1767" class="pln"><a href="#n1767">1767</a></p> +<p id="n1768" class="pln"><a href="#n1768">1768</a></p> +<p id="n1769" class="pln"><a href="#n1769">1769</a></p> +<p id="n1770" class="pln"><a href="#n1770">1770</a></p> +<p id="n1771" class="pln"><a href="#n1771">1771</a></p> +<p id="n1772" class="pln"><a href="#n1772">1772</a></p> +<p id="n1773" class="pln"><a href="#n1773">1773</a></p> +<p id="n1774" class="pln"><a href="#n1774">1774</a></p> +<p id="n1775" class="pln"><a href="#n1775">1775</a></p> +<p id="n1776" class="stm mis"><a href="#n1776">1776</a></p> +<p id="n1777" class="stm mis"><a href="#n1777">1777</a></p> +<p id="n1778" class="stm mis"><a href="#n1778">1778</a></p> +<p id="n1779" class="pln"><a href="#n1779">1779</a></p> +<p id="n1780" class="pln"><a href="#n1780">1780</a></p> +<p id="n1781" class="stm run hide_run"><a href="#n1781">1781</a></p> +<p id="n1782" class="pln"><a href="#n1782">1782</a></p> +<p id="n1783" class="stm run hide_run"><a href="#n1783">1783</a></p> +<p id="n1784" class="pln"><a href="#n1784">1784</a></p> +<p id="n1785" class="pln"><a href="#n1785">1785</a></p> +<p id="n1786" class="pln"><a href="#n1786">1786</a></p> +<p id="n1787" class="pln"><a href="#n1787">1787</a></p> +<p id="n1788" class="pln"><a href="#n1788">1788</a></p> +<p id="n1789" class="pln"><a href="#n1789">1789</a></p> +<p id="n1790" class="pln"><a href="#n1790">1790</a></p> +<p id="n1791" class="pln"><a href="#n1791">1791</a></p> +<p id="n1792" class="pln"><a href="#n1792">1792</a></p> +<p id="n1793" class="pln"><a href="#n1793">1793</a></p> +<p id="n1794" class="pln"><a href="#n1794">1794</a></p> +<p id="n1795" class="pln"><a href="#n1795">1795</a></p> +<p id="n1796" class="pln"><a href="#n1796">1796</a></p> +<p id="n1797" class="pln"><a href="#n1797">1797</a></p> +<p id="n1798" class="pln"><a href="#n1798">1798</a></p> +<p id="n1799" class="pln"><a href="#n1799">1799</a></p> +<p id="n1800" class="pln"><a href="#n1800">1800</a></p> +<p id="n1801" class="pln"><a href="#n1801">1801</a></p> +<p id="n1802" class="pln"><a href="#n1802">1802</a></p> +<p id="n1803" class="pln"><a href="#n1803">1803</a></p> +<p id="n1804" class="exc"><a href="#n1804">1804</a></p> +<p id="n1805" class="pln"><a href="#n1805">1805</a></p> +<p id="n1806" class="exc"><a href="#n1806">1806</a></p> +<p id="n1807" class="exc"><a href="#n1807">1807</a></p> +<p id="n1808" class="exc"><a href="#n1808">1808</a></p> +<p id="n1809" class="pln"><a href="#n1809">1809</a></p> +<p id="n1810" class="exc"><a href="#n1810">1810</a></p> +<p id="n1811" class="exc"><a href="#n1811">1811</a></p> +<p id="n1812" class="pln"><a href="#n1812">1812</a></p> +<p id="n1813" class="stm run hide_run"><a href="#n1813">1813</a></p> +<p id="n1814" class="stm mis"><a href="#n1814">1814</a></p> +<p id="n1815" class="stm mis"><a href="#n1815">1815</a></p> +<p id="n1816" class="stm mis"><a href="#n1816">1816</a></p> +<p id="n1817" class="stm mis"><a href="#n1817">1817</a></p> +<p id="n1818" class="stm mis"><a href="#n1818">1818</a></p> +<p id="n1819" class="pln"><a href="#n1819">1819</a></p> +<p id="n1820" class="stm run hide_run"><a href="#n1820">1820</a></p> +<p id="n1821" class="stm mis"><a href="#n1821">1821</a></p> +<p id="n1822" class="stm mis"><a href="#n1822">1822</a></p> +<p id="n1823" class="pln"><a href="#n1823">1823</a></p> +<p id="n1824" class="stm run hide_run"><a href="#n1824">1824</a></p> +<p id="n1825" class="stm mis"><a href="#n1825">1825</a></p> +<p id="n1826" class="stm mis"><a href="#n1826">1826</a></p> +<p id="n1827" class="stm mis"><a href="#n1827">1827</a></p> +<p id="n1828" class="pln"><a href="#n1828">1828</a></p> +<p id="n1829" class="stm run hide_run"><a href="#n1829">1829</a></p> +<p id="n1830" class="stm mis"><a href="#n1830">1830</a></p> +<p id="n1831" class="stm mis"><a href="#n1831">1831</a></p> +<p id="n1832" class="stm mis"><a href="#n1832">1832</a></p> +<p id="n1833" class="pln"><a href="#n1833">1833</a></p> +<p id="n1834" class="stm run hide_run"><a href="#n1834">1834</a></p> +<p id="n1835" class="stm mis"><a href="#n1835">1835</a></p> +<p id="n1836" class="stm mis"><a href="#n1836">1836</a></p> +<p id="n1837" class="stm mis"><a href="#n1837">1837</a></p> +<p id="n1838" class="pln"><a href="#n1838">1838</a></p> +<p id="n1839" class="stm run hide_run"><a href="#n1839">1839</a></p> +<p id="n1840" class="stm mis"><a href="#n1840">1840</a></p> +<p id="n1841" class="stm mis"><a href="#n1841">1841</a></p> +<p id="n1842" class="stm mis"><a href="#n1842">1842</a></p> +<p id="n1843" class="pln"><a href="#n1843">1843</a></p> +<p id="n1844" class="pln"><a href="#n1844">1844</a></p> +<p id="n1845" class="stm run hide_run"><a href="#n1845">1845</a></p> +<p id="n1846" class="pln"><a href="#n1846">1846</a></p> +<p id="n1847" class="stm run hide_run"><a href="#n1847">1847</a></p> +<p id="n1848" class="stm mis"><a href="#n1848">1848</a></p> +<p id="n1849" class="pln"><a href="#n1849">1849</a></p> +<p id="n1850" class="pln"><a href="#n1850">1850</a></p> +<p id="n1851" class="pln"><a href="#n1851">1851</a></p> +<p id="n1852" class="pln"><a href="#n1852">1852</a></p> +<p id="n1853" class="pln"><a href="#n1853">1853</a></p> +<p id="n1854" class="pln"><a href="#n1854">1854</a></p> +<p id="n1855" class="pln"><a href="#n1855">1855</a></p> +<p id="n1856" class="pln"><a href="#n1856">1856</a></p> +<p id="n1857" class="pln"><a href="#n1857">1857</a></p> +<p id="n1858" class="pln"><a href="#n1858">1858</a></p> +<p id="n1859" class="pln"><a href="#n1859">1859</a></p> +<p id="n1860" class="pln"><a href="#n1860">1860</a></p> +<p id="n1861" class="pln"><a href="#n1861">1861</a></p> +<p id="n1862" class="pln"><a href="#n1862">1862</a></p> +<p id="n1863" class="pln"><a href="#n1863">1863</a></p> +<p id="n1864" class="pln"><a href="#n1864">1864</a></p> +<p id="n1865" class="pln"><a href="#n1865">1865</a></p> +<p id="n1866" class="pln"><a href="#n1866">1866</a></p> +<p id="n1867" class="pln"><a href="#n1867">1867</a></p> +<p id="n1868" class="stm mis"><a href="#n1868">1868</a></p> +<p id="n1869" class="stm mis"><a href="#n1869">1869</a></p> +<p id="n1870" class="stm mis"><a href="#n1870">1870</a></p> +<p id="n1871" class="pln"><a href="#n1871">1871</a></p> +<p id="n1872" class="stm run hide_run"><a href="#n1872">1872</a></p> +<p id="n1873" class="stm mis"><a href="#n1873">1873</a></p> +<p id="n1874" class="pln"><a href="#n1874">1874</a></p> +<p id="n1875" class="pln"><a href="#n1875">1875</a></p> +<p id="n1876" class="pln"><a href="#n1876">1876</a></p> +<p id="n1877" class="pln"><a href="#n1877">1877</a></p> +<p id="n1878" class="pln"><a href="#n1878">1878</a></p> +<p id="n1879" class="pln"><a href="#n1879">1879</a></p> +<p id="n1880" class="pln"><a href="#n1880">1880</a></p> +<p id="n1881" class="pln"><a href="#n1881">1881</a></p> +<p id="n1882" class="pln"><a href="#n1882">1882</a></p> +<p id="n1883" class="pln"><a href="#n1883">1883</a></p> +<p id="n1884" class="pln"><a href="#n1884">1884</a></p> +<p id="n1885" class="pln"><a href="#n1885">1885</a></p> +<p id="n1886" class="pln"><a href="#n1886">1886</a></p> +<p id="n1887" class="pln"><a href="#n1887">1887</a></p> +<p id="n1888" class="pln"><a href="#n1888">1888</a></p> +<p id="n1889" class="pln"><a href="#n1889">1889</a></p> +<p id="n1890" class="pln"><a href="#n1890">1890</a></p> +<p id="n1891" class="pln"><a href="#n1891">1891</a></p> +<p id="n1892" class="pln"><a href="#n1892">1892</a></p> +<p id="n1893" class="pln"><a href="#n1893">1893</a></p> +<p id="n1894" class="pln"><a href="#n1894">1894</a></p> +<p id="n1895" class="pln"><a href="#n1895">1895</a></p> +<p id="n1896" class="pln"><a href="#n1896">1896</a></p> +<p id="n1897" class="stm mis"><a href="#n1897">1897</a></p> +<p id="n1898" class="stm mis"><a href="#n1898">1898</a></p> +<p id="n1899" class="stm mis"><a href="#n1899">1899</a></p> +<p id="n1900" class="pln"><a href="#n1900">1900</a></p> +<p id="n1901" class="stm run hide_run"><a href="#n1901">1901</a></p> +<p id="n1902" class="stm mis"><a href="#n1902">1902</a></p> +<p id="n1903" class="pln"><a href="#n1903">1903</a></p> +<p id="n1904" class="pln"><a href="#n1904">1904</a></p> +<p id="n1905" class="pln"><a href="#n1905">1905</a></p> +<p id="n1906" class="pln"><a href="#n1906">1906</a></p> +<p id="n1907" class="pln"><a href="#n1907">1907</a></p> +<p id="n1908" class="pln"><a href="#n1908">1908</a></p> +<p id="n1909" class="pln"><a href="#n1909">1909</a></p> +<p id="n1910" class="pln"><a href="#n1910">1910</a></p> +<p id="n1911" class="pln"><a href="#n1911">1911</a></p> +<p id="n1912" class="pln"><a href="#n1912">1912</a></p> +<p id="n1913" class="pln"><a href="#n1913">1913</a></p> +<p id="n1914" class="pln"><a href="#n1914">1914</a></p> +<p id="n1915" class="pln"><a href="#n1915">1915</a></p> +<p id="n1916" class="pln"><a href="#n1916">1916</a></p> +<p id="n1917" class="pln"><a href="#n1917">1917</a></p> +<p id="n1918" class="pln"><a href="#n1918">1918</a></p> +<p id="n1919" class="pln"><a href="#n1919">1919</a></p> +<p id="n1920" class="pln"><a href="#n1920">1920</a></p> +<p id="n1921" class="pln"><a href="#n1921">1921</a></p> +<p id="n1922" class="pln"><a href="#n1922">1922</a></p> +<p id="n1923" class="pln"><a href="#n1923">1923</a></p> +<p id="n1924" class="pln"><a href="#n1924">1924</a></p> +<p id="n1925" class="pln"><a href="#n1925">1925</a></p> +<p id="n1926" class="stm mis"><a href="#n1926">1926</a></p> +<p id="n1927" class="stm mis"><a href="#n1927">1927</a></p> +<p id="n1928" class="stm mis"><a href="#n1928">1928</a></p> +<p id="n1929" class="pln"><a href="#n1929">1929</a></p> +<p id="n1930" class="stm run hide_run"><a href="#n1930">1930</a></p> +<p id="n1931" class="stm mis"><a href="#n1931">1931</a></p> +<p id="n1932" class="pln"><a href="#n1932">1932</a></p> +<p id="n1933" class="pln"><a href="#n1933">1933</a></p> +<p id="n1934" class="pln"><a href="#n1934">1934</a></p> +<p id="n1935" class="pln"><a href="#n1935">1935</a></p> +<p id="n1936" class="pln"><a href="#n1936">1936</a></p> +<p id="n1937" class="pln"><a href="#n1937">1937</a></p> +<p id="n1938" class="pln"><a href="#n1938">1938</a></p> +<p id="n1939" class="pln"><a href="#n1939">1939</a></p> +<p id="n1940" class="pln"><a href="#n1940">1940</a></p> +<p id="n1941" class="pln"><a href="#n1941">1941</a></p> +<p id="n1942" class="pln"><a href="#n1942">1942</a></p> +<p id="n1943" class="pln"><a href="#n1943">1943</a></p> +<p id="n1944" class="pln"><a href="#n1944">1944</a></p> +<p id="n1945" class="pln"><a href="#n1945">1945</a></p> +<p id="n1946" class="pln"><a href="#n1946">1946</a></p> +<p id="n1947" class="pln"><a href="#n1947">1947</a></p> +<p id="n1948" class="pln"><a href="#n1948">1948</a></p> +<p id="n1949" class="pln"><a href="#n1949">1949</a></p> +<p id="n1950" class="pln"><a href="#n1950">1950</a></p> +<p id="n1951" class="pln"><a href="#n1951">1951</a></p> +<p id="n1952" class="pln"><a href="#n1952">1952</a></p> +<p id="n1953" class="pln"><a href="#n1953">1953</a></p> +<p id="n1954" class="pln"><a href="#n1954">1954</a></p> +<p id="n1955" class="pln"><a href="#n1955">1955</a></p> +<p id="n1956" class="pln"><a href="#n1956">1956</a></p> +<p id="n1957" class="pln"><a href="#n1957">1957</a></p> +<p id="n1958" class="pln"><a href="#n1958">1958</a></p> +<p id="n1959" class="pln"><a href="#n1959">1959</a></p> +<p id="n1960" class="pln"><a href="#n1960">1960</a></p> +<p id="n1961" class="pln"><a href="#n1961">1961</a></p> +<p id="n1962" class="pln"><a href="#n1962">1962</a></p> +<p id="n1963" class="pln"><a href="#n1963">1963</a></p> +<p id="n1964" class="pln"><a href="#n1964">1964</a></p> +<p id="n1965" class="pln"><a href="#n1965">1965</a></p> +<p id="n1966" class="pln"><a href="#n1966">1966</a></p> +<p id="n1967" class="pln"><a href="#n1967">1967</a></p> +<p id="n1968" class="pln"><a href="#n1968">1968</a></p> +<p id="n1969" class="pln"><a href="#n1969">1969</a></p> +<p id="n1970" class="pln"><a href="#n1970">1970</a></p> +<p id="n1971" class="pln"><a href="#n1971">1971</a></p> +<p id="n1972" class="pln"><a href="#n1972">1972</a></p> +<p id="n1973" class="pln"><a href="#n1973">1973</a></p> +<p id="n1974" class="pln"><a href="#n1974">1974</a></p> +<p id="n1975" class="pln"><a href="#n1975">1975</a></p> +<p id="n1976" class="pln"><a href="#n1976">1976</a></p> +<p id="n1977" class="pln"><a href="#n1977">1977</a></p> +<p id="n1978" class="pln"><a href="#n1978">1978</a></p> +<p id="n1979" class="pln"><a href="#n1979">1979</a></p> +<p id="n1980" class="pln"><a href="#n1980">1980</a></p> +<p id="n1981" class="pln"><a href="#n1981">1981</a></p> +<p id="n1982" class="pln"><a href="#n1982">1982</a></p> +<p id="n1983" class="pln"><a href="#n1983">1983</a></p> +<p id="n1984" class="pln"><a href="#n1984">1984</a></p> +<p id="n1985" class="pln"><a href="#n1985">1985</a></p> +<p id="n1986" class="pln"><a href="#n1986">1986</a></p> +<p id="n1987" class="pln"><a href="#n1987">1987</a></p> +<p id="n1988" class="pln"><a href="#n1988">1988</a></p> +<p id="n1989" class="pln"><a href="#n1989">1989</a></p> +<p id="n1990" class="pln"><a href="#n1990">1990</a></p> +<p id="n1991" class="pln"><a href="#n1991">1991</a></p> +<p id="n1992" class="pln"><a href="#n1992">1992</a></p> +<p id="n1993" class="pln"><a href="#n1993">1993</a></p> +<p id="n1994" class="pln"><a href="#n1994">1994</a></p> +<p id="n1995" class="pln"><a href="#n1995">1995</a></p> +<p id="n1996" class="pln"><a href="#n1996">1996</a></p> +<p id="n1997" class="pln"><a href="#n1997">1997</a></p> +<p id="n1998" class="pln"><a href="#n1998">1998</a></p> +<p id="n1999" class="pln"><a href="#n1999">1999</a></p> +<p id="n2000" class="pln"><a href="#n2000">2000</a></p> +<p id="n2001" class="pln"><a href="#n2001">2001</a></p> +<p id="n2002" class="pln"><a href="#n2002">2002</a></p> +<p id="n2003" class="pln"><a href="#n2003">2003</a></p> +<p id="n2004" class="stm mis"><a href="#n2004">2004</a></p> +<p id="n2005" class="stm mis"><a href="#n2005">2005</a></p> +<p id="n2006" class="pln"><a href="#n2006">2006</a></p> +<p id="n2007" class="stm mis"><a href="#n2007">2007</a></p> +<p id="n2008" class="stm mis"><a href="#n2008">2008</a></p> +<p id="n2009" class="pln"><a href="#n2009">2009</a></p> +<p id="n2010" class="stm mis"><a href="#n2010">2010</a></p> +<p id="n2011" class="stm mis"><a href="#n2011">2011</a></p> +<p id="n2012" class="pln"><a href="#n2012">2012</a></p> +<p id="n2013" class="stm mis"><a href="#n2013">2013</a></p> +<p id="n2014" class="stm mis"><a href="#n2014">2014</a></p> +<p id="n2015" class="pln"><a href="#n2015">2015</a></p> +<p id="n2016" class="stm mis"><a href="#n2016">2016</a></p> +<p id="n2017" class="stm mis"><a href="#n2017">2017</a></p> +<p id="n2018" class="pln"><a href="#n2018">2018</a></p> +<p id="n2019" class="stm mis"><a href="#n2019">2019</a></p> +<p id="n2020" class="stm mis"><a href="#n2020">2020</a></p> +<p id="n2021" class="pln"><a href="#n2021">2021</a></p> +<p id="n2022" class="stm mis"><a href="#n2022">2022</a></p> +<p id="n2023" class="pln"><a href="#n2023">2023</a></p> +<p id="n2024" class="stm run hide_run"><a href="#n2024">2024</a></p> +<p id="n2025" class="stm mis"><a href="#n2025">2025</a></p> +<p id="n2026" class="stm mis"><a href="#n2026">2026</a></p> +<p id="n2027" class="stm mis"><a href="#n2027">2027</a></p> +<p id="n2028" class="stm mis"><a href="#n2028">2028</a></p> +<p id="n2029" class="pln"><a href="#n2029">2029</a></p> +<p id="n2030" class="pln"><a href="#n2030">2030</a></p> +<p id="n2031" class="stm run hide_run"><a href="#n2031">2031</a></p> +<p id="n2032" class="pln"><a href="#n2032">2032</a></p> +<p id="n2033" class="stm run hide_run"><a href="#n2033">2033</a></p> +<p id="n2034" class="stm mis"><a href="#n2034">2034</a></p> +<p id="n2035" class="pln"><a href="#n2035">2035</a></p> +<p id="n2036" class="pln"><a href="#n2036">2036</a></p> +<p id="n2037" class="pln"><a href="#n2037">2037</a></p> +<p id="n2038" class="pln"><a href="#n2038">2038</a></p> +<p id="n2039" class="pln"><a href="#n2039">2039</a></p> +<p id="n2040" class="pln"><a href="#n2040">2040</a></p> +<p id="n2041" class="pln"><a href="#n2041">2041</a></p> +<p id="n2042" class="pln"><a href="#n2042">2042</a></p> +<p id="n2043" class="pln"><a href="#n2043">2043</a></p> +<p id="n2044" class="pln"><a href="#n2044">2044</a></p> +<p id="n2045" class="pln"><a href="#n2045">2045</a></p> +<p id="n2046" class="pln"><a href="#n2046">2046</a></p> +<p id="n2047" class="pln"><a href="#n2047">2047</a></p> +<p id="n2048" class="pln"><a href="#n2048">2048</a></p> +<p id="n2049" class="pln"><a href="#n2049">2049</a></p> +<p id="n2050" class="pln"><a href="#n2050">2050</a></p> +<p id="n2051" class="stm mis"><a href="#n2051">2051</a></p> +<p id="n2052" class="stm mis"><a href="#n2052">2052</a></p> +<p id="n2053" class="pln"><a href="#n2053">2053</a></p> +<p id="n2054" class="pln"><a href="#n2054">2054</a></p> +<p id="n2055" class="pln"><a href="#n2055">2055</a></p> +<p id="n2056" class="pln"><a href="#n2056">2056</a></p> +<p id="n2057" class="stm mis"><a href="#n2057">2057</a></p> +<p id="n2058" class="pln"><a href="#n2058">2058</a></p> +<p id="n2059" class="stm run hide_run"><a href="#n2059">2059</a></p> +<p id="n2060" class="pln"><a href="#n2060">2060</a></p> +<p id="n2061" class="stm mis"><a href="#n2061">2061</a></p> +<p id="n2062" class="pln"><a href="#n2062">2062</a></p> +<p id="n2063" class="pln"><a href="#n2063">2063</a></p> +<p id="n2064" class="pln"><a href="#n2064">2064</a></p> +<p id="n2065" class="pln"><a href="#n2065">2065</a></p> +<p id="n2066" class="pln"><a href="#n2066">2066</a></p> +<p id="n2067" class="pln"><a href="#n2067">2067</a></p> +<p id="n2068" class="pln"><a href="#n2068">2068</a></p> +<p id="n2069" class="pln"><a href="#n2069">2069</a></p> +<p id="n2070" class="pln"><a href="#n2070">2070</a></p> +<p id="n2071" class="pln"><a href="#n2071">2071</a></p> +<p id="n2072" class="pln"><a href="#n2072">2072</a></p> +<p id="n2073" class="pln"><a href="#n2073">2073</a></p> +<p id="n2074" class="pln"><a href="#n2074">2074</a></p> +<p id="n2075" class="pln"><a href="#n2075">2075</a></p> +<p id="n2076" class="pln"><a href="#n2076">2076</a></p> +<p id="n2077" class="pln"><a href="#n2077">2077</a></p> +<p id="n2078" class="stm mis"><a href="#n2078">2078</a></p> +<p id="n2079" class="stm mis"><a href="#n2079">2079</a></p> +<p id="n2080" class="pln"><a href="#n2080">2080</a></p> +<p id="n2081" class="pln"><a href="#n2081">2081</a></p> +<p id="n2082" class="pln"><a href="#n2082">2082</a></p> +<p id="n2083" class="pln"><a href="#n2083">2083</a></p> +<p id="n2084" class="stm mis"><a href="#n2084">2084</a></p> +<p id="n2085" class="pln"><a href="#n2085">2085</a></p> +<p id="n2086" class="stm run hide_run"><a href="#n2086">2086</a></p> +<p id="n2087" class="stm mis"><a href="#n2087">2087</a></p> +<p id="n2088" class="pln"><a href="#n2088">2088</a></p> +<p id="n2089" class="pln"><a href="#n2089">2089</a></p> +<p id="n2090" class="pln"><a href="#n2090">2090</a></p> +<p id="n2091" class="pln"><a href="#n2091">2091</a></p> +<p id="n2092" class="pln"><a href="#n2092">2092</a></p> +<p id="n2093" class="pln"><a href="#n2093">2093</a></p> +<p id="n2094" class="pln"><a href="#n2094">2094</a></p> +<p id="n2095" class="pln"><a href="#n2095">2095</a></p> +<p id="n2096" class="pln"><a href="#n2096">2096</a></p> +<p id="n2097" class="pln"><a href="#n2097">2097</a></p> +<p id="n2098" class="pln"><a href="#n2098">2098</a></p> +<p id="n2099" class="pln"><a href="#n2099">2099</a></p> +<p id="n2100" class="pln"><a href="#n2100">2100</a></p> +<p id="n2101" class="pln"><a href="#n2101">2101</a></p> +<p id="n2102" class="pln"><a href="#n2102">2102</a></p> +<p id="n2103" class="pln"><a href="#n2103">2103</a></p> +<p id="n2104" class="stm mis"><a href="#n2104">2104</a></p> +<p id="n2105" class="stm mis"><a href="#n2105">2105</a></p> +<p id="n2106" class="pln"><a href="#n2106">2106</a></p> +<p id="n2107" class="pln"><a href="#n2107">2107</a></p> +<p id="n2108" class="pln"><a href="#n2108">2108</a></p> +<p id="n2109" class="pln"><a href="#n2109">2109</a></p> +<p id="n2110" class="stm mis"><a href="#n2110">2110</a></p> +<p id="n2111" class="pln"><a href="#n2111">2111</a></p> +<p id="n2112" class="pln"><a href="#n2112">2112</a></p> +<p id="n2113" class="stm run hide_run"><a href="#n2113">2113</a></p> +<p id="n2114" class="pln"><a href="#n2114">2114</a></p> +<p id="n2115" class="pln"><a href="#n2115">2115</a></p> +<p id="n2116" class="stm run hide_run"><a href="#n2116">2116</a></p> +<p id="n2117" class="pln"><a href="#n2117">2117</a></p> +<p id="n2118" class="stm mis"><a href="#n2118">2118</a></p> +<p id="n2119" class="pln"><a href="#n2119">2119</a></p> +<p id="n2120" class="pln"><a href="#n2120">2120</a></p> +<p id="n2121" class="pln"><a href="#n2121">2121</a></p> +<p id="n2122" class="pln"><a href="#n2122">2122</a></p> +<p id="n2123" class="pln"><a href="#n2123">2123</a></p> +<p id="n2124" class="pln"><a href="#n2124">2124</a></p> +<p id="n2125" class="pln"><a href="#n2125">2125</a></p> +<p id="n2126" class="pln"><a href="#n2126">2126</a></p> +<p id="n2127" class="pln"><a href="#n2127">2127</a></p> +<p id="n2128" class="pln"><a href="#n2128">2128</a></p> +<p id="n2129" class="pln"><a href="#n2129">2129</a></p> +<p id="n2130" class="pln"><a href="#n2130">2130</a></p> +<p id="n2131" class="pln"><a href="#n2131">2131</a></p> +<p id="n2132" class="pln"><a href="#n2132">2132</a></p> +<p id="n2133" class="pln"><a href="#n2133">2133</a></p> +<p id="n2134" class="pln"><a href="#n2134">2134</a></p> +<p id="n2135" class="pln"><a href="#n2135">2135</a></p> +<p id="n2136" class="pln"><a href="#n2136">2136</a></p> +<p id="n2137" class="pln"><a href="#n2137">2137</a></p> +<p id="n2138" class="pln"><a href="#n2138">2138</a></p> +<p id="n2139" class="pln"><a href="#n2139">2139</a></p> +<p id="n2140" class="stm mis"><a href="#n2140">2140</a></p> +<p id="n2141" class="stm mis"><a href="#n2141">2141</a></p> +<p id="n2142" class="stm mis"><a href="#n2142">2142</a></p> +<p id="n2143" class="pln"><a href="#n2143">2143</a></p> +<p id="n2144" class="stm run hide_run"><a href="#n2144">2144</a></p> +<p id="n2145" class="stm mis"><a href="#n2145">2145</a></p> +<p id="n2146" class="pln"><a href="#n2146">2146</a></p> +<p id="n2147" class="pln"><a href="#n2147">2147</a></p> +<p id="n2148" class="pln"><a href="#n2148">2148</a></p> +<p id="n2149" class="pln"><a href="#n2149">2149</a></p> +<p id="n2150" class="pln"><a href="#n2150">2150</a></p> +<p id="n2151" class="stm mis"><a href="#n2151">2151</a></p> +<p id="n2152" class="stm mis"><a href="#n2152">2152</a></p> +<p id="n2153" class="stm mis"><a href="#n2153">2153</a></p> +<p id="n2154" class="pln"><a href="#n2154">2154</a></p> +<p id="n2155" class="stm run hide_run"><a href="#n2155">2155</a></p> +<p id="n2156" class="pln"><a href="#n2156">2156</a></p> +<p id="n2157" class="pln"><a href="#n2157">2157</a></p> +<p id="n2158" class="stm mis"><a href="#n2158">2158</a></p> +<p id="n2159" class="pln"><a href="#n2159">2159</a></p> +<p id="n2160" class="pln"><a href="#n2160">2160</a></p> +<p id="n2161" class="pln"><a href="#n2161">2161</a></p> +<p id="n2162" class="pln"><a href="#n2162">2162</a></p> +<p id="n2163" class="pln"><a href="#n2163">2163</a></p> +<p id="n2164" class="pln"><a href="#n2164">2164</a></p> +<p id="n2165" class="pln"><a href="#n2165">2165</a></p> +<p id="n2166" class="pln"><a href="#n2166">2166</a></p> +<p id="n2167" class="pln"><a href="#n2167">2167</a></p> +<p id="n2168" class="pln"><a href="#n2168">2168</a></p> +<p id="n2169" class="pln"><a href="#n2169">2169</a></p> +<p id="n2170" class="pln"><a href="#n2170">2170</a></p> +<p id="n2171" class="pln"><a href="#n2171">2171</a></p> +<p id="n2172" class="pln"><a href="#n2172">2172</a></p> +<p id="n2173" class="pln"><a href="#n2173">2173</a></p> +<p id="n2174" class="pln"><a href="#n2174">2174</a></p> +<p id="n2175" class="pln"><a href="#n2175">2175</a></p> +<p id="n2176" class="stm mis"><a href="#n2176">2176</a></p> +<p id="n2177" class="stm mis"><a href="#n2177">2177</a></p> +<p id="n2178" class="stm mis"><a href="#n2178">2178</a></p> +<p id="n2179" class="stm mis"><a href="#n2179">2179</a></p> +<p id="n2180" class="stm mis"><a href="#n2180">2180</a></p> +<p id="n2181" class="stm mis"><a href="#n2181">2181</a></p> +<p id="n2182" class="pln"><a href="#n2182">2182</a></p> +<p id="n2183" class="pln"><a href="#n2183">2183</a></p> +<p id="n2184" class="stm run hide_run"><a href="#n2184">2184</a></p> +<p id="n2185" class="pln"><a href="#n2185">2185</a></p> +<p id="n2186" class="stm run hide_run"><a href="#n2186">2186</a></p> +<p id="n2187" class="pln"><a href="#n2187">2187</a></p> +<p id="n2188" class="stm mis"><a href="#n2188">2188</a></p> +<p id="n2189" class="pln"><a href="#n2189">2189</a></p> +<p id="n2190" class="pln"><a href="#n2190">2190</a></p> +<p id="n2191" class="pln"><a href="#n2191">2191</a></p> +<p id="n2192" class="pln"><a href="#n2192">2192</a></p> +<p id="n2193" class="pln"><a href="#n2193">2193</a></p> +<p id="n2194" class="pln"><a href="#n2194">2194</a></p> +<p id="n2195" class="pln"><a href="#n2195">2195</a></p> +<p id="n2196" class="pln"><a href="#n2196">2196</a></p> +<p id="n2197" class="stm mis"><a href="#n2197">2197</a></p> +<p id="n2198" class="stm mis"><a href="#n2198">2198</a></p> +<p id="n2199" class="stm mis"><a href="#n2199">2199</a></p> +<p id="n2200" class="stm mis"><a href="#n2200">2200</a></p> +<p id="n2201" class="pln"><a href="#n2201">2201</a></p> +<p id="n2202" class="stm run hide_run"><a href="#n2202">2202</a></p> +<p id="n2203" class="pln"><a href="#n2203">2203</a></p> +<p id="n2204" class="stm mis"><a href="#n2204">2204</a></p> +<p id="n2205" class="pln"><a href="#n2205">2205</a></p> +<p id="n2206" class="pln"><a href="#n2206">2206</a></p> +<p id="n2207" class="pln"><a href="#n2207">2207</a></p> +<p id="n2208" class="pln"><a href="#n2208">2208</a></p> +<p id="n2209" class="pln"><a href="#n2209">2209</a></p> +<p id="n2210" class="pln"><a href="#n2210">2210</a></p> +<p id="n2211" class="pln"><a href="#n2211">2211</a></p> +<p id="n2212" class="pln"><a href="#n2212">2212</a></p> +<p id="n2213" class="stm mis"><a href="#n2213">2213</a></p> +<p id="n2214" class="stm mis"><a href="#n2214">2214</a></p> +<p id="n2215" class="stm mis"><a href="#n2215">2215</a></p> +<p id="n2216" class="stm mis"><a href="#n2216">2216</a></p> +<p id="n2217" class="stm mis"><a href="#n2217">2217</a></p> +<p id="n2218" class="stm mis"><a href="#n2218">2218</a></p> +<p id="n2219" class="pln"><a href="#n2219">2219</a></p> +<p id="n2220" class="pln"><a href="#n2220">2220</a></p> +<p id="n2221" class="pln"><a href="#n2221">2221</a></p> +<p id="n2222" class="pln"><a href="#n2222">2222</a></p> + + </td> + <td class="text"> +<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="strut"> </span></p> +<p id="t4" class="pln"><span class="str"> Copyright 2004-2015, 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">from</span> <span class="nam">__future__</span> <span class="key">import</span> <span class="nam">absolute_import</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">import</span> <span class="nam">os</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">random</span><span class="op">,</span> <span class="nam">re</span><span class="op">,</span> <span class="nam">shutil</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="t10" class="pln"><span class="strut"> </span></p> +<p id="t11" class="pln"><span class="com"># Use unittest2 if it's available, otherwise unittest. This gives us</span><span class="strut"> </span></p> +<p id="t12" class="pln"><span class="com"># back-ported features for 2.6.</span><span class="strut"> </span></p> +<p id="t13" class="stm run hide_run"><span class="key">try</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t14" class="stm run hide_run"> <span class="key">import</span> <span class="nam">unittest2</span> <span class="key">as</span> <span class="nam">unittest</span><span class="strut"> </span></p> +<p id="t15" class="stm run hide_run"><span class="key">except</span> <span class="nam">ImportError</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t16" class="stm run hide_run"> <span class="key">import</span> <span class="nam">unittest</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="key">from</span> <span class="op">.</span><span class="nam">backward</span> <span class="key">import</span> <span class="nam">StringIO</span><span class="op">,</span> <span class="nam">to_bytes</span><span class="op">,</span> <span class="nam">b</span><span class="strut"> </span></p> +<p id="t19" class="stm run hide_run"><span class="key">from</span> <span class="op">.</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="t20" class="stm run hide_run"><span class="key">from</span> <span class="op">.</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="t21" class="stm run hide_run"><span class="key">from</span> <span class="op">.</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="t22" class="stm run hide_run"><span class="key">from</span> <span class="op">.</span><span class="nam">whiteutils</span> <span class="key">import</span> <span class="nam">reindentBlock</span><span class="strut"> </span></p> +<p id="t23" class="stm run hide_run"><span class="key">from</span> <span class="op">.</span><span class="nam">makefiles</span> <span class="key">import</span> <span class="op">*</span><span class="strut"> </span></p> +<p id="t24" class="pln"><span class="strut"> </span></p> +<p id="t25" class="pln"><span class="strut"> </span></p> +<p id="t26" class="stm run hide_run"><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="strut"> </span></p> +<p id="t27" class="pln"><span class="strut"> </span></p> +<p id="t28" class="pln"><span class="strut"> </span></p> +<p id="t29" 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="t30" class="pln"> <span class="str">""" Test cases for cogapp.Cog()</span><span class="strut"> </span></p> +<p id="t31" class="pln"><span class="str"> """</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">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="t34" 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="t35" class="pln"> <span class="str">''</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t36" class="pln"> <span class="str">' '</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t37" class="pln"> <span class="str">' \t \t \tx'</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t38" class="pln"> <span class="str">'hello'</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t39" class="pln"> <span class="str">'the cat\nin the\nhat.'</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t40" class="pln"> <span class="str">'Horton\n\tHears A\n\t\tWho'</span><span class="strut"> </span></p> +<p id="t41" class="pln"> <span class="op">]</span><span class="strut"> </span></p> +<p id="t42" 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="t43" 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="t44" class="pln"><span class="strut"> </span></p> +<p id="t45" 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="t46" 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="t47" class="pln"><span class="str"> Some text.</span><span class="strut"> </span></p> +<p id="t48" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t49" class="pln"><span class="str"> import cog</span><span class="strut"> </span></p> +<p id="t50" class="pln"><span class="str"> cog.outl("This is line one\\n")</span><span class="strut"> </span></p> +<p id="t51" class="pln"><span class="str"> cog.outl("This is line two")</span><span class="strut"> </span></p> +<p id="t52" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t53" class="pln"><span class="str"> gobbledegook.</span><span class="strut"> </span></p> +<p id="t54" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t55" class="pln"><span class="str"> epilogue.</span><span class="strut"> </span></p> +<p id="t56" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t57" class="pln"><span class="strut"> </span></p> +<p id="t58" 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="t59" class="pln"><span class="str"> Some text.</span><span class="strut"> </span></p> +<p id="t60" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t61" class="pln"><span class="str"> import cog</span><span class="strut"> </span></p> +<p id="t62" class="pln"><span class="str"> cog.outl("This is line one\\n")</span><span class="strut"> </span></p> +<p id="t63" class="pln"><span class="str"> cog.outl("This is line two")</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="str"> This is line one</span><span class="strut"> </span></p> +<p id="t66" class="pln"><span class="strut"> </span></p> +<p id="t67" class="pln"><span class="str"> This is line two</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">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="t73" class="pln"><span class="strut"> </span></p> +<p id="t74" 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="t75" 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="t76" class="pln"> <span class="com"># but it works.</span><span class="strut"> </span></p> +<p id="t77" 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="t78" class="pln"><span class="str"> hello</span><span class="strut"> </span></p> +<p id="t79" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t80" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t81" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t82" class="pln"><span class="str"> goodbye</span><span class="strut"> </span></p> +<p id="t83" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t84" class="pln"><span class="strut"> </span></p> +<p id="t85" 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="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">infile</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">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="t89" class="pln"> <span class="com"># One file can have many cog chunks, even abutting each other.</span><span class="strut"> </span></p> +<p id="t90" 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="t91" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t92" class="pln"><span class="str"> cog.out("chunk1")</span><span class="strut"> </span></p> +<p id="t93" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t94" class="pln"><span class="str"> chunk1</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"> //[[[cog</span><span class="strut"> </span></p> +<p id="t97" class="pln"><span class="str"> cog.out("chunk2")</span><span class="strut"> </span></p> +<p id="t98" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t99" class="pln"><span class="str"> chunk2</span><span class="strut"> </span></p> +<p id="t100" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t101" class="pln"><span class="str"> between chunks</span><span class="strut"> </span></p> +<p id="t102" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t103" class="pln"><span class="str"> cog.out("chunk3")</span><span class="strut"> </span></p> +<p id="t104" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t105" class="pln"><span class="str"> chunk3</span><span class="strut"> </span></p> +<p id="t106" class="pln"><span class="str"> //[[[end]]]</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="strut"> </span></p> +<p id="t109" 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="t110" 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="t111" class="pln"><span class="strut"> </span></p> +<p id="t112" 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="t113" 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="t114" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t115" class="pln"><span class="str"> cog.out("This is line one\\n", trimblanklines=True)</span><span class="strut"> </span></p> +<p id="t116" class="pln"><span class="str"> cog.out('''</span><span class="strut"> </span></p> +<p id="t117" class="pln"><span class="str"> This is line two</span><span class="strut"> </span></p> +<p id="t118" class="pln"><span class="str"> ''', dedent=True, trimblanklines=True)</span><span class="strut"> </span></p> +<p id="t119" class="pln"><span class="str"> cog.outl("This is line three", trimblanklines=True)</span><span class="strut"> </span></p> +<p id="t120" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t121" class="pln"><span class="str"> This is line one</span><span class="strut"> </span></p> +<p id="t122" class="pln"><span class="str"> This is line two</span><span class="strut"> </span></p> +<p id="t123" class="pln"><span class="str"> This is line three</span><span class="strut"> </span></p> +<p id="t124" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t125" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t126" class="pln"><span class="strut"> </span></p> +<p id="t127" 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="t128" 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="t129" class="pln"><span class="strut"> </span></p> +<p id="t130" 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="t131" 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="t132" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t133" class="pln"><span class="str"> cog.out("This is line one\\n", trimblanklines=True)</span><span class="strut"> </span></p> +<p id="t134" class="pln"><span class="str"> cog.out('''</span><span class="strut"> </span></p> +<p id="t135" class="pln"><span class="str"> This is line two</span><span class="strut"> </span></p> +<p id="t136" class="pln"><span class="str"> ''', dedent=True, trimblanklines=True)</span><span class="strut"> </span></p> +<p id="t137" class="pln"><span class="str"> cog.out('', dedent=True, trimblanklines=True)</span><span class="strut"> </span></p> +<p id="t138" class="pln"><span class="str"> cog.outl("This is line three", trimblanklines=True)</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="str"> This is line one</span><span class="strut"> </span></p> +<p id="t141" class="pln"><span class="str"> This is line two</span><span class="strut"> </span></p> +<p id="t142" class="pln"><span class="str"> This is line three</span><span class="strut"> </span></p> +<p id="t143" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t144" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t145" class="pln"><span class="strut"> </span></p> +<p id="t146" 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="t147" 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="t148" class="pln"><span class="strut"> </span></p> +<p id="t149" 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="t150" 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="t151" class="pln"> <span class="com"># last line is indented but didn't end with a newline.</span><span class="strut"> </span></p> +<p id="t152" 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="t153" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t154" class="pln"><span class="str"> import cog</span><span class="strut"> </span></p> +<p id="t155" class="pln"><span class="str"> for i in range(3):</span><span class="strut"> </span></p> +<p id="t156" class="pln"><span class="str"> cog.out("%d\\n" % i)</span><span class="strut"> </span></p> +<p id="t157" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t158" class="pln"><span class="str"> 0</span><span class="strut"> </span></p> +<p id="t159" class="pln"><span class="str"> 1</span><span class="strut"> </span></p> +<p id="t160" class="pln"><span class="str"> 2</span><span class="strut"> </span></p> +<p id="t161" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t162" class="pln"><span class="str"> """</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="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="t165" 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="t166" class="pln"><span class="strut"> </span></p> +<p id="t167" 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="t168" 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="t169" class="pln"><span class="str"> first line</span><span class="strut"> </span></p> +<p id="t170" class="pln"><span class="str"> [[[cog</span><span class="strut"> </span></p> +<p id="t171" class="pln"><span class="str"> import cog</span><span class="strut"> </span></p> +<p id="t172" class="pln"><span class="str"> for i in range(3):</span><span class="strut"> </span></p> +<p id="t173" class="pln"><span class="str"> cog.out("xx%d\\n" % i)</span><span class="strut"> </span></p> +<p id="t174" class="pln"><span class="str"> ]]]</span><span class="strut"> </span></p> +<p id="t175" class="pln"><span class="str"> xx0</span><span class="strut"> </span></p> +<p id="t176" class="pln"><span class="str"> xx1</span><span class="strut"> </span></p> +<p id="t177" class="pln"><span class="str"> xx2</span><span class="strut"> </span></p> +<p id="t178" class="pln"><span class="str"> [[[end]]]</span><span class="strut"> </span></p> +<p id="t179" class="pln"><span class="str"> last line</span><span class="strut"> </span></p> +<p id="t180" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t181" class="pln"><span class="strut"> </span></p> +<p id="t182" 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="t183" 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="t184" class="pln"><span class="strut"> </span></p> +<p id="t185" 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="t186" 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="t187" class="pln"><span class="str"> --[[[cog</span><span class="strut"> </span></p> +<p id="t188" class="pln"><span class="str"> --import cog</span><span class="strut"> </span></p> +<p id="t189" class="pln"><span class="str"> --for i in range(3):</span><span class="strut"> </span></p> +<p id="t190" class="pln"><span class="str"> -- cog.out("xx%d\\n" % i)</span><span class="strut"> </span></p> +<p id="t191" class="pln"><span class="str"> --]]]</span><span class="strut"> </span></p> +<p id="t192" class="pln"><span class="str"> xx0</span><span class="strut"> </span></p> +<p id="t193" class="pln"><span class="str"> xx1</span><span class="strut"> </span></p> +<p id="t194" class="pln"><span class="str"> xx2</span><span class="strut"> </span></p> +<p id="t195" class="pln"><span class="str"> --[[[end]]]</span><span class="strut"> </span></p> +<p id="t196" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t197" class="pln"><span class="strut"> </span></p> +<p id="t198" 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="t199" 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="t200" class="pln"><span class="strut"> </span></p> +<p id="t201" 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="t202" 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="t203" class="pln"><span class="str"> prologue</span><span class="strut"> </span></p> +<p id="t204" class="pln"><span class="str"> --[[[cog</span><span class="strut"> </span></p> +<p id="t205" class="pln"><span class="str"> -- import cog</span><span class="strut"> </span></p> +<p id="t206" class="pln"><span class="str"> -- for i in range(3):</span><span class="strut"> </span></p> +<p id="t207" class="pln"><span class="str"> -- cog.out("xy%d\\n" % i)</span><span class="strut"> </span></p> +<p id="t208" class="pln"><span class="str"> --]]]</span><span class="strut"> </span></p> +<p id="t209" class="pln"><span class="str"> xy0</span><span class="strut"> </span></p> +<p id="t210" class="pln"><span class="str"> xy1</span><span class="strut"> </span></p> +<p id="t211" class="pln"><span class="str"> xy2</span><span class="strut"> </span></p> +<p id="t212" class="pln"><span class="str"> --[[[end]]]</span><span class="strut"> </span></p> +<p id="t213" class="pln"><span class="str"> """</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="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="t216" 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="t217" class="pln"><span class="strut"> </span></p> +<p id="t218" 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="t219" 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="t220" class="pln"><span class="str"> prologue</span><span class="strut"> </span></p> +<p id="t221" class="pln"><span class="str"> #[[[cog</span><span class="strut"> </span></p> +<p id="t222" class="pln"><span class="str"> import cog</span><span class="strut"> </span></p> +<p id="t223" class="pln"><span class="str"> # This comment should not be clobbered by removing the pound sign.</span><span class="strut"> </span></p> +<p id="t224" class="pln"><span class="str"> for i in range(3):</span><span class="strut"> </span></p> +<p id="t225" class="pln"><span class="str"> cog.out("xy%d\\n" % i)</span><span class="strut"> </span></p> +<p id="t226" class="pln"><span class="str"> #]]]</span><span class="strut"> </span></p> +<p id="t227" class="pln"><span class="str"> xy0</span><span class="strut"> </span></p> +<p id="t228" class="pln"><span class="str"> xy1</span><span class="strut"> </span></p> +<p id="t229" class="pln"><span class="str"> xy2</span><span class="strut"> </span></p> +<p id="t230" class="pln"><span class="str"> #[[[end]]]</span><span class="strut"> </span></p> +<p id="t231" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t232" class="pln"><span class="strut"> </span></p> +<p id="t233" 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="t234" 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="t235" class="pln"><span class="strut"> </span></p> +<p id="t236" 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="t237" class="pln"> <span class="com"># If the cog'ed output has no final newline,</span><span class="strut"> </span></p> +<p id="t238" class="pln"> <span class="com"># it shouldn't eat up the cog terminator.</span><span class="strut"> </span></p> +<p id="t239" 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="t240" class="pln"><span class="str"> prologue</span><span class="strut"> </span></p> +<p id="t241" class="pln"><span class="str"> [[[cog</span><span class="strut"> </span></p> +<p id="t242" class="pln"><span class="str"> import cog</span><span class="strut"> </span></p> +<p id="t243" class="pln"><span class="str"> for i in range(3):</span><span class="strut"> </span></p> +<p id="t244" class="pln"><span class="str"> cog.out("%d" % i)</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="str"> 012</span><span class="strut"> </span></p> +<p id="t247" class="pln"><span class="str"> [[[end]]]</span><span class="strut"> </span></p> +<p id="t248" class="pln"><span class="str"> epilogue</span><span class="strut"> </span></p> +<p id="t249" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t250" class="pln"><span class="strut"> </span></p> +<p id="t251" 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="t252" 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="t253" class="pln"><span class="strut"> </span></p> +<p id="t254" 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="t255" class="pln"> <span class="com"># If there is absolutely no cog output, that's ok.</span><span class="strut"> </span></p> +<p id="t256" 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="t257" class="pln"><span class="str"> prologue</span><span class="strut"> </span></p> +<p id="t258" class="pln"><span class="str"> [[[cog</span><span class="strut"> </span></p> +<p id="t259" class="pln"><span class="str"> i = 1</span><span class="strut"> </span></p> +<p id="t260" class="pln"><span class="str"> ]]]</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">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="t269" 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="t270" class="pln"> <span class="com"># prefix, that should be OK.</span><span class="strut"> </span></p> +<p id="t271" class="pln"><span class="strut"> </span></p> +<p id="t272" 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="t273" class="pln"><span class="str"> prologue</span><span class="strut"> </span></p> +<p id="t274" class="pln"><span class="str"> [[[cog</span><span class="strut"> </span></p> +<p id="t275" class="pln"><span class="str"> import sys</span><span class="strut"> </span></p> +<p id="t276" class="pln"><span class="str"> cog.out("Hello")</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="str"> cog.out("There")</span><span class="strut"> </span></p> +<p id="t279" class="pln"><span class="str"> ]]]</span><span class="strut"> </span></p> +<p id="t280" class="pln"><span class="str"> HelloThere</span><span class="strut"> </span></p> +<p id="t281" class="pln"><span class="str"> [[[end]]]</span><span class="strut"> </span></p> +<p id="t282" class="pln"><span class="str"> epilogue</span><span class="strut"> </span></p> +<p id="t283" class="pln"><span class="str"> """</span><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="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="t286" 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="t287" class="pln"><span class="strut"> </span></p> +<p id="t288" 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="t289" class="pln"> <span class="com"># Alexander Belchenko suggested the string argument to outl should</span><span class="strut"> </span></p> +<p id="t290" class="pln"> <span class="com"># be optional. Does it work?</span><span class="strut"> </span></p> +<p id="t291" class="pln"><span class="strut"> </span></p> +<p id="t292" 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="t293" class="pln"><span class="str"> prologue</span><span class="strut"> </span></p> +<p id="t294" class="pln"><span class="str"> [[[cog</span><span class="strut"> </span></p> +<p id="t295" class="pln"><span class="str"> cog.outl("x")</span><span class="strut"> </span></p> +<p id="t296" class="pln"><span class="str"> cog.outl()</span><span class="strut"> </span></p> +<p id="t297" class="pln"><span class="str"> cog.outl("y")</span><span class="strut"> </span></p> +<p id="t298" class="pln"><span class="str"> cog.outl(trimblanklines=True)</span><span class="strut"> </span></p> +<p id="t299" class="pln"><span class="str"> cog.outl("z")</span><span class="strut"> </span></p> +<p id="t300" class="pln"><span class="str"> ]]]</span><span class="strut"> </span></p> +<p id="t301" class="pln"><span class="str"> x</span><span class="strut"> </span></p> +<p id="t302" class="pln"><span class="strut"> </span></p> +<p id="t303" class="pln"><span class="str"> y</span><span class="strut"> </span></p> +<p id="t304" class="pln"><span class="strut"> </span></p> +<p id="t305" class="pln"><span class="str"> z</span><span class="strut"> </span></p> +<p id="t306" class="pln"><span class="str"> [[[end]]]</span><span class="strut"> </span></p> +<p id="t307" class="pln"><span class="str"> epilogue</span><span class="strut"> </span></p> +<p id="t308" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t309" class="pln"><span class="strut"> </span></p> +<p id="t310" 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="t311" 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="t312" class="pln"><span class="strut"> </span></p> +<p id="t313" 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="t314" 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="t315" class="pln"><span class="str"> fooey</span><span class="strut"> </span></p> +<p id="t316" class="pln"><span class="str"> [[[cog</span><span class="strut"> </span></p> +<p id="t317" class="pln"><span class="str"> cog.outl("started at line number %d" % cog.firstLineNum)</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"> started at line number 2</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"> blah blah</span><span class="strut"> </span></p> +<p id="t322" class="pln"><span class="str"> [[[cog</span><span class="strut"> </span></p> +<p id="t323" class="pln"><span class="str"> cog.outl("and again at line %d" % cog.firstLineNum)</span><span class="strut"> </span></p> +<p id="t324" class="pln"><span class="str"> ]]]</span><span class="strut"> </span></p> +<p id="t325" class="pln"><span class="str"> and again at line 8</span><span class="strut"> </span></p> +<p id="t326" class="pln"><span class="str"> [[[end]]]</span><span class="strut"> </span></p> +<p id="t327" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t328" class="pln"><span class="strut"> </span></p> +<p id="t329" 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="t330" 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="t331" class="pln"><span class="strut"> </span></p> +<p id="t332" 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="t333" 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="t334" class="pln"><span class="str"> first line</span><span class="strut"> </span></p> +<p id="t335" class="pln"><span class="str"> hey: [[[cog cog.outl("hello %d" % (3*3*3*3)) ]]] looky!</span><span class="strut"> </span></p> +<p id="t336" class="pln"><span class="str"> get rid of this!</span><span class="strut"> </span></p> +<p id="t337" class="pln"><span class="str"> [[[end]]]</span><span class="strut"> </span></p> +<p id="t338" class="pln"><span class="str"> last line</span><span class="strut"> </span></p> +<p id="t339" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t340" class="pln"><span class="strut"> </span></p> +<p id="t341" 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="t342" class="pln"><span class="str"> first line</span><span class="strut"> </span></p> +<p id="t343" class="pln"><span class="str"> hey: [[[cog cog.outl("hello %d" % (3*3*3*3)) ]]] looky!</span><span class="strut"> </span></p> +<p id="t344" class="pln"><span class="str"> hello 81</span><span class="strut"> </span></p> +<p id="t345" class="pln"><span class="str"> [[[end]]]</span><span class="strut"> </span></p> +<p id="t346" class="pln"><span class="str"> last line</span><span class="strut"> </span></p> +<p id="t347" class="pln"><span class="str"> """</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="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="t350" 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="t351" class="pln"><span class="strut"> </span></p> +<p id="t352" 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="t353" 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="t354" class="pln"><span class="str"> first line</span><span class="strut"> </span></p> +<p id="t355" class="pln"><span class="str"> hey?: ]]] what is this? [[[cog strange!</span><span class="strut"> </span></p> +<p id="t356" class="pln"><span class="str"> get rid of this!</span><span class="strut"> </span></p> +<p id="t357" class="pln"><span class="str"> [[[end]]]</span><span class="strut"> </span></p> +<p id="t358" class="pln"><span class="str"> last line</span><span class="strut"> </span></p> +<p id="t359" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t360" class="stm run hide_run"> <span class="key">with</span> <span class="nam">self</span><span class="op">.</span><span class="nam">assertRaisesRegexp</span><span class="op">(</span><span class="nam">CogError</span><span class="op">,</span> <span class="str">r"infile.txt\(2\): Cog code markers inverted"</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t361" class="stm run hide_run"> <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">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="t362" class="pln"><span class="strut"> </span></p> +<p id="t363" 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="t364" 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="t365" class="pln"><span class="str"> first line</span><span class="strut"> </span></p> +<p id="t366" class="pln"><span class="str"> hey: [[[cog s="hey there" ]]] looky!</span><span class="strut"> </span></p> +<p id="t367" class="pln"><span class="str"> [[[end]]]</span><span class="strut"> </span></p> +<p id="t368" class="pln"><span class="str"> more literal junk.</span><span class="strut"> </span></p> +<p id="t369" class="pln"><span class="str"> [[[cog cog.outl(s) ]]]</span><span class="strut"> </span></p> +<p id="t370" class="pln"><span class="str"> [[[end]]]</span><span class="strut"> </span></p> +<p id="t371" class="pln"><span class="str"> last line</span><span class="strut"> </span></p> +<p id="t372" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t373" class="pln"><span class="strut"> </span></p> +<p id="t374" 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="t375" class="pln"><span class="str"> first line</span><span class="strut"> </span></p> +<p id="t376" class="pln"><span class="str"> hey: [[[cog s="hey there" ]]] looky!</span><span class="strut"> </span></p> +<p id="t377" class="pln"><span class="str"> [[[end]]]</span><span class="strut"> </span></p> +<p id="t378" class="pln"><span class="str"> more literal junk.</span><span class="strut"> </span></p> +<p id="t379" class="pln"><span class="str"> [[[cog cog.outl(s) ]]]</span><span class="strut"> </span></p> +<p id="t380" class="pln"><span class="str"> hey there</span><span class="strut"> </span></p> +<p id="t381" class="pln"><span class="str"> [[[end]]]</span><span class="strut"> </span></p> +<p id="t382" class="pln"><span class="str"> last line</span><span class="strut"> </span></p> +<p id="t383" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t384" class="pln"><span class="strut"> </span></p> +<p id="t385" 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="t386" 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="t387" class="pln"><span class="strut"> </span></p> +<p id="t388" class="stm run hide_run"> <span class="key">def</span> <span class="nam">testAssertInCogCode</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="t389" class="pln"> <span class="com"># Check that we can test assertions in cog code in the test framework.</span><span class="strut"> </span></p> +<p id="t390" 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="t391" class="pln"><span class="str"> [[[cog</span><span class="strut"> </span></p> +<p id="t392" class="pln"><span class="str"> assert 1 == 2, "Oops"</span><span class="strut"> </span></p> +<p id="t393" class="pln"><span class="str"> ]]]</span><span class="strut"> </span></p> +<p id="t394" class="pln"><span class="str"> [[[end]]]</span><span class="strut"> </span></p> +<p id="t395" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t396" 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="t397" class="stm run hide_run"> <span class="key">with</span> <span class="nam">self</span><span class="op">.</span><span class="nam">assertRaisesRegexp</span><span class="op">(</span><span class="nam">AssertionError</span><span class="op">,</span> <span class="str">"Oops"</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t398" class="stm run hide_run"> <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="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">testCogPrevious</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="t401" class="pln"> <span class="com"># Check that we can access the previous run's output.</span><span class="strut"> </span></p> +<p id="t402" 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="t403" class="pln"><span class="str"> [[[cog</span><span class="strut"> </span></p> +<p id="t404" class="pln"><span class="str"> assert cog.previous == "Hello there!\\n", "WTF??"</span><span class="strut"> </span></p> +<p id="t405" class="pln"><span class="str"> cog.out(cog.previous)</span><span class="strut"> </span></p> +<p id="t406" class="pln"><span class="str"> cog.outl("Ran again!")</span><span class="strut"> </span></p> +<p id="t407" class="pln"><span class="str"> ]]]</span><span class="strut"> </span></p> +<p id="t408" class="pln"><span class="str"> Hello there!</span><span class="strut"> </span></p> +<p id="t409" class="pln"><span class="str"> [[[end]]]</span><span class="strut"> </span></p> +<p id="t410" class="pln"><span class="str"> """</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="nam">outfile</span> <span class="op">=</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t413" class="pln"><span class="str"> [[[cog</span><span class="strut"> </span></p> +<p id="t414" class="pln"><span class="str"> assert cog.previous == "Hello there!\\n", "WTF??"</span><span class="strut"> </span></p> +<p id="t415" class="pln"><span class="str"> cog.out(cog.previous)</span><span class="strut"> </span></p> +<p id="t416" class="pln"><span class="str"> cog.outl("Ran again!")</span><span class="strut"> </span></p> +<p id="t417" class="pln"><span class="str"> ]]]</span><span class="strut"> </span></p> +<p id="t418" class="pln"><span class="str"> Hello there!</span><span class="strut"> </span></p> +<p id="t419" class="pln"><span class="str"> Ran again!</span><span class="strut"> </span></p> +<p id="t420" class="pln"><span class="str"> [[[end]]]</span><span class="strut"> </span></p> +<p id="t421" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t422" class="pln"><span class="strut"> </span></p> +<p id="t423" 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="t424" 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="t425" class="pln"><span class="strut"> </span></p> +<p id="t426" class="pln"><span class="strut"> </span></p> +<p id="t427" 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="t428" class="pln"> <span class="str">""" Test the CogOptions class.</span><span class="strut"> </span></p> +<p id="t429" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t430" class="pln"><span class="strut"> </span></p> +<p id="t431" 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="t432" 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="t433" 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="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="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="t436" 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="t437" 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="t438" 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="t439" class="pln"><span class="strut"> </span></p> +<p id="t440" 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="t441" 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="t442" 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="t443" 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="t444" 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="t445" 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="t446" 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="t447" 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="t448" 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="t449" 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="t450" class="pln"><span class="strut"> </span></p> +<p id="t451" 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="t452" class="pln"> <span class="com"># Single-character flags can be combined.</span><span class="strut"> </span></p> +<p id="t453" 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="t454" 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="t455" 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="t456" 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="t457" 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="t458" class="pln"><span class="strut"> </span></p> +<p id="t459" class="stm run hide_run"> <span class="key">def</span> <span class="nam">testMarkers</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="t460" 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="t461" class="stm mis"> <span class="nam">o</span><span class="op">.</span><span class="nam">_parse_markers</span><span class="op">(</span><span class="str">'a b c'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t462" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="str">'a'</span><span class="op">,</span> <span class="nam">o</span><span class="op">.</span><span class="nam">sBeginSpec</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t463" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="str">'b'</span><span class="op">,</span> <span class="nam">o</span><span class="op">.</span><span class="nam">sEndSpec</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t464" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="str">'c'</span><span class="op">,</span> <span class="nam">o</span><span class="op">.</span><span class="nam">sEndOutput</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t465" class="pln"><span class="strut"> </span></p> +<p id="t466" class="stm run hide_run"> <span class="key">def</span> <span class="nam">testMarkersSwitch</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="t467" 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="t468" 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">'--markers'</span><span class="op">,</span> <span class="str">'a b c'</span><span class="op">]</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t469" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="str">'a'</span><span class="op">,</span> <span class="nam">o</span><span class="op">.</span><span class="nam">sBeginSpec</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t470" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="str">'b'</span><span class="op">,</span> <span class="nam">o</span><span class="op">.</span><span class="nam">sEndSpec</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t471" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="str">'c'</span><span class="op">,</span> <span class="nam">o</span><span class="op">.</span><span class="nam">sEndOutput</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t472" class="pln"><span class="strut"> </span></p> +<p id="t473" class="pln"><span class="strut"> </span></p> +<p id="t474" 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="t475" 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="t476" class="pln"><span class="str"> of files.</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="strut"> </span></p> +<p id="t479" 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="t480" 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="t481" class="stm mis"> <span class="key">with</span> <span class="nam">self</span><span class="op">.</span><span class="nam">assertRaisesRegexp</span><span class="op">(</span><span class="nam">CogError</span><span class="op">,</span> <span class="nam">re</span><span class="op">.</span><span class="nam">escape</span><span class="op">(</span><span class="nam">msg</span><span class="op">)</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t482" class="stm mis"> <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="str">'infile.txt'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t483" class="pln"><span class="strut"> </span></p> +<p id="t484" 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="t485" class="stm mis"> <span class="nam">infile</span> <span class="op">=</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t486" class="pln"><span class="str"> Fooey</span><span class="strut"> </span></p> +<p id="t487" class="pln"><span class="str"> #[[[cog</span><span class="strut"> </span></p> +<p id="t488" class="pln"><span class="str"> cog.outl('hello')</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 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="t491" class="pln"><span class="strut"> </span></p> +<p id="t492" 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="t493" class="stm mis"> <span class="nam">infile</span> <span class="op">=</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t494" class="pln"><span class="str"> Fooey</span><span class="strut"> </span></p> +<p id="t495" class="pln"><span class="str"> #[[[cog</span><span class="strut"> </span></p> +<p id="t496" class="pln"><span class="str"> cog.outl('hello')</span><span class="strut"> </span></p> +<p id="t497" class="pln"><span class="str"> #]]]</span><span class="strut"> </span></p> +<p id="t498" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t499" 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="t500" class="pln"><span class="strut"> </span></p> +<p id="t501" class="stm mis"> <span class="nam">infile2</span> <span class="op">=</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t502" class="pln"><span class="str"> Fooey</span><span class="strut"> </span></p> +<p id="t503" class="pln"><span class="str"> #[[[cog</span><span class="strut"> </span></p> +<p id="t504" class="pln"><span class="str"> cog.outl('hello')</span><span class="strut"> </span></p> +<p id="t505" class="pln"><span class="str"> #]]]</span><span class="strut"> </span></p> +<p id="t506" class="pln"><span class="str"> #[[[cog</span><span class="strut"> </span></p> +<p id="t507" class="pln"><span class="str"> cog.outl('goodbye')</span><span class="strut"> </span></p> +<p id="t508" class="pln"><span class="str"> #]]]</span><span class="strut"> </span></p> +<p id="t509" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t510" 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="t511" class="pln"><span class="strut"> </span></p> +<p id="t512" 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="t513" class="stm mis"> <span class="nam">infile</span> <span class="op">=</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t514" class="pln"><span class="str"> #]]]</span><span class="strut"> </span></p> +<p id="t515" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t516" 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="t517" class="pln"><span class="strut"> </span></p> +<p id="t518" class="stm mis"> <span class="nam">infile2</span> <span class="op">=</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t519" class="pln"><span class="str"> #[[[cog</span><span class="strut"> </span></p> +<p id="t520" class="pln"><span class="str"> cog.outl('hello')</span><span class="strut"> </span></p> +<p id="t521" class="pln"><span class="str"> #]]]</span><span class="strut"> </span></p> +<p id="t522" class="pln"><span class="str"> #[[[end]]]</span><span class="strut"> </span></p> +<p id="t523" class="pln"><span class="str"> #]]]</span><span class="strut"> </span></p> +<p id="t524" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t525" 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="t526" class="pln"><span class="strut"> </span></p> +<p id="t527" 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="t528" class="stm mis"> <span class="nam">infile</span> <span class="op">=</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t529" class="pln"><span class="str"> #[[[end]]]</span><span class="strut"> </span></p> +<p id="t530" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t531" 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="t532" class="pln"><span class="strut"> </span></p> +<p id="t533" class="stm mis"> <span class="nam">infile2</span> <span class="op">=</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t534" class="pln"><span class="str"> #[[[cog</span><span class="strut"> </span></p> +<p id="t535" class="pln"><span class="str"> cog.outl('hello')</span><span class="strut"> </span></p> +<p id="t536" class="pln"><span class="str"> #]]]</span><span class="strut"> </span></p> +<p id="t537" class="pln"><span class="str"> #[[[end]]]</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"> """</span><span class="strut"> </span></p> +<p id="t540" 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="t541" class="pln"><span class="strut"> </span></p> +<p id="t542" 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="t543" class="stm mis"> <span class="nam">infile</span> <span class="op">=</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t544" class="pln"><span class="str"> #[[[cog</span><span class="strut"> </span></p> +<p id="t545" class="pln"><span class="str"> cog.outl("hello")</span><span class="strut"> </span></p> +<p id="t546" class="pln"><span class="str"> #[[[end]]]</span><span class="strut"> </span></p> +<p id="t547" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t548" 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="t549" class="pln"><span class="strut"> </span></p> +<p id="t550" class="stm mis"> <span class="nam">infile2</span> <span class="op">=</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t551" class="pln"><span class="str"> #[[[cog</span><span class="strut"> </span></p> +<p id="t552" class="pln"><span class="str"> cog.outl('hello')</span><span class="strut"> </span></p> +<p id="t553" class="pln"><span class="str"> #]]]</span><span class="strut"> </span></p> +<p id="t554" class="pln"><span class="str"> #[[[end]]]</span><span class="strut"> </span></p> +<p id="t555" class="pln"><span class="str"> #[[[cog</span><span class="strut"> </span></p> +<p id="t556" class="pln"><span class="str"> cog.outl("hello")</span><span class="strut"> </span></p> +<p id="t557" class="pln"><span class="str"> #[[[end]]]</span><span class="strut"> </span></p> +<p id="t558" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t559" 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="t560" class="pln"><span class="strut"> </span></p> +<p id="t561" 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="t562" class="stm mis"> <span class="nam">infile</span> <span class="op">=</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t563" class="pln"><span class="str"> #[[[cog</span><span class="strut"> </span></p> +<p id="t564" class="pln"><span class="str"> #[[[cog</span><span class="strut"> </span></p> +<p id="t565" class="pln"><span class="str"> cog.outl("hello")</span><span class="strut"> </span></p> +<p id="t566" class="pln"><span class="str"> #]]]</span><span class="strut"> </span></p> +<p id="t567" class="pln"><span class="str"> #[[[end]]]</span><span class="strut"> </span></p> +<p id="t568" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t569" 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="t570" class="pln"><span class="strut"> </span></p> +<p id="t571" class="stm mis"> <span class="nam">infile2</span> <span class="op">=</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t572" class="pln"><span class="str"> #[[[cog</span><span class="strut"> </span></p> +<p id="t573" class="pln"><span class="str"> cog.outl("hello")</span><span class="strut"> </span></p> +<p id="t574" class="pln"><span class="str"> #]]]</span><span class="strut"> </span></p> +<p id="t575" class="pln"><span class="str"> #[[[end]]]</span><span class="strut"> </span></p> +<p id="t576" class="pln"><span class="str"> #[[[cog</span><span class="strut"> </span></p> +<p id="t577" class="pln"><span class="str"> #[[[cog</span><span class="strut"> </span></p> +<p id="t578" class="pln"><span class="str"> cog.outl("hello")</span><span class="strut"> </span></p> +<p id="t579" class="pln"><span class="str"> #]]]</span><span class="strut"> </span></p> +<p id="t580" class="pln"><span class="str"> #[[[end]]]</span><span class="strut"> </span></p> +<p id="t581" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t582" 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="t583" class="pln"><span class="strut"> </span></p> +<p id="t584" 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="t585" class="stm mis"> <span class="nam">infile</span> <span class="op">=</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t586" class="pln"><span class="str"> #[[[cog</span><span class="strut"> </span></p> +<p id="t587" class="pln"><span class="str"> cog.outl("hello")</span><span class="strut"> </span></p> +<p id="t588" class="pln"><span class="str"> #]]]</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="str"> #[[[end]]]</span><span class="strut"> </span></p> +<p id="t591" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t592" 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="t593" class="pln"><span class="strut"> </span></p> +<p id="t594" class="stm mis"> <span class="nam">infile2</span> <span class="op">=</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t595" class="pln"><span class="str"> #[[[cog</span><span class="strut"> </span></p> +<p id="t596" class="pln"><span class="str"> cog.outl("hello")</span><span class="strut"> </span></p> +<p id="t597" class="pln"><span class="str"> #]]]</span><span class="strut"> </span></p> +<p id="t598" class="pln"><span class="str"> #[[[end]]]</span><span class="strut"> </span></p> +<p id="t599" class="pln"><span class="str"> #[[[cog</span><span class="strut"> </span></p> +<p id="t600" class="pln"><span class="str"> cog.outl("hello")</span><span class="strut"> </span></p> +<p id="t601" class="pln"><span class="str"> #]]]</span><span class="strut"> </span></p> +<p id="t602" class="pln"><span class="str"> #]]]</span><span class="strut"> </span></p> +<p id="t603" class="pln"><span class="str"> #[[[end]]]</span><span class="strut"> </span></p> +<p id="t604" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t605" 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="t606" class="pln"><span class="strut"> </span></p> +<p id="t607" class="pln"><span class="strut"> </span></p> +<p id="t608" 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="t609" class="pln"> <span class="str">""" Test cases for cog.error().</span><span class="strut"> </span></p> +<p id="t610" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t611" class="pln"><span class="strut"> </span></p> +<p id="t612" 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="t613" class="stm mis"> <span class="nam">infile</span> <span class="op">=</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t614" class="pln"><span class="str"> [[[cog cog.error("This ain't right!")]]]</span><span class="strut"> </span></p> +<p id="t615" class="pln"><span class="str"> [[[end]]]</span><span class="strut"> </span></p> +<p id="t616" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t617" class="pln"><span class="strut"> </span></p> +<p id="t618" 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="t619" class="stm mis"> <span class="key">with</span> <span class="nam">self</span><span class="op">.</span><span class="nam">assertRaisesRegexp</span><span class="op">(</span><span class="nam">CogGeneratedError</span><span class="op">,</span> <span class="str">"This ain't right!"</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t620" class="stm mis"> <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="strut"> </span></p> +<p id="t621" class="pln"><span class="strut"> </span></p> +<p id="t622" 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="t623" class="stm mis"> <span class="nam">infile</span> <span class="op">=</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t624" class="pln"><span class="str"> [[[cog cog.error()]]]</span><span class="strut"> </span></p> +<p id="t625" class="pln"><span class="str"> [[[end]]]</span><span class="strut"> </span></p> +<p id="t626" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t627" class="pln"><span class="strut"> </span></p> +<p id="t628" 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="t629" class="stm mis"> <span class="key">with</span> <span class="nam">self</span><span class="op">.</span><span class="nam">assertRaisesRegexp</span><span class="op">(</span><span class="nam">CogGeneratedError</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="t630" class="stm mis"> <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="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">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="t633" class="stm mis"> <span class="nam">infile</span> <span class="op">=</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t634" class="pln"><span class="str"> --[[[cog</span><span class="strut"> </span></p> +<p id="t635" class="pln"><span class="str"> --import cog</span><span class="strut"> </span></p> +<p id="t636" class="pln"><span class="str"> --for i in range(3):</span><span class="strut"> </span></p> +<p id="t637" class="pln"><span class="str"> -- if i > 10:</span><span class="strut"> </span></p> +<p id="t638" class="pln"><span class="str"> -- cog.error("Something is amiss!")</span><span class="strut"> </span></p> +<p id="t639" class="pln"><span class="str"> -- cog.out("xx%d\\n" % i)</span><span class="strut"> </span></p> +<p id="t640" class="pln"><span class="str"> --]]]</span><span class="strut"> </span></p> +<p id="t641" class="pln"><span class="str"> xx0</span><span class="strut"> </span></p> +<p id="t642" class="pln"><span class="str"> xx1</span><span class="strut"> </span></p> +<p id="t643" class="pln"><span class="str"> xx2</span><span class="strut"> </span></p> +<p id="t644" class="pln"><span class="str"> --[[[end]]]</span><span class="strut"> </span></p> +<p id="t645" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t646" class="pln"><span class="strut"> </span></p> +<p id="t647" 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="t648" 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="t649" class="pln"><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">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="t652" class="pln"> <span class="str">""" Unit tests against CogGenerator to see if its getCode() method works</span><span class="strut"> </span></p> +<p id="t653" class="pln"><span class="str"> properly.</span><span class="strut"> </span></p> +<p id="t654" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t655" class="pln"><span class="strut"> </span></p> +<p id="t656" 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="t657" 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="t658" class="pln"><span class="str"> the functions we're going to use.</span><span class="strut"> </span></p> +<p id="t659" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t660" 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="t661" 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="t662" 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="t663" class="pln"><span class="strut"> </span></p> +<p id="t664" 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="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'</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">m</span><span class="op">(</span><span class="str">'// ]]]'</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">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="t668" class="pln"><span class="strut"> </span></p> +<p id="t669" 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="t670" 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="t671" 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="t672" 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="t673" 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="t674" 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="t675" class="pln"><span class="strut"> </span></p> +<p id="t676" 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="t677" class="pln"> <span class="com"># For a while, I supported compressed code blocks, but no longer.</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">'// [[[cog: print """'</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">l</span><span class="op">(</span><span class="str">'// hello'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t680" 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="t681" 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="t682" 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="t683" class="pln"><span class="strut"> </span></p> +<p id="t684" 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="t685" class="pln"> <span class="com"># For a while, I supported compressed code blocks, but no longer.</span><span class="strut"> </span></p> +<p id="t686" 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="t687" 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="t688" 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="t689" 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="t690" 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="t691" class="pln"><span class="strut"> </span></p> +<p id="t692" 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="t693" class="pln"> <span class="com"># For a while, I supported compressed code blocks, but no longer.</span><span class="strut"> </span></p> +<p id="t694" 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="t695" 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="t696" 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="t697" 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="t698" 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="t699" class="pln"><span class="strut"> </span></p> +<p id="t700" 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="t701" class="pln"> <span class="com"># For a while, I supported compressed code blocks, but no longer.</span><span class="strut"> </span></p> +<p id="t702" 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="t703" 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="t704" 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="t705" 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="t706" 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="t707" class="pln"><span class="strut"> </span></p> +<p id="t708" 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="t709" 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="t710" class="pln"> <span class="com"># C++ compiler.</span><span class="strut"> </span></p> +<p id="t711" 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="t712" 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="t713" 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="t714" 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="t715" 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="t716" 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="t717" class="pln"><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">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="t720" class="pln"><span class="strut"> </span></p> +<p id="t721" 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="t722" class="pln"> <span class="str">""" Initialize the cog members for another run.</span><span class="strut"> </span></p> +<p id="t723" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t724" class="pln"> <span class="com"># Create a cog engine, and catch its output.</span><span class="strut"> </span></p> +<p id="t725" 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="t726" 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="op">)</span><span class="strut"> </span></p> +<p id="t727" 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="t728" class="pln"><span class="strut"> </span></p> +<p id="t729" 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="t730" class="pln"> <span class="com"># Create a temporary directory.</span><span class="strut"> </span></p> +<p id="t731" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">tempdir</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">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="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="t732" 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">tempdir</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t733" 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="t734" 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="t735" 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="t736" class="pln"><span class="strut"> </span></p> +<p id="t737" 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="t738" 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="t739" class="pln"> <span class="com"># Get rid of the temporary directory.</span><span class="strut"> </span></p> +<p id="t740" class="stm mis"> <span class="nam">shutil</span><span class="op">.</span><span class="nam">rmtree</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="t741" class="pln"><span class="strut"> </span></p> +<p id="t742" 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="t743" class="stm mis"> <span class="nam">text1</span> <span class="op">=</span> <span class="nam">open</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">tempdir</span><span class="op">,</span> <span class="nam">sFName1</span><span class="op">)</span><span class="op">,</span> <span class="str">'rb'</span><span class="op">)</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="t744" class="stm mis"> <span class="nam">text2</span> <span class="op">=</span> <span class="nam">open</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">tempdir</span><span class="op">,</span> <span class="nam">sFName2</span><span class="op">)</span><span class="op">,</span> <span class="str">'rb'</span><span class="op">)</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="t745" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">text1</span><span class="op">,</span> <span class="nam">text2</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t746" class="pln"><span class="strut"> </span></p> +<p id="t747" 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="t748" class="stm mis"> <span class="nam">sAbsName</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">tempdir</span><span class="op">,</span> <span class="nam">sFName</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t749" 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="t750" class="stm mis"> <span class="key">try</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t751" 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="t752" class="pln"> <span class="key">finally</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t753" 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="t754" 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">to_bytes</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="t755" class="pln"><span class="strut"> </span></p> +<p id="t756" class="pln"><span class="strut"> </span></p> +<p id="t757" 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="t758" class="pln"><span class="strut"> </span></p> +<p id="t759" 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="t760" class="pln"> <span class="com"># Return value 2 means usage problem.</span><span class="strut"> </span></p> +<p id="t761" 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">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="t762" 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="t763" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertIn</span><span class="op">(</span><span class="str">"option -j not recognized"</span><span class="op">,</span> <span class="nam">output</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t764" class="stm mis"> <span class="key">with</span> <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="op">:</span><span class="strut"> </span></p> +<p id="t765" 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="op">)</span><span class="strut"> </span></p> +<p id="t766" class="stm mis"> <span class="key">with</span> <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="op">:</span><span class="strut"> </span></p> +<p id="t767" 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">'-j'</span><span class="op">]</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t768" class="pln"><span class="strut"> </span></p> +<p id="t769" 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="t770" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t771" class="pln"> <span class="str">'cogfiles.txt'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t772" class="pln"><span class="str"> # Please run cog</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="op">}</span><span class="strut"> </span></p> +<p id="t775" class="pln"><span class="strut"> </span></p> +<p id="t776" 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="t777" class="stm mis"> <span class="key">with</span> <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="op">:</span><span class="strut"> </span></p> +<p id="t778" 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">'foo'</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="t779" class="pln"><span class="strut"> </span></p> +<p id="t780" 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="t781" 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">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="t782" 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="t783" 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="t784" class="pln"><span class="strut"> </span></p> +<p id="t785" 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="t786" 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="t787" 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="t788" 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">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="t789" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</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="t790" class="pln"><span class="strut"> </span></p> +<p id="t791" 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="t792" class="pln"> <span class="com"># -h or -? anywhere on the command line should just print help.</span><span class="strut"> </span></p> +<p id="t793" 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="t794" 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="t795" 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="t796" 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="t797" class="pln"><span class="strut"> </span></p> +<p id="t798" 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="t799" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t800" class="pln"> <span class="str">'cogfile.txt'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t801" class="pln"><span class="str"> # Please run cog</span><span class="strut"> </span></p> +<p id="t802" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t803" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t804" class="pln"><span class="strut"> </span></p> +<p id="t805" 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="t806" class="stm mis"> <span class="key">with</span> <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="op">:</span><span class="strut"> </span></p> +<p id="t807" 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">'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="strut"> </span></p> +<p id="t808" class="pln"><span class="strut"> </span></p> +<p id="t809" 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="t810" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t811" class="pln"> <span class="str">'test.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t812" class="pln"><span class="str"> // This is my C++ file.</span><span class="strut"> </span></p> +<p id="t813" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t814" class="pln"><span class="str"> fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing']</span><span class="strut"> </span></p> +<p id="t815" class="pln"><span class="str"> for fn in fnames:</span><span class="strut"> </span></p> +<p id="t816" class="pln"><span class="str"> cog.outl("void %s();" % fn)</span><span class="strut"> </span></p> +<p id="t817" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t818" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t819" class="pln"><span class="strut"> </span></p> +<p id="t820" class="pln"> <span class="str">'test.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t821" class="pln"><span class="str"> // This is my C++ file.</span><span class="strut"> </span></p> +<p id="t822" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t823" class="pln"><span class="str"> fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing']</span><span class="strut"> </span></p> +<p id="t824" class="pln"><span class="str"> for fn in fnames:</span><span class="strut"> </span></p> +<p id="t825" class="pln"><span class="str"> cog.outl("void %s();" % fn)</span><span class="strut"> </span></p> +<p id="t826" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t827" class="pln"><span class="str"> void DoSomething();</span><span class="strut"> </span></p> +<p id="t828" class="pln"><span class="str"> void DoAnotherThing();</span><span class="strut"> </span></p> +<p id="t829" class="pln"><span class="str"> void DoLastThing();</span><span class="strut"> </span></p> +<p id="t830" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t831" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t832" class="pln"><span class="strut"> </span></p> +<p id="t833" 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="t834" class="stm mis"> <span class="key">with</span> <span class="nam">self</span><span class="op">.</span><span class="nam">assertRaisesRegexp</span><span class="op">(</span><span class="nam">CogError</span><span class="op">,</span> <span class="nam">re</span><span class="op">.</span><span class="nam">escape</span><span class="op">(</span><span class="str">"test.cog(6): Missing '[[[end]]]' before end of file."</span><span class="op">)</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t835" 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="t836" 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="t837" 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="t838" 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="t839" class="pln"><span class="strut"> </span></p> +<p id="t840" 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="t841" class="stm mis"> <span class="key">with</span> <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="op">:</span><span class="strut"> </span></p> +<p id="t842" 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">'-Dfooey'</span><span class="op">,</span> <span class="str">'cog.txt'</span><span class="op">]</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t843" class="stm mis"> <span class="key">with</span> <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="op">:</span><span class="strut"> </span></p> +<p id="t844" 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">'fooey'</span><span class="op">,</span> <span class="str">'cog.txt'</span><span class="op">]</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t845" class="pln"><span class="strut"> </span></p> +<p id="t846" class="stm run hide_run"> <span class="key">def</span> <span class="nam">testBadMarkers</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="t847" class="stm mis"> <span class="key">with</span> <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="op">:</span><span class="strut"> </span></p> +<p id="t848" 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">'--markers=X'</span><span class="op">]</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t849" class="stm mis"> <span class="key">with</span> <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="op">:</span><span class="strut"> </span></p> +<p id="t850" 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">'--markers=A B C D'</span><span class="op">]</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t851" class="pln"><span class="strut"> </span></p> +<p id="t852" class="pln"><span class="strut"> </span></p> +<p id="t853" 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="t854" class="pln"><span class="strut"> </span></p> +<p id="t855" 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="t856" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t857" class="pln"> <span class="str">'test.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t858" class="pln"><span class="str"> // This is my C++ file.</span><span class="strut"> </span></p> +<p id="t859" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t860" class="pln"><span class="str"> fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing']</span><span class="strut"> </span></p> +<p id="t861" class="pln"><span class="str"> for fn in fnames:</span><span class="strut"> </span></p> +<p id="t862" class="pln"><span class="str"> cog.outl("void %s();" % fn)</span><span class="strut"> </span></p> +<p id="t863" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t864" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t865" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t866" class="pln"><span class="strut"> </span></p> +<p id="t867" class="pln"> <span class="str">'test.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t868" class="pln"><span class="str"> // This is my C++ file.</span><span class="strut"> </span></p> +<p id="t869" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t870" class="pln"><span class="str"> fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing']</span><span class="strut"> </span></p> +<p id="t871" class="pln"><span class="str"> for fn in fnames:</span><span class="strut"> </span></p> +<p id="t872" class="pln"><span class="str"> cog.outl("void %s();" % fn)</span><span class="strut"> </span></p> +<p id="t873" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t874" class="pln"><span class="str"> void DoSomething();</span><span class="strut"> </span></p> +<p id="t875" class="pln"><span class="str"> void DoAnotherThing();</span><span class="strut"> </span></p> +<p id="t876" class="pln"><span class="str"> void DoLastThing();</span><span class="strut"> </span></p> +<p id="t877" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t878" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t879" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t880" class="pln"><span class="strut"> </span></p> +<p id="t881" 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="t882" 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="t883" 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="t884" 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="t885" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertIn</span><span class="op">(</span><span class="str">"(changed)"</span><span class="op">,</span> <span class="nam">output</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t886" class="pln"><span class="strut"> </span></p> +<p id="t887" 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="t888" class="pln"> <span class="com"># -o sets the output file.</span><span class="strut"> </span></p> +<p id="t889" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t890" class="pln"> <span class="str">'test.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t891" class="pln"><span class="str"> // This is my C++ file.</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"> fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing']</span><span class="strut"> </span></p> +<p id="t894" class="pln"><span class="str"> for fn in fnames:</span><span class="strut"> </span></p> +<p id="t895" class="pln"><span class="str"> cog.outl("void %s();" % fn)</span><span class="strut"> </span></p> +<p id="t896" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t897" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t898" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t899" class="pln"><span class="strut"> </span></p> +<p id="t900" class="pln"> <span class="str">'test.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t901" class="pln"><span class="str"> // This is my C++ file.</span><span class="strut"> </span></p> +<p id="t902" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t903" class="pln"><span class="str"> fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing']</span><span class="strut"> </span></p> +<p id="t904" class="pln"><span class="str"> for fn in fnames:</span><span class="strut"> </span></p> +<p id="t905" class="pln"><span class="str"> cog.outl("void %s();" % fn)</span><span class="strut"> </span></p> +<p id="t906" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t907" class="pln"><span class="str"> void DoSomething();</span><span class="strut"> </span></p> +<p id="t908" class="pln"><span class="str"> void DoAnotherThing();</span><span class="strut"> </span></p> +<p id="t909" class="pln"><span class="str"> void DoLastThing();</span><span class="strut"> </span></p> +<p id="t910" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t911" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t912" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t913" class="pln"><span class="strut"> </span></p> +<p id="t914" 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="t915" 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="t916" 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="t917" class="pln"><span class="strut"> </span></p> +<p id="t918" 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="t919" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t920" class="pln"> <span class="str">'one.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t921" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t922" class="pln"><span class="str"> cog.outl("hello world")</span><span class="strut"> </span></p> +<p id="t923" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t924" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t925" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t926" class="pln"><span class="strut"> </span></p> +<p id="t927" class="pln"> <span class="str">'one.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t928" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t929" class="pln"><span class="str"> cog.outl("hello world")</span><span class="strut"> </span></p> +<p id="t930" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t931" class="pln"><span class="str"> hello world</span><span class="strut"> </span></p> +<p id="t932" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t933" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t934" class="pln"><span class="strut"> </span></p> +<p id="t935" class="pln"> <span class="str">'two.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t936" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t937" class="pln"><span class="str"> cog.outl("goodbye cruel world")</span><span class="strut"> </span></p> +<p id="t938" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t939" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t940" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t941" class="pln"><span class="strut"> </span></p> +<p id="t942" class="pln"> <span class="str">'two.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t943" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t944" class="pln"><span class="str"> cog.outl("goodbye cruel world")</span><span class="strut"> </span></p> +<p id="t945" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t946" class="pln"><span class="str"> goodbye cruel world</span><span class="strut"> </span></p> +<p id="t947" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t948" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t949" class="pln"><span class="strut"> </span></p> +<p id="t950" class="pln"> <span class="str">'cogfiles.txt'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t951" class="pln"><span class="str"> # Please run cog</span><span class="strut"> </span></p> +<p id="t952" class="pln"><span class="str"> one.cog</span><span class="strut"> </span></p> +<p id="t953" class="pln"><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="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="nam">self</span><span class="op">.</span><span class="nam">assertIn</span><span class="op">(</span><span class="str">"(changed)"</span><span class="op">,</span> <span class="nam">output</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">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="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">'one.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("hello world")</span><span class="strut"> </span></p> +<p id="t970" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t971" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t972" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t973" class="pln"><span class="strut"> </span></p> +<p id="t974" class="pln"> <span class="str">'one.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t975" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t976" class="pln"><span class="str"> cog.outl("hello world")</span><span class="strut"> </span></p> +<p id="t977" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t978" class="pln"><span class="str"> hello world</span><span class="strut"> </span></p> +<p id="t979" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t980" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t981" class="pln"><span class="strut"> </span></p> +<p id="t982" class="pln"> <span class="str">'two.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t983" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t984" class="pln"><span class="str"> cog.outl("goodbye cruel world")</span><span class="strut"> </span></p> +<p id="t985" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t986" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t987" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t988" class="pln"><span class="strut"> </span></p> +<p id="t989" class="pln"> <span class="str">'two.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t990" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t991" class="pln"><span class="str"> cog.outl("goodbye cruel world")</span><span class="strut"> </span></p> +<p id="t992" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t993" class="pln"><span class="str"> goodbye cruel world</span><span class="strut"> </span></p> +<p id="t994" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t995" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t996" class="pln"><span class="strut"> </span></p> +<p id="t997" class="pln"> <span class="str">'cogfiles.txt'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t998" class="pln"><span class="str"> # Please run cog</span><span class="strut"> </span></p> +<p id="t999" class="pln"><span class="str"> one.cog</span><span class="strut"> </span></p> +<p id="t1000" class="pln"><span class="str"> @cogfiles2.txt</span><span class="strut"> </span></p> +<p id="t1001" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1002" class="pln"><span class="strut"> </span></p> +<p id="t1003" class="pln"> <span class="str">'cogfiles2.txt'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1004" class="pln"><span class="str"> # This one too, please.</span><span class="strut"> </span></p> +<p id="t1005" class="pln"><span class="str"> two.cog</span><span class="strut"> </span></p> +<p id="t1006" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1007" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t1008" class="pln"><span class="strut"> </span></p> +<p id="t1009" 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="t1010" 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="t1011" 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="t1012" 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="t1013" 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="t1014" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertIn</span><span class="op">(</span><span class="str">"(changed)"</span><span class="op">,</span> <span class="nam">output</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t1015" class="pln"><span class="strut"> </span></p> +<p id="t1016" 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="t1017" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t1018" class="pln"> <span class="str">'both.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1019" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1020" class="pln"><span class="str"> cog.outl("one: %s" % ('one' in globals()))</span><span class="strut"> </span></p> +<p id="t1021" class="pln"><span class="str"> cog.outl("two: %s" % ('two' in globals()))</span><span class="strut"> </span></p> +<p id="t1022" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1023" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t1024" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1025" class="pln"><span class="strut"> </span></p> +<p id="t1026" class="pln"> <span class="str">'one.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1027" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1028" class="pln"><span class="str"> cog.outl("one: %s" % ('one' in globals()))</span><span class="strut"> </span></p> +<p id="t1029" class="pln"><span class="str"> cog.outl("two: %s" % ('two' in globals()))</span><span class="strut"> </span></p> +<p id="t1030" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1031" class="pln"><span class="str"> one: True // ONE</span><span class="strut"> </span></p> +<p id="t1032" class="pln"><span class="str"> two: False // ONE</span><span class="strut"> </span></p> +<p id="t1033" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t1034" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1035" class="pln"><span class="strut"> </span></p> +<p id="t1036" class="pln"> <span class="str">'two.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1037" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1038" class="pln"><span class="str"> cog.outl("one: %s" % ('one' in globals()))</span><span class="strut"> </span></p> +<p id="t1039" class="pln"><span class="str"> cog.outl("two: %s" % ('two' in globals()))</span><span class="strut"> </span></p> +<p id="t1040" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1041" class="pln"><span class="str"> one: False // TWO</span><span class="strut"> </span></p> +<p id="t1042" class="pln"><span class="str"> two: True // TWO</span><span class="strut"> </span></p> +<p id="t1043" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t1044" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1045" class="pln"><span class="strut"> </span></p> +<p id="t1046" class="pln"> <span class="str">'cogfiles.txt'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1047" class="pln"><span class="str"> # Please run cog</span><span class="strut"> </span></p> +<p id="t1048" class="pln"><span class="str"> both.cog -o both.one -s ' // ONE' -D one=x</span><span class="strut"> </span></p> +<p id="t1049" class="pln"><span class="str"> both.cog -o both.two -s ' // TWO' -D two=x</span><span class="strut"> </span></p> +<p id="t1050" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t1051" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t1052" class="pln"><span class="strut"> </span></p> +<p id="t1053" 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="t1054" 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="t1055" 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="t1056" 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="t1057" class="pln"><span class="strut"> </span></p> +<p id="t1058" 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="t1059" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t1060" class="pln"> <span class="str">'both.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1061" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1062" class="pln"><span class="str"> cog.outl("one: %s" % ('one' in globals()))</span><span class="strut"> </span></p> +<p id="t1063" class="pln"><span class="str"> cog.outl("two: %s" % ('two' in globals()))</span><span class="strut"> </span></p> +<p id="t1064" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1065" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t1066" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1067" class="pln"><span class="strut"> </span></p> +<p id="t1068" class="pln"> <span class="str">'cogfiles.txt'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1069" class="pln"><span class="str"> # Please run cog</span><span class="strut"> </span></p> +<p id="t1070" class="pln"><span class="str"> both.cog</span><span class="strut"> </span></p> +<p id="t1071" class="pln"><span class="str"> both.cog -d # This is bad: -r and -d</span><span class="strut"> </span></p> +<p id="t1072" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t1073" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t1074" class="pln"><span class="strut"> </span></p> +<p id="t1075" 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="t1076" class="stm mis"> <span class="key">with</span> <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="op">:</span><span class="strut"> </span></p> +<p id="t1077" 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="t1078" class="pln"><span class="strut"> </span></p> +<p id="t1079" 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="t1080" class="stm mis"> <span class="key">def</span> <span class="nam">fix_backslashes</span><span class="op">(</span><span class="nam">files_txt</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t1081" class="pln"> <span class="str">"""Make the contents of a files.txt sensitive to the platform."""</span><span class="strut"> </span></p> +<p id="t1082" class="stm mis"> <span class="key">if</span> <span class="nam">sys</span><span class="op">.</span><span class="nam">platform</span> <span class="op">!=</span> <span class="str">"win32"</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t1083" class="stm mis"> <span class="nam">files_txt</span> <span class="op">=</span> <span class="nam">files_txt</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="t1084" class="stm mis"> <span class="key">return</span> <span class="nam">files_txt</span><span class="strut"> </span></p> +<p id="t1085" class="pln"><span class="strut"> </span></p> +<p id="t1086" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t1087" class="pln"> <span class="str">'one 1.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1088" class="pln"><span class="str"> //[[[cog cog.outl("hello world") ]]]</span><span class="strut"> </span></p> +<p id="t1089" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1090" class="pln"><span class="strut"> </span></p> +<p id="t1091" class="pln"> <span class="str">'one.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1092" class="pln"><span class="str"> //[[[cog cog.outl("hello world") ]]]</span><span class="strut"> </span></p> +<p id="t1093" class="pln"><span class="str"> hello world //xxx</span><span class="strut"> </span></p> +<p id="t1094" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1095" class="pln"><span class="strut"> </span></p> +<p id="t1096" class="pln"> <span class="str">'subdir'</span><span class="op">:</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t1097" class="pln"> <span class="str">'subback.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1098" class="pln"><span class="str"> //[[[cog cog.outl("down deep with backslashes") ]]]</span><span class="strut"> </span></p> +<p id="t1099" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1100" class="pln"><span class="strut"> </span></p> +<p id="t1101" class="pln"> <span class="str">'subfwd.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1102" class="pln"><span class="str"> //[[[cog cog.outl("down deep with slashes") ]]]</span><span class="strut"> </span></p> +<p id="t1103" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1104" class="pln"> <span class="op">}</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1105" class="pln"><span class="strut"> </span></p> +<p id="t1106" class="pln"> <span class="str">'subback.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1107" class="pln"><span class="str"> //[[[cog cog.outl("down deep with backslashes") ]]]</span><span class="strut"> </span></p> +<p id="t1108" class="pln"><span class="str"> down deep with backslashes //yyy</span><span class="strut"> </span></p> +<p id="t1109" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1110" class="pln"><span class="strut"> </span></p> +<p id="t1111" class="pln"> <span class="str">'subfwd.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1112" class="pln"><span class="str"> //[[[cog cog.outl("down deep with slashes") ]]]</span><span class="strut"> </span></p> +<p id="t1113" class="pln"><span class="str"> down deep with slashes //zzz</span><span class="strut"> </span></p> +<p id="t1114" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1115" class="pln"><span class="strut"> </span></p> +<p id="t1116" class="pln"> <span class="str">'cogfiles.txt'</span><span class="op">:</span> <span class="nam">fix_backslashes</span><span class="op">(</span><span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1117" class="pln"><span class="str"> # Please run cog</span><span class="strut"> </span></p> +<p id="t1118" class="pln"><span class="str"> 'one 1.cog' -s ' //xxx'</span><span class="strut"> </span></p> +<p id="t1119" class="pln"><span class="str"> subdir\\subback.cog -s ' //yyy'</span><span class="strut"> </span></p> +<p id="t1120" class="pln"><span class="str"> subdir/subfwd.cog -s ' //zzz'</span><span class="strut"> </span></p> +<p id="t1121" class="pln"><span class="str"> """</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t1122" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t1123" class="pln"><span class="strut"> </span></p> +<p id="t1124" 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="t1125" 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="t1126" 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="t1127" 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="t1128" 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="t1129" class="pln"><span class="strut"> </span></p> +<p id="t1130" class="stm run hide_run"> <span class="key">def</span> <span class="nam">run_with_verbosity</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">verbosity</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t1131" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t1132" class="pln"> <span class="str">'unchanged.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1133" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1134" class="pln"><span class="str"> cog.outl("hello world")</span><span class="strut"> </span></p> +<p id="t1135" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1136" class="pln"><span class="str"> hello world</span><span class="strut"> </span></p> +<p id="t1137" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t1138" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1139" class="pln"><span class="strut"> </span></p> +<p id="t1140" class="pln"> <span class="str">'changed.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1141" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1142" class="pln"><span class="str"> cog.outl("goodbye cruel world")</span><span class="strut"> </span></p> +<p id="t1143" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1144" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t1145" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1146" class="pln"><span class="strut"> </span></p> +<p id="t1147" class="pln"> <span class="str">'cogfiles.txt'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1148" class="pln"><span class="str"> unchanged.cog</span><span class="strut"> </span></p> +<p id="t1149" class="pln"><span class="str"> changed.cog</span><span class="strut"> </span></p> +<p id="t1150" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t1151" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t1152" class="pln"><span class="strut"> </span></p> +<p id="t1153" 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="t1154" 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">'--verbosity='</span><span class="op">+</span><span class="nam">verbosity</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="t1155" 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="t1156" class="stm mis"> <span class="key">return</span> <span class="nam">output</span><span class="strut"> </span></p> +<p id="t1157" class="pln"><span class="strut"> </span></p> +<p id="t1158" class="stm run hide_run"> <span class="key">def</span> <span class="nam">test_verbosity0</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="t1159" class="stm mis"> <span class="nam">output</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">run_with_verbosity</span><span class="op">(</span><span class="str">"0"</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t1160" 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">""</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t1161" class="pln"><span class="strut"> </span></p> +<p id="t1162" class="stm run hide_run"> <span class="key">def</span> <span class="nam">test_verbosity1</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="t1163" class="stm mis"> <span class="nam">output</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">run_with_verbosity</span><span class="op">(</span><span class="str">"1"</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t1164" 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 changed.cog (changed)\n"</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t1165" class="pln"><span class="strut"> </span></p> +<p id="t1166" class="stm run hide_run"> <span class="key">def</span> <span class="nam">test_verbosity2</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="t1167" class="stm mis"> <span class="nam">output</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">run_with_verbosity</span><span class="op">(</span><span class="str">"2"</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t1168" 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 unchanged.cog\nCogging changed.cog (changed)\n"</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t1169" class="pln"><span class="strut"> </span></p> +<p id="t1170" class="pln"><span class="strut"> </span></p> +<p id="t1171" 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="t1172" class="pln"> <span class="str">"""Tests for -U option (force LF line-endings in output)."""</span><span class="strut"> </span></p> +<p id="t1173" class="pln"><span class="strut"> </span></p> +<p id="t1174" 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="t1175" class="pln"> <span class="str">'//[[[cog'</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1176" class="pln"> <span class="str">'cog.outl("Cog text")'</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1177" class="pln"> <span class="str">'//]]]'</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1178" class="pln"> <span class="str">'gobbledegook.'</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1179" class="pln"> <span class="str">'//[[[end]]]'</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1180" class="pln"> <span class="str">'epilogue.'</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1181" class="pln"> <span class="str">''</span><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="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="t1184" class="pln"> <span class="str">'//[[[cog'</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1185" class="pln"> <span class="str">'cog.outl("Cog text")'</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1186" class="pln"> <span class="str">'//]]]'</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1187" class="pln"> <span class="str">'Cog text'</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1188" class="pln"> <span class="str">'//[[[end]]]'</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1189" class="pln"> <span class="str">'epilogue.'</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1190" class="pln"> <span class="str">''</span><span class="op">]</span><span class="strut"> </span></p> +<p id="t1191" class="pln"><span class="strut"> </span></p> +<p id="t1192" 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="t1193" 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="t1194" 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="t1195" 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="t1196" class="pln"><span class="strut"> </span></p> +<p id="t1197" 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="t1198" 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="t1199" 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="t1200" 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="t1201" class="pln"><span class="strut"> </span></p> +<p id="t1202" 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="t1203" 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="t1204" 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="t1205" 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="t1206" class="pln"><span class="strut"> </span></p> +<p id="t1207" 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="t1208" 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="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">'-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="t1210" 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="t1211" class="pln"><span class="strut"> </span></p> +<p id="t1212" class="pln"><span class="strut"> </span></p> +<p id="t1213" class="stm run hide_run"><span class="key">class</span> <span class="nam">CogTestCharacterEncoding</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="t1214" class="pln"><span class="strut"> </span></p> +<p id="t1215" 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="t1216" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t1217" class="pln"> <span class="str">'test.cog'</span><span class="op">:</span> <span class="nam">b</span><span class="op">(</span><span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1218" class="pln"><span class="str"> // This is my C++ file.</span><span class="strut"> </span></p> +<p id="t1219" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1220" class="pln"><span class="str"> cog.outl("// Unicode: \xe1\x88\xb4 (U+1234)")</span><span class="strut"> </span></p> +<p id="t1221" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1222" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t1223" class="pln"><span class="str"> """</span><span class="op">)</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1224" class="pln"><span class="strut"> </span></p> +<p id="t1225" class="pln"> <span class="str">'test.out'</span><span class="op">:</span> <span class="nam">b</span><span class="op">(</span><span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1226" class="pln"><span class="str"> // This is my C++ file.</span><span class="strut"> </span></p> +<p id="t1227" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1228" class="pln"><span class="str"> cog.outl("// Unicode: \xe1\x88\xb4 (U+1234)")</span><span class="strut"> </span></p> +<p id="t1229" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1230" class="pln"><span class="str"> // Unicode: \xe1\x88\xb4 (U+1234)</span><span class="strut"> </span></p> +<p id="t1231" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t1232" class="pln"><span class="str"> """</span><span class="op">)</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1233" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t1234" class="pln"><span class="strut"> </span></p> +<p id="t1235" 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="t1236" 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="t1237" 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="t1238" 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="t1239" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertIn</span><span class="op">(</span><span class="str">"(changed)"</span><span class="op">,</span> <span class="nam">output</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t1240" class="pln"><span class="strut"> </span></p> +<p id="t1241" class="stm run hide_run"> <span class="key">def</span> <span class="nam">testFileEncodingOption</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="t1242" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t1243" class="pln"> <span class="str">'test.cog'</span><span class="op">:</span> <span class="nam">b</span><span class="op">(</span><span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1244" class="pln"><span class="str"> // \xca\xee\xe4\xe8\xf0\xe2\xea\xe0 Windows</span><span class="strut"> </span></p> +<p id="t1245" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1246" class="pln"><span class="str"> cog.outl("\xd1\xfa\xe5\xf8\xfc \xe5\xf9\xb8 \xfd\xf2\xe8\xf5 \xec\xff\xe3\xea\xe8\xf5 \xf4\xf0\xe0\xed\xf6\xf3\xe7\xf1\xea\xe8\xf5 \xe1\xf3\xeb\xee\xea \xe4\xe0 \xe2\xfb\xef\xe5\xe9 \xf7\xe0\xfe")</span><span class="strut"> </span></p> +<p id="t1247" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1248" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t1249" class="pln"><span class="str"> """</span><span class="op">)</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1250" class="pln"><span class="strut"> </span></p> +<p id="t1251" class="pln"> <span class="str">'test.out'</span><span class="op">:</span> <span class="nam">b</span><span class="op">(</span><span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1252" class="pln"><span class="str"> // \xca\xee\xe4\xe8\xf0\xe2\xea\xe0 Windows</span><span class="strut"> </span></p> +<p id="t1253" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1254" class="pln"><span class="str"> cog.outl("\xd1\xfa\xe5\xf8\xfc \xe5\xf9\xb8 \xfd\xf2\xe8\xf5 \xec\xff\xe3\xea\xe8\xf5 \xf4\xf0\xe0\xed\xf6\xf3\xe7\xf1\xea\xe8\xf5 \xe1\xf3\xeb\xee\xea \xe4\xe0 \xe2\xfb\xef\xe5\xe9 \xf7\xe0\xfe")</span><span class="strut"> </span></p> +<p id="t1255" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1256" class="pln"><span class="str"> \xd1\xfa\xe5\xf8\xfc \xe5\xf9\xb8 \xfd\xf2\xe8\xf5 \xec\xff\xe3\xea\xe8\xf5 \xf4\xf0\xe0\xed\xf6\xf3\xe7\xf1\xea\xe8\xf5 \xe1\xf3\xeb\xee\xea \xe4\xe0 \xe2\xfb\xef\xe5\xe9 \xf7\xe0\xfe</span><span class="strut"> </span></p> +<p id="t1257" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t1258" class="pln"><span class="str"> """</span><span class="op">)</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1259" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t1260" class="pln"><span class="strut"> </span></p> +<p id="t1261" 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="t1262" 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">'-n'</span><span class="op">,</span> <span class="str">'cp1251'</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="t1263" 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="t1264" 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="t1265" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertIn</span><span class="op">(</span><span class="str">"(changed)"</span><span class="op">,</span> <span class="nam">output</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t1266" class="pln"><span class="strut"> </span></p> +<p id="t1267" class="pln"><span class="strut"> </span></p> +<p id="t1268" 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="t1269" class="pln"> <span class="str">""" When running tests which import modules, the sys.modules list</span><span class="strut"> </span></p> +<p id="t1270" 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="t1271" 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="t1272" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t1273" class="pln"><span class="strut"> </span></p> +<p id="t1274" 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="t1275" 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="t1276" 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="t1277" class="pln"><span class="strut"> </span></p> +<p id="t1278" 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="t1279" class="stm mis"> <span class="nam">modstoscrub</span> <span class="op">=</span> <span class="op">[</span><span class="strut"> </span></p> +<p id="t1280" class="pln"> <span class="nam">modname</span><span class="strut"> </span></p> +<p id="t1281" 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="t1282" 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="t1283" class="pln"> <span class="op">]</span><span class="strut"> </span></p> +<p id="t1284" 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="t1285" 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="t1286" 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="t1287" class="pln"><span class="strut"> </span></p> +<p id="t1288" class="pln"><span class="strut"> </span></p> +<p id="t1289" 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="t1290" 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="t1291" class="pln"> <span class="str">'test.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1292" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1293" class="pln"><span class="str"> import mymodule</span><span class="strut"> </span></p> +<p id="t1294" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1295" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t1296" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1297" class="pln"><span class="strut"> </span></p> +<p id="t1298" class="pln"> <span class="str">'test.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1299" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1300" class="pln"><span class="str"> import mymodule</span><span class="strut"> </span></p> +<p id="t1301" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1302" class="pln"><span class="str"> Hello from mymodule</span><span class="strut"> </span></p> +<p id="t1303" class="pln"><span class="str"> //[[[end]]]</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="strut"> </span></p> +<p id="t1306" class="pln"> <span class="str">'test2.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1307" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1308" class="pln"><span class="str"> import mymodule</span><span class="strut"> </span></p> +<p id="t1309" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1310" class="pln"><span class="str"> Hello from mymodule in inc2</span><span class="strut"> </span></p> +<p id="t1311" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t1312" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1313" class="pln"><span class="strut"> </span></p> +<p id="t1314" class="pln"> <span class="str">'include'</span><span class="op">:</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t1315" class="pln"> <span class="str">'mymodule.py'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1316" class="pln"><span class="str"> import cog</span><span class="strut"> </span></p> +<p id="t1317" class="pln"><span class="str"> cog.outl("Hello from mymodule")</span><span class="strut"> </span></p> +<p id="t1318" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t1319" class="pln"> <span class="op">}</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1320" class="pln"><span class="strut"> </span></p> +<p id="t1321" class="pln"> <span class="str">'inc2'</span><span class="op">:</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t1322" class="pln"> <span class="str">'mymodule.py'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1323" class="pln"><span class="str"> import cog</span><span class="strut"> </span></p> +<p id="t1324" class="pln"><span class="str"> cog.outl("Hello from mymodule in inc2")</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="op">}</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1327" class="pln"><span class="strut"> </span></p> +<p id="t1328" class="pln"> <span class="str">'inc3'</span><span class="op">:</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t1329" class="pln"> <span class="str">'someothermodule.py'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1330" class="pln"><span class="str"> import cog</span><span class="strut"> </span></p> +<p id="t1331" class="pln"><span class="str"> cog.outl("This is some other module.")</span><span class="strut"> </span></p> +<p id="t1332" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t1333" class="pln"> <span class="op">}</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1334" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t1335" class="pln"><span class="strut"> </span></p> +<p id="t1336" 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="t1337" class="pln"> <span class="com"># Try it without the -I, to see that an ImportError happens.</span><span class="strut"> </span></p> +<p id="t1338" 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="t1339" class="stm mis"> <span class="key">with</span> <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="op">:</span><span class="strut"> </span></p> +<p id="t1340" 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="t1341" class="pln"><span class="strut"> </span></p> +<p id="t1342" 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="t1343" class="pln"> <span class="com"># Test that -I adds include directories properly.</span><span class="strut"> </span></p> +<p id="t1344" 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="t1345" 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="t1346" 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="t1347" class="pln"><span class="strut"> </span></p> +<p id="t1348" 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="t1349" class="pln"> <span class="com"># Test that two -I's add include directories properly.</span><span class="strut"> </span></p> +<p id="t1350" 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="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">'-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="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">'test.cog'</span><span class="op">,</span> <span class="str">'test.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">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="t1355" class="pln"> <span class="com"># Test that two -I's add include directories properly.</span><span class="strut"> </span></p> +<p id="t1356" 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="t1357" 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="t1358" 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="t1359" class="pln"><span class="strut"> </span></p> +<p id="t1360" 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="t1361" class="pln"> <span class="com"># Test that the search will continue past the first directory.</span><span class="strut"> </span></p> +<p id="t1362" 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="t1363" 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="t1364" 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="t1365" class="pln"><span class="strut"> </span></p> +<p id="t1366" 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="t1367" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t1368" class="pln"> <span class="str">'bad.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1369" class="pln"><span class="str"> //[[[cog cog.error("Oh no!") ]]]</span><span class="strut"> </span></p> +<p id="t1370" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t1371" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1372" class="pln"> <span class="str">'good.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1373" class="pln"><span class="str"> //[[[cog cog.outl("Oh yes!") ]]]</span><span class="strut"> </span></p> +<p id="t1374" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t1375" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1376" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t1377" class="pln"><span class="strut"> </span></p> +<p id="t1378" 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="t1379" class="pln"> <span class="com"># Is it unchanged just by creating a cog engine?</span><span class="strut"> </span></p> +<p id="t1380" 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="t1381" 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="t1382" 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="t1383" class="pln"> <span class="com"># Is it unchanged for a successful run?</span><span class="strut"> </span></p> +<p id="t1384" 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="t1385" 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="t1386" 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="t1387" class="pln"> <span class="com"># Is it unchanged for a successful run with includes?</span><span class="strut"> </span></p> +<p id="t1388" 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="t1389" 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="t1390" 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="t1391" class="pln"> <span class="com"># Is it unchanged for a successful run with two includes?</span><span class="strut"> </span></p> +<p id="t1392" 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="t1393" 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="t1394" 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="t1395" class="pln"> <span class="com"># Is it unchanged for a failed run?</span><span class="strut"> </span></p> +<p id="t1396" 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="t1397" class="stm mis"> <span class="key">with</span> <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="op">:</span><span class="strut"> </span></p> +<p id="t1398" 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">'bad.cog'</span><span class="op">]</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t1399" 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="t1400" class="pln"> <span class="com"># Is it unchanged for a failed run with includes?</span><span class="strut"> </span></p> +<p id="t1401" 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="t1402" class="stm mis"> <span class="key">with</span> <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="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">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">'bad.cog'</span><span class="op">]</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">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="t1405" class="pln"> <span class="com"># Is it unchanged for a failed run with two includes?</span><span class="strut"> </span></p> +<p id="t1406" 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="t1407" class="stm mis"> <span class="key">with</span> <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="op">:</span><span class="strut"> </span></p> +<p id="t1408" 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">'bad.cog'</span><span class="op">]</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t1409" 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="t1410" class="pln"><span class="strut"> </span></p> +<p id="t1411" 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="t1412" class="pln"> <span class="com"># Test that relative paths on the command line work, with includes.</span><span class="strut"> </span></p> +<p id="t1413" class="pln"><span class="strut"> </span></p> +<p id="t1414" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t1415" class="pln"> <span class="str">'code'</span><span class="op">:</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t1416" class="pln"> <span class="str">'test.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1417" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1418" class="pln"><span class="str"> import mysubmodule</span><span class="strut"> </span></p> +<p id="t1419" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1420" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t1421" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1422" class="pln"><span class="strut"> </span></p> +<p id="t1423" class="pln"> <span class="str">'test.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1424" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1425" class="pln"><span class="str"> import mysubmodule</span><span class="strut"> </span></p> +<p id="t1426" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1427" class="pln"><span class="str"> Hello from mysubmodule</span><span class="strut"> </span></p> +<p id="t1428" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t1429" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1430" class="pln"><span class="strut"> </span></p> +<p id="t1431" class="pln"> <span class="str">'mysubmodule.py'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1432" class="pln"><span class="str"> import cog</span><span class="strut"> </span></p> +<p id="t1433" class="pln"><span class="str"> cog.outl("Hello from mysubmodule")</span><span class="strut"> </span></p> +<p id="t1434" class="pln"><span class="str"> """</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="op">}</span><span class="strut"> </span></p> +<p id="t1437" class="pln"><span class="strut"> </span></p> +<p id="t1438" 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="t1439" 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="t1440" class="pln"> <span class="com"># auto-include the current directory</span><span class="strut"> </span></p> +<p id="t1441" 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="t1442" 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="t1443" class="pln"><span class="strut"> </span></p> +<p id="t1444" class="pln"><span class="strut"> </span></p> +<p id="t1445" 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="t1446" class="pln"><span class="strut"> </span></p> +<p id="t1447" 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="t1448" 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="t1449" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t1450" class="pln"> <span class="str">'with.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1451" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1452" class="pln"><span class="str"> cog.outl("hello world")</span><span class="strut"> </span></p> +<p id="t1453" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1454" class="pln"><span class="str"> hello world</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="op">,</span><span class="strut"> </span></p> +<p id="t1457" class="pln"><span class="strut"> </span></p> +<p id="t1458" class="pln"> <span class="str">'without.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1459" class="pln"><span class="str"> There's no cog</span><span class="strut"> </span></p> +<p id="t1460" class="pln"><span class="str"> code in this file.</span><span class="strut"> </span></p> +<p id="t1461" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1462" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t1463" class="pln"><span class="strut"> </span></p> +<p id="t1464" 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="t1465" 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="t1466" 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="t1467" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertNotIn</span><span class="op">(</span><span class="str">"Warning"</span><span class="op">,</span> <span class="nam">output</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t1468" 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="t1469" 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="t1470" 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="t1471" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertIn</span><span class="op">(</span><span class="str">"Warning: no cog code found in without.cog"</span><span class="op">,</span> <span class="nam">output</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t1472" 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="t1473" 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="t1474" 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="t1475" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertNotIn</span><span class="op">(</span><span class="str">"Warning"</span><span class="op">,</span> <span class="nam">output</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t1476" class="pln"><span class="strut"> </span></p> +<p id="t1477" 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="t1478" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t1479" class="pln"> <span class="str">'cog1.txt'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1480" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1481" 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="t1482" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1483" class="pln"><span class="str"> this is cog1.txt in, cog1.txt out</span><span class="strut"> </span></p> +<p id="t1484" class="pln"><span class="str"> [[[end]]]</span><span class="strut"> </span></p> +<p id="t1485" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1486" class="pln"><span class="strut"> </span></p> +<p id="t1487" class="pln"> <span class="str">'cog1.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1488" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1489" 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="t1490" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1491" class="pln"><span class="str"> This is cog1.txt in, cog1.txt out</span><span class="strut"> </span></p> +<p id="t1492" class="pln"><span class="str"> [[[end]]]</span><span class="strut"> </span></p> +<p id="t1493" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1494" class="pln"><span class="strut"> </span></p> +<p id="t1495" class="pln"> <span class="str">'cog1out.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1496" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1497" 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="t1498" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1499" class="pln"><span class="str"> This is cog1.txt in, cog1out.txt out</span><span class="strut"> </span></p> +<p id="t1500" class="pln"><span class="str"> [[[end]]]</span><span class="strut"> </span></p> +<p id="t1501" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1502" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t1503" class="pln"><span class="strut"> </span></p> +<p id="t1504" 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="t1505" 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="t1506" 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="t1507" 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="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">'-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="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">'cog1out.txt'</span><span class="op">,</span> <span class="str">'cog1out.out'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t1510" class="pln"><span class="strut"> </span></p> +<p id="t1511" 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="t1512" class="pln"> <span class="com"># Make sure that global values don't get shared between files.</span><span class="strut"> </span></p> +<p id="t1513" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t1514" class="pln"> <span class="str">'one.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1515" class="pln"><span class="str"> //[[[cog s = "This was set in one.cog" ]]]</span><span class="strut"> </span></p> +<p id="t1516" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t1517" class="pln"><span class="str"> //[[[cog cog.outl(s) ]]]</span><span class="strut"> </span></p> +<p id="t1518" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t1519" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1520" class="pln"><span class="strut"> </span></p> +<p id="t1521" class="pln"> <span class="str">'one.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1522" class="pln"><span class="str"> //[[[cog s = "This was set in one.cog" ]]]</span><span class="strut"> </span></p> +<p id="t1523" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t1524" class="pln"><span class="str"> //[[[cog cog.outl(s) ]]]</span><span class="strut"> </span></p> +<p id="t1525" class="pln"><span class="str"> This was set in one.cog</span><span class="strut"> </span></p> +<p id="t1526" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t1527" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1528" class="pln"><span class="strut"> </span></p> +<p id="t1529" class="pln"> <span class="str">'two.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1530" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1531" class="pln"><span class="str"> try:</span><span class="strut"> </span></p> +<p id="t1532" class="pln"><span class="str"> cog.outl(s)</span><span class="strut"> </span></p> +<p id="t1533" class="pln"><span class="str"> except NameError:</span><span class="strut"> </span></p> +<p id="t1534" class="pln"><span class="str"> cog.outl("s isn't set!")</span><span class="strut"> </span></p> +<p id="t1535" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1536" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t1537" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1538" class="pln"><span class="strut"> </span></p> +<p id="t1539" class="pln"> <span class="str">'two.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1540" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1541" class="pln"><span class="str"> try:</span><span class="strut"> </span></p> +<p id="t1542" class="pln"><span class="str"> cog.outl(s)</span><span class="strut"> </span></p> +<p id="t1543" class="pln"><span class="str"> except NameError:</span><span class="strut"> </span></p> +<p id="t1544" class="pln"><span class="str"> cog.outl("s isn't set!")</span><span class="strut"> </span></p> +<p id="t1545" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1546" class="pln"><span class="str"> s isn't set!</span><span class="strut"> </span></p> +<p id="t1547" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t1548" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1549" class="pln"><span class="strut"> </span></p> +<p id="t1550" class="pln"> <span class="str">'cogfiles.txt'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1551" class="pln"><span class="str"> # Please run cog</span><span class="strut"> </span></p> +<p id="t1552" class="pln"><span class="str"> one.cog</span><span class="strut"> </span></p> +<p id="t1553" class="pln"><span class="strut"> </span></p> +<p id="t1554" class="pln"><span class="str"> two.cog</span><span class="strut"> </span></p> +<p id="t1555" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t1556" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t1557" class="pln"><span class="strut"> </span></p> +<p id="t1558" 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="t1559" 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="t1560" 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="t1561" 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="t1562" 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="t1563" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertIn</span><span class="op">(</span><span class="str">"(changed)"</span><span class="op">,</span> <span class="nam">output</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t1564" class="pln"><span class="strut"> </span></p> +<p id="t1565" 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="t1566" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t1567" class="pln"> <span class="str">'cog1.txt'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1568" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1569" class="pln"><span class="str"> cog.outl("This line was generated.")</span><span class="strut"> </span></p> +<p id="t1570" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1571" class="pln"><span class="str"> This line was generated.</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"> This line was not.</span><span class="strut"> </span></p> +<p id="t1574" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1575" class="pln"><span class="strut"> </span></p> +<p id="t1576" class="pln"> <span class="str">'cog1.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1577" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1578" class="pln"><span class="str"> cog.outl("This line was generated.")</span><span class="strut"> </span></p> +<p id="t1579" class="pln"><span class="str"> //]]]</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"> This line was not.</span><span class="strut"> </span></p> +<p id="t1582" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1583" class="pln"><span class="strut"> </span></p> +<p id="t1584" class="pln"> <span class="str">'cog1.out2'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1585" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1586" class="pln"><span class="str"> cog.outl("This line was generated.")</span><span class="strut"> </span></p> +<p id="t1587" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1588" class="pln"><span class="str"> This line was generated.</span><span class="strut"> </span></p> +<p id="t1589" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t1590" class="pln"><span class="str"> This line was not.</span><span class="strut"> </span></p> +<p id="t1591" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1592" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t1593" class="pln"><span class="strut"> </span></p> +<p id="t1594" 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="t1595" class="pln"> <span class="com"># Remove generated output.</span><span class="strut"> </span></p> +<p id="t1596" 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="t1597" 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="t1598" 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="t1599" class="pln"> <span class="com"># Regenerate the generated output.</span><span class="strut"> </span></p> +<p id="t1600" 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="t1601" 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="t1602" 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="t1603" class="pln"> <span class="com"># Remove the generated output again.</span><span class="strut"> </span></p> +<p id="t1604" 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="t1605" 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="t1606" class="pln"><span class="strut"> </span></p> +<p id="t1607" 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="t1608" class="stm mis"> <span class="nam">infile</span> <span class="op">=</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1609" class="pln"><span class="str"> #[[[cog</span><span class="strut"> </span></p> +<p id="t1610" class="pln"><span class="str"> cog.msg("Hello there!")</span><span class="strut"> </span></p> +<p id="t1611" class="pln"><span class="str"> #]]]</span><span class="strut"> </span></p> +<p id="t1612" class="pln"><span class="str"> #[[[end]]]</span><span class="strut"> </span></p> +<p id="t1613" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t1614" 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="t1615" 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="t1616" 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="t1617" 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="t1618" class="pln"><span class="strut"> </span></p> +<p id="t1619" 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="t1620" 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="t1621" class="pln"><span class="strut"> </span></p> +<p id="t1622" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t1623" class="pln"> <span class="str">'cog1.txt'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1624" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1625" class="pln"><span class="str"> cog.outl("This line was newly")</span><span class="strut"> </span></p> +<p id="t1626" class="pln"><span class="str"> cog.outl("generated by cog")</span><span class="strut"> </span></p> +<p id="t1627" class="pln"><span class="str"> cog.outl("blah blah.")</span><span class="strut"> </span></p> +<p id="t1628" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1629" class="pln"><span class="str"> Xhis line was newly</span><span class="strut"> </span></p> +<p id="t1630" class="pln"><span class="str"> generated by cog</span><span class="strut"> </span></p> +<p id="t1631" class="pln"><span class="str"> blah blah.</span><span class="strut"> </span></p> +<p id="t1632" class="pln"><span class="str"> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class="strut"> </span></p> +<p id="t1633" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1634" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t1635" class="pln"><span class="strut"> </span></p> +<p id="t1636" 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="t1637" class="stm mis"> <span class="nam">stderr</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="t1638" 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="t1639" 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="t1640" 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="t1641" 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="t1642" class="pln"><span class="strut"> </span></p> +<p id="t1643" 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="t1644" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t1645" class="pln"> <span class="str">'test.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1646" class="pln"><span class="str"> --[[[cog cog.outl("Defined fooey as " + fooey) ]]]</span><span class="strut"> </span></p> +<p id="t1647" class="pln"><span class="str"> --[[[end]]]</span><span class="strut"> </span></p> +<p id="t1648" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1649" class="pln"><span class="strut"> </span></p> +<p id="t1650" class="pln"> <span class="str">'test.kablooey'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1651" class="pln"><span class="str"> --[[[cog cog.outl("Defined fooey as " + fooey) ]]]</span><span class="strut"> </span></p> +<p id="t1652" class="pln"><span class="str"> Defined fooey as kablooey</span><span class="strut"> </span></p> +<p id="t1653" class="pln"><span class="str"> --[[[end]]]</span><span class="strut"> </span></p> +<p id="t1654" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1655" class="pln"><span class="strut"> </span></p> +<p id="t1656" class="pln"> <span class="str">'test.einstein'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1657" class="pln"><span class="str"> --[[[cog cog.outl("Defined fooey as " + fooey) ]]]</span><span class="strut"> </span></p> +<p id="t1658" class="pln"><span class="str"> Defined fooey as e=mc2</span><span class="strut"> </span></p> +<p id="t1659" class="pln"><span class="str"> --[[[end]]]</span><span class="strut"> </span></p> +<p id="t1660" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1661" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t1662" class="pln"><span class="strut"> </span></p> +<p id="t1663" 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="t1664" 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="t1665" 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="t1666" 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="t1667" 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="t1668" 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="t1669" 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="t1670" 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="t1671" 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="t1672" 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="t1673" 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="t1674" 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="t1675" 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="t1676" 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="t1677" 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="t1678" 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="t1679" 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="t1680" 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="t1681" class="pln"><span class="strut"> </span></p> +<p id="t1682" 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="t1683" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t1684" class="pln"> <span class="str">'test.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1685" class="pln"><span class="str"> --[[[cog cog.outl('Hey there!') ]]]</span><span class="strut"> </span></p> +<p id="t1686" class="pln"><span class="str"> --[[[end]]]</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="op">}</span><span class="strut"> </span></p> +<p id="t1689" class="pln"><span class="strut"> </span></p> +<p id="t1690" 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="t1691" class="stm mis"> <span class="nam">stderr</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="t1692" 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="t1693" 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="t1694" 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="t1695" 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="t1696" 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="t1697" 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="t1698" class="pln"><span class="strut"> </span></p> +<p id="t1699" class="stm run hide_run"> <span class="key">def</span> <span class="nam">testReadFromStdin</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="t1700" class="stm mis"> <span class="nam">stdin</span> <span class="op">=</span> <span class="nam">StringIO</span><span class="op">(</span><span class="str">"--[[[cog cog.outl('Wow') ]]]\n--[[[end]]]\n"</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t1701" class="stm mis"> <span class="key">def</span> <span class="nam">restore_stdin</span><span class="op">(</span><span class="nam">old_stdin</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t1702" class="stm mis"> <span class="nam">sys</span><span class="op">.</span><span class="nam">stdin</span> <span class="op">=</span> <span class="nam">old_stdin</span><span class="strut"> </span></p> +<p id="t1703" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">addCleanup</span><span class="op">(</span><span class="nam">restore_stdin</span><span class="op">,</span> <span class="nam">sys</span><span class="op">.</span><span class="nam">stdin</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t1704" class="stm mis"> <span class="nam">sys</span><span class="op">.</span><span class="nam">stdin</span> <span class="op">=</span> <span class="nam">stdin</span><span class="strut"> </span></p> +<p id="t1705" class="pln"><span class="strut"> </span></p> +<p id="t1706" class="stm mis"> <span class="nam">stderr</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="t1707" 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="t1708" 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">'-'</span><span class="op">]</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t1709" 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="t1710" 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="t1711" 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('Wow') ]]]\nWow\n--[[[end]]]\n"</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t1712" 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="t1713" class="pln"><span class="strut"> </span></p> +<p id="t1714" class="pln"><span class="strut"> </span></p> +<p id="t1715" 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="t1716" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t1717" class="pln"> <span class="str">'test.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1718" class="pln"><span class="str"> Hey there.</span><span class="strut"> </span></p> +<p id="t1719" class="pln"><span class="str"> ;[[[cog cog.outl('a\\nb\\n \\nc') ]]]</span><span class="strut"> </span></p> +<p id="t1720" class="pln"><span class="str"> ;[[[end]]]</span><span class="strut"> </span></p> +<p id="t1721" class="pln"><span class="str"> Good bye.</span><span class="strut"> </span></p> +<p id="t1722" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1723" class="pln"><span class="strut"> </span></p> +<p id="t1724" class="pln"> <span class="str">'test.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1725" class="pln"><span class="str"> Hey there.</span><span class="strut"> </span></p> +<p id="t1726" class="pln"><span class="str"> ;[[[cog cog.outl('a\\nb\\n \\nc') ]]]</span><span class="strut"> </span></p> +<p id="t1727" class="pln"><span class="str"> a (foo)</span><span class="strut"> </span></p> +<p id="t1728" class="pln"><span class="str"> b (foo)</span><span class="strut"> </span></p> +<p id="t1729" class="pln"><span class="str"> """</span> <span class="com"># These three trailing spaces are important.</span><span class="strut"> </span></p> +<p id="t1730" class="pln"> <span class="com"># The suffix is not applied to completely blank lines.</span><span class="strut"> </span></p> +<p id="t1731" class="pln"> <span class="str">"""</span><span class="strut"> </span></p> +<p id="t1732" class="pln"><span class="str"> c (foo)</span><span class="strut"> </span></p> +<p id="t1733" class="pln"><span class="str"> ;[[[end]]]</span><span class="strut"> </span></p> +<p id="t1734" class="pln"><span class="str"> Good bye.</span><span class="strut"> </span></p> +<p id="t1735" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1736" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t1737" class="pln"><span class="strut"> </span></p> +<p id="t1738" 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="t1739" 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="t1740" 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="t1741" class="pln"><span class="strut"> </span></p> +<p id="t1742" 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="t1743" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t1744" class="pln"> <span class="str">'test.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1745" class="pln"><span class="str"> ;[[[cog cog.outl('a\\nb\\nc') ]]]</span><span class="strut"> </span></p> +<p id="t1746" class="pln"><span class="str"> ;[[[end]]]</span><span class="strut"> </span></p> +<p id="t1747" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1748" class="pln"><span class="strut"> </span></p> +<p id="t1749" class="pln"> <span class="str">'test.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1750" class="pln"><span class="str"> ;[[[cog cog.outl('a\\nb\\nc') ]]]</span><span class="strut"> </span></p> +<p id="t1751" class="pln"><span class="str"> a</span><span class="strut"> </span></p> +<p id="t1752" class="pln"><span class="str"> b</span><span class="strut"> </span></p> +<p id="t1753" class="pln"><span class="str"> c</span><span class="strut"> </span></p> +<p id="t1754" class="pln"><span class="str"> ;[[[end]]]</span><span class="strut"> </span></p> +<p id="t1755" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1756" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t1757" class="pln"><span class="strut"> </span></p> +<p id="t1758" 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="t1759" 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="t1760" 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="t1761" class="pln"><span class="strut"> </span></p> +<p id="t1762" 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="t1763" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t1764" class="pln"> <span class="str">'test.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1765" class="pln"><span class="str"> ;[[[cog cog.outl('a\\n\\nb') ]]]</span><span class="strut"> </span></p> +<p id="t1766" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1767" class="pln"><span class="strut"> </span></p> +<p id="t1768" class="pln"> <span class="str">'test.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1769" class="pln"><span class="str"> ;[[[cog cog.outl('a\\n\\nb') ]]]</span><span class="strut"> </span></p> +<p id="t1770" class="pln"><span class="str"> a /\\n*+([)]><</span><span class="strut"> </span></p> +<p id="t1771" class="pln"><span class="strut"> </span></p> +<p id="t1772" class="pln"><span class="str"> b /\\n*+([)]><</span><span class="strut"> </span></p> +<p id="t1773" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1774" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t1775" class="pln"><span class="strut"> </span></p> +<p id="t1776" 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="t1777" 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="t1778" 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="t1779" class="pln"><span class="strut"> </span></p> +<p id="t1780" class="pln"><span class="strut"> </span></p> +<p id="t1781" 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="t1782" class="pln"><span class="strut"> </span></p> +<p id="t1783" 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="t1784" class="pln"> <span class="str">'test.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1785" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1786" class="pln"><span class="str"> for fn in ['DoSomething', 'DoAnotherThing', 'DoLastThing']:</span><span class="strut"> </span></p> +<p id="t1787" class="pln"><span class="str"> cog.outl("void %s();" % fn)</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"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t1790" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1791" class="pln"><span class="strut"> </span></p> +<p id="t1792" class="pln"> <span class="str">'test.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1793" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1794" class="pln"><span class="str"> for fn in ['DoSomething', 'DoAnotherThing', 'DoLastThing']:</span><span class="strut"> </span></p> +<p id="t1795" class="pln"><span class="str"> cog.outl("void %s();" % fn)</span><span class="strut"> </span></p> +<p id="t1796" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1797" class="pln"><span class="str"> void DoSomething();</span><span class="strut"> </span></p> +<p id="t1798" class="pln"><span class="str"> void DoAnotherThing();</span><span class="strut"> </span></p> +<p id="t1799" class="pln"><span class="str"> void DoLastThing();</span><span class="strut"> </span></p> +<p id="t1800" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t1801" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1802" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t1803" class="pln"><span class="strut"> </span></p> +<p id="t1804" 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="t1805" class="pln"> <span class="com"># for Windows</span><span class="strut"> </span></p> +<p id="t1806" 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="t1807" 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="t1808" 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="t1809" class="pln"> <span class="com"># for unix-like</span><span class="strut"> </span></p> +<p id="t1810" 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="t1811" 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="t1812" class="pln"><span class="strut"> </span></p> +<p id="t1813" 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="t1814" 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="t1815" 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="t1816" class="stm mis"> <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">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">tempdir</span><span class="op">,</span> <span class="str">'test.cog'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t1817" 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">testcog</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="t1818" 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="t1819" class="pln"><span class="strut"> </span></p> +<p id="t1820" 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="t1821" 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">testcog</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="t1822" 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="t1823" class="pln"><span class="strut"> </span></p> +<p id="t1824" 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="t1825" class="stm mis"> <span class="key">with</span> <span class="nam">self</span><span class="op">.</span><span class="nam">assertRaisesRegexp</span><span class="op">(</span><span class="nam">CogError</span><span class="op">,</span> <span class="str">"Can't overwrite test.cog"</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t1826" 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="t1827" 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="t1828" class="pln"><span class="strut"> </span></p> +<p id="t1829" 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="t1830" 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="t1831" 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="t1832" 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="t1833" class="pln"><span class="strut"> </span></p> +<p id="t1834" 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="t1835" 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="t1836" 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="t1837" 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="t1838" class="pln"><span class="strut"> </span></p> +<p id="t1839" 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="t1840" class="stm mis"> <span class="key">with</span> <span class="nam">self</span><span class="op">.</span><span class="nam">assertRaisesRegexp</span><span class="op">(</span><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="op">:</span><span class="strut"> </span></p> +<p id="t1841" 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="str">'echo %s'</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="t1842" 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="t1843" class="pln"><span class="strut"> </span></p> +<p id="t1844" class="pln"><span class="strut"> </span></p> +<p id="t1845" 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="t1846" class="pln"><span class="strut"> </span></p> +<p id="t1847" 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="t1848" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t1849" class="pln"> <span class="str">'cog1.txt'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1850" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1851" class="pln"><span class="str"> cog.outl("This line was generated.")</span><span class="strut"> </span></p> +<p id="t1852" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1853" class="pln"><span class="str"> This line was generated.</span><span class="strut"> </span></p> +<p id="t1854" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t1855" class="pln"><span class="str"> This line was not.</span><span class="strut"> </span></p> +<p id="t1856" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1857" class="pln"><span class="strut"> </span></p> +<p id="t1858" class="pln"> <span class="str">'cog1.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1859" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1860" class="pln"><span class="str"> cog.outl("This line was generated.")</span><span class="strut"> </span></p> +<p id="t1861" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1862" class="pln"><span class="str"> This line was generated.</span><span class="strut"> </span></p> +<p id="t1863" class="pln"><span class="str"> //[[[end]]] (checksum: 8adb13fb59b996a1c7f0065ea9f3d893)</span><span class="strut"> </span></p> +<p id="t1864" class="pln"><span class="str"> This line was not.</span><span class="strut"> </span></p> +<p id="t1865" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1866" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t1867" class="pln"><span class="strut"> </span></p> +<p id="t1868" 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="t1869" 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="t1870" 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="t1871" class="pln"><span class="strut"> </span></p> +<p id="t1872" 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="t1873" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t1874" class="pln"> <span class="str">'cog1.txt'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1875" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1876" class="pln"><span class="str"> cog.outl("This line was newly")</span><span class="strut"> </span></p> +<p id="t1877" class="pln"><span class="str"> cog.outl("generated by cog")</span><span class="strut"> </span></p> +<p id="t1878" class="pln"><span class="str"> cog.outl("blah blah.")</span><span class="strut"> </span></p> +<p id="t1879" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1880" class="pln"><span class="str"> This line was generated.</span><span class="strut"> </span></p> +<p id="t1881" class="pln"><span class="str"> //[[[end]]] (checksum: 8adb13fb59b996a1c7f0065ea9f3d893)</span><span class="strut"> </span></p> +<p id="t1882" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1883" class="pln"><span class="strut"> </span></p> +<p id="t1884" class="pln"> <span class="str">'cog1.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1885" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1886" class="pln"><span class="str"> cog.outl("This line was newly")</span><span class="strut"> </span></p> +<p id="t1887" class="pln"><span class="str"> cog.outl("generated by cog")</span><span class="strut"> </span></p> +<p id="t1888" class="pln"><span class="str"> cog.outl("blah blah.")</span><span class="strut"> </span></p> +<p id="t1889" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1890" class="pln"><span class="str"> This line was newly</span><span class="strut"> </span></p> +<p id="t1891" class="pln"><span class="str"> generated by cog</span><span class="strut"> </span></p> +<p id="t1892" class="pln"><span class="str"> blah blah.</span><span class="strut"> </span></p> +<p id="t1893" class="pln"><span class="str"> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class="strut"> </span></p> +<p id="t1894" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1895" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t1896" class="pln"><span class="strut"> </span></p> +<p id="t1897" 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="t1898" 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="t1899" 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="t1900" class="pln"><span class="strut"> </span></p> +<p id="t1901" 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="t1902" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t1903" class="pln"> <span class="str">'cog1.txt'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1904" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1905" class="pln"><span class="str"> cog.outl("This line was newly")</span><span class="strut"> </span></p> +<p id="t1906" class="pln"><span class="str"> cog.outl("generated by cog")</span><span class="strut"> </span></p> +<p id="t1907" class="pln"><span class="str"> cog.outl("blah blah.")</span><span class="strut"> </span></p> +<p id="t1908" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1909" class="pln"><span class="str"> This line was generated.</span><span class="strut"> </span></p> +<p id="t1910" class="pln"><span class="str"> //[[[end]]] (checksum: 8adb13fb59b996a1c7f0065ea9f3d893) fooey</span><span class="strut"> </span></p> +<p id="t1911" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1912" class="pln"><span class="strut"> </span></p> +<p id="t1913" class="pln"> <span class="str">'cog1.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1914" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1915" class="pln"><span class="str"> cog.outl("This line was newly")</span><span class="strut"> </span></p> +<p id="t1916" class="pln"><span class="str"> cog.outl("generated by cog")</span><span class="strut"> </span></p> +<p id="t1917" class="pln"><span class="str"> cog.outl("blah blah.")</span><span class="strut"> </span></p> +<p id="t1918" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1919" class="pln"><span class="str"> This line was newly</span><span class="strut"> </span></p> +<p id="t1920" class="pln"><span class="str"> generated by cog</span><span class="strut"> </span></p> +<p id="t1921" class="pln"><span class="str"> blah blah.</span><span class="strut"> </span></p> +<p id="t1922" class="pln"><span class="str"> //[[[end]]] fooey</span><span class="strut"> </span></p> +<p id="t1923" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1924" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t1925" class="pln"><span class="strut"> </span></p> +<p id="t1926" 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="t1927" 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="t1928" 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="t1929" class="pln"><span class="strut"> </span></p> +<p id="t1930" 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="t1931" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t1932" class="pln"> <span class="str">'cog1.txt'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1933" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1934" class="pln"><span class="str"> cog.outl("This line was newly")</span><span class="strut"> </span></p> +<p id="t1935" class="pln"><span class="str"> cog.outl("generated by cog")</span><span class="strut"> </span></p> +<p id="t1936" class="pln"><span class="str"> cog.outl("blah blah.")</span><span class="strut"> </span></p> +<p id="t1937" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1938" class="pln"><span class="str"> Xhis line was newly</span><span class="strut"> </span></p> +<p id="t1939" class="pln"><span class="str"> generated by cog</span><span class="strut"> </span></p> +<p id="t1940" class="pln"><span class="str"> blah blah.</span><span class="strut"> </span></p> +<p id="t1941" class="pln"><span class="str"> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class="strut"> </span></p> +<p id="t1942" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1943" class="pln"><span class="strut"> </span></p> +<p id="t1944" class="pln"> <span class="str">'cog2.txt'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1945" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1946" class="pln"><span class="str"> cog.outl("This line was newly")</span><span class="strut"> </span></p> +<p id="t1947" class="pln"><span class="str"> cog.outl("generated by cog")</span><span class="strut"> </span></p> +<p id="t1948" class="pln"><span class="str"> cog.outl("blah blah.")</span><span class="strut"> </span></p> +<p id="t1949" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1950" class="pln"><span class="str"> This line was newly</span><span class="strut"> </span></p> +<p id="t1951" class="pln"><span class="str"> generated by cog</span><span class="strut"> </span></p> +<p id="t1952" class="pln"><span class="str"> blah blah!</span><span class="strut"> </span></p> +<p id="t1953" class="pln"><span class="str"> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class="strut"> </span></p> +<p id="t1954" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1955" class="pln"><span class="strut"> </span></p> +<p id="t1956" class="pln"> <span class="str">'cog3.txt'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1957" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1958" class="pln"><span class="str"> cog.outl("This line was newly")</span><span class="strut"> </span></p> +<p id="t1959" class="pln"><span class="str"> cog.outl("generated by cog")</span><span class="strut"> </span></p> +<p id="t1960" class="pln"><span class="str"> cog.outl("blah blah.")</span><span class="strut"> </span></p> +<p id="t1961" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1962" class="pln"><span class="strut"> </span></p> +<p id="t1963" class="pln"><span class="str"> This line was newly</span><span class="strut"> </span></p> +<p id="t1964" class="pln"><span class="str"> generated by cog</span><span class="strut"> </span></p> +<p id="t1965" class="pln"><span class="str"> blah blah.</span><span class="strut"> </span></p> +<p id="t1966" class="pln"><span class="str"> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class="strut"> </span></p> +<p id="t1967" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1968" class="pln"><span class="strut"> </span></p> +<p id="t1969" class="pln"> <span class="str">'cog4.txt'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1970" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1971" class="pln"><span class="str"> cog.outl("This line was newly")</span><span class="strut"> </span></p> +<p id="t1972" class="pln"><span class="str"> cog.outl("generated by cog")</span><span class="strut"> </span></p> +<p id="t1973" class="pln"><span class="str"> cog.outl("blah blah.")</span><span class="strut"> </span></p> +<p id="t1974" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1975" class="pln"><span class="str"> This line was newly</span><span class="strut"> </span></p> +<p id="t1976" class="pln"><span class="str"> generated by cog</span><span class="strut"> </span></p> +<p id="t1977" class="pln"><span class="str"> blah blah..</span><span class="strut"> </span></p> +<p id="t1978" class="pln"><span class="str"> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class="strut"> </span></p> +<p id="t1979" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1980" class="pln"><span class="strut"> </span></p> +<p id="t1981" class="pln"> <span class="str">'cog5.txt'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1982" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1983" class="pln"><span class="str"> cog.outl("This line was newly")</span><span class="strut"> </span></p> +<p id="t1984" class="pln"><span class="str"> cog.outl("generated by cog")</span><span class="strut"> </span></p> +<p id="t1985" class="pln"><span class="str"> cog.outl("blah blah.")</span><span class="strut"> </span></p> +<p id="t1986" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t1987" class="pln"><span class="str"> This line was newly</span><span class="strut"> </span></p> +<p id="t1988" class="pln"><span class="str"> generated by cog</span><span class="strut"> </span></p> +<p id="t1989" class="pln"><span class="str"> blah blah.</span><span class="strut"> </span></p> +<p id="t1990" class="pln"><span class="str"> extra</span><span class="strut"> </span></p> +<p id="t1991" class="pln"><span class="str"> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class="strut"> </span></p> +<p id="t1992" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t1993" class="pln"><span class="strut"> </span></p> +<p id="t1994" class="pln"> <span class="str">'cog6.txt'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t1995" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t1996" class="pln"><span class="str"> cog.outl("This line was newly")</span><span class="strut"> </span></p> +<p id="t1997" class="pln"><span class="str"> cog.outl("generated by cog")</span><span class="strut"> </span></p> +<p id="t1998" class="pln"><span class="str"> cog.outl("blah blah.")</span><span class="strut"> </span></p> +<p id="t1999" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t2000" class="pln"><span class="str"> //[[[end]]] (checksum: a8540982e5ad6b95c9e9a184b26f4346)</span><span class="strut"> </span></p> +<p id="t2001" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t2002" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t2003" class="pln"><span class="strut"> </span></p> +<p id="t2004" 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="t2005" class="stm mis"> <span class="key">with</span> <span class="nam">self</span><span class="op">.</span><span class="nam">assertRaisesRegexp</span><span class="op">(</span><span class="nam">CogError</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t2006" class="pln"> <span class="str">r"cog1.txt\(9\): Output has been edited! Delete old checksum to unprotect."</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t2007" 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">'-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="t2008" class="stm mis"> <span class="key">with</span> <span class="nam">self</span><span class="op">.</span><span class="nam">assertRaisesRegexp</span><span class="op">(</span><span class="nam">CogError</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t2009" class="pln"> <span class="str">r"cog2.txt\(9\): Output has been edited! Delete old checksum to unprotect."</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t2010" 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">'-c'</span><span class="op">,</span> <span class="str">"cog2.txt"</span><span class="op">]</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t2011" class="stm mis"> <span class="key">with</span> <span class="nam">self</span><span class="op">.</span><span class="nam">assertRaisesRegexp</span><span class="op">(</span><span class="nam">CogError</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t2012" class="pln"> <span class="str">r"cog3.txt\(10\): Output has been edited! Delete old checksum to unprotect."</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t2013" 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">'-c'</span><span class="op">,</span> <span class="str">"cog3.txt"</span><span class="op">]</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t2014" class="stm mis"> <span class="key">with</span> <span class="nam">self</span><span class="op">.</span><span class="nam">assertRaisesRegexp</span><span class="op">(</span><span class="nam">CogError</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t2015" class="pln"> <span class="str">r"cog4.txt\(9\): Output has been edited! Delete old checksum to unprotect."</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t2016" 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">'-c'</span><span class="op">,</span> <span class="str">"cog4.txt"</span><span class="op">]</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t2017" class="stm mis"> <span class="key">with</span> <span class="nam">self</span><span class="op">.</span><span class="nam">assertRaisesRegexp</span><span class="op">(</span><span class="nam">CogError</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t2018" class="pln"> <span class="str">r"cog5.txt\(10\): Output has been edited! Delete old checksum to unprotect."</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t2019" 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">'-c'</span><span class="op">,</span> <span class="str">"cog5.txt"</span><span class="op">]</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t2020" class="stm mis"> <span class="key">with</span> <span class="nam">self</span><span class="op">.</span><span class="nam">assertRaisesRegexp</span><span class="op">(</span><span class="nam">CogError</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t2021" class="pln"> <span class="str">r"cog6.txt\(6\): Output has been edited! Delete old checksum to unprotect."</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t2022" 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">'-c'</span><span class="op">,</span> <span class="str">"cog6.txt"</span><span class="op">]</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t2023" class="pln"><span class="strut"> </span></p> +<p id="t2024" class="stm run hide_run"> <span class="key">def</span> <span class="nam">testArgvIsntModified</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="t2025" 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="str">'-v'</span><span class="op">]</span><span class="strut"> </span></p> +<p id="t2026" class="stm mis"> <span class="nam">orig_argv</span> <span class="op">=</span> <span class="nam">argv</span><span class="op">[</span><span class="op">:</span><span class="op">]</span><span class="strut"> </span></p> +<p id="t2027" 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="nam">argv</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t2028" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">argv</span><span class="op">,</span> <span class="nam">orig_argv</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t2029" class="pln"><span class="strut"> </span></p> +<p id="t2030" class="pln"><span class="strut"> </span></p> +<p id="t2031" class="stm run hide_run"><span class="key">class</span> <span class="nam">CustomMarkerTests</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="t2032" class="pln"><span class="strut"> </span></p> +<p id="t2033" class="stm run hide_run"> <span class="key">def</span> <span class="nam">testCustomerMarkers</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="t2034" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t2035" class="pln"> <span class="str">'test.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t2036" class="pln"><span class="str"> //{{</span><span class="strut"> </span></p> +<p id="t2037" class="pln"><span class="str"> cog.outl("void %s();" % "MyFunction")</span><span class="strut"> </span></p> +<p id="t2038" class="pln"><span class="str"> //}}</span><span class="strut"> </span></p> +<p id="t2039" class="pln"><span class="str"> //{{end}}</span><span class="strut"> </span></p> +<p id="t2040" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t2041" class="pln"><span class="strut"> </span></p> +<p id="t2042" class="pln"> <span class="str">'test.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t2043" class="pln"><span class="str"> //{{</span><span class="strut"> </span></p> +<p id="t2044" class="pln"><span class="str"> cog.outl("void %s();" % "MyFunction")</span><span class="strut"> </span></p> +<p id="t2045" class="pln"><span class="str"> //}}</span><span class="strut"> </span></p> +<p id="t2046" class="pln"><span class="str"> void MyFunction();</span><span class="strut"> </span></p> +<p id="t2047" class="pln"><span class="str"> //{{end}}</span><span class="strut"> </span></p> +<p id="t2048" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t2049" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t2050" class="pln"><span class="strut"> </span></p> +<p id="t2051" 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="t2052" 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="strut"> </span></p> +<p id="t2053" class="pln"> <span class="str">'argv0'</span><span class="op">,</span> <span class="str">'-r'</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t2054" class="pln"> <span class="str">'--markers={{ }} {{end}}'</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t2055" class="pln"> <span class="str">'test.cog'</span><span class="strut"> </span></p> +<p id="t2056" class="pln"> <span class="op">]</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t2057" 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="t2058" class="pln"><span class="strut"> </span></p> +<p id="t2059" class="stm run hide_run"> <span class="key">def</span> <span class="nam">testTrulyWackyMarkers</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="t2060" class="pln"> <span class="com"># Make sure the markers are properly re-escaped.</span><span class="strut"> </span></p> +<p id="t2061" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t2062" class="pln"> <span class="str">'test.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t2063" class="pln"><span class="str"> //**(</span><span class="strut"> </span></p> +<p id="t2064" class="pln"><span class="str"> cog.outl("void %s();" % "MyFunction")</span><span class="strut"> </span></p> +<p id="t2065" class="pln"><span class="str"> //**)</span><span class="strut"> </span></p> +<p id="t2066" class="pln"><span class="str"> //**(end)**</span><span class="strut"> </span></p> +<p id="t2067" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t2068" class="pln"><span class="strut"> </span></p> +<p id="t2069" class="pln"> <span class="str">'test.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t2070" class="pln"><span class="str"> //**(</span><span class="strut"> </span></p> +<p id="t2071" class="pln"><span class="str"> cog.outl("void %s();" % "MyFunction")</span><span class="strut"> </span></p> +<p id="t2072" class="pln"><span class="str"> //**)</span><span class="strut"> </span></p> +<p id="t2073" class="pln"><span class="str"> void MyFunction();</span><span class="strut"> </span></p> +<p id="t2074" class="pln"><span class="str"> //**(end)**</span><span class="strut"> </span></p> +<p id="t2075" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t2076" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t2077" class="pln"><span class="strut"> </span></p> +<p id="t2078" 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="t2079" 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="strut"> </span></p> +<p id="t2080" class="pln"> <span class="str">'argv0'</span><span class="op">,</span> <span class="str">'-r'</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t2081" class="pln"> <span class="str">'--markers=**( **) **(end)**'</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t2082" class="pln"> <span class="str">'test.cog'</span><span class="strut"> </span></p> +<p id="t2083" class="pln"> <span class="op">]</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t2084" 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="t2085" class="pln"><span class="strut"> </span></p> +<p id="t2086" class="stm run hide_run"> <span class="key">def</span> <span class="nam">testChangeJustOneMarker</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="t2087" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t2088" class="pln"> <span class="str">'test.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t2089" class="pln"><span class="str"> //**(</span><span class="strut"> </span></p> +<p id="t2090" class="pln"><span class="str"> cog.outl("void %s();" % "MyFunction")</span><span class="strut"> </span></p> +<p id="t2091" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t2092" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t2093" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t2094" class="pln"><span class="strut"> </span></p> +<p id="t2095" class="pln"> <span class="str">'test.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t2096" class="pln"><span class="str"> //**(</span><span class="strut"> </span></p> +<p id="t2097" class="pln"><span class="str"> cog.outl("void %s();" % "MyFunction")</span><span class="strut"> </span></p> +<p id="t2098" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t2099" class="pln"><span class="str"> void MyFunction();</span><span class="strut"> </span></p> +<p id="t2100" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t2101" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t2102" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t2103" class="pln"><span class="strut"> </span></p> +<p id="t2104" 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="t2105" 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="strut"> </span></p> +<p id="t2106" class="pln"> <span class="str">'argv0'</span><span class="op">,</span> <span class="str">'-r'</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t2107" class="pln"> <span class="str">'--markers=**( ]]] [[[end]]]'</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t2108" class="pln"> <span class="str">'test.cog'</span><span class="strut"> </span></p> +<p id="t2109" class="pln"> <span class="op">]</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t2110" 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="t2111" class="pln"><span class="strut"> </span></p> +<p id="t2112" class="pln"><span class="strut"> </span></p> +<p id="t2113" 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="t2114" class="pln"><span class="strut"> </span></p> +<p id="t2115" class="pln"> <span class="com"># Blake Winton's contributions.</span><span class="strut"> </span></p> +<p id="t2116" 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="t2117" class="pln"> <span class="com"># -o sets the output file.</span><span class="strut"> </span></p> +<p id="t2118" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t2119" class="pln"> <span class="str">'test.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t2120" class="pln"><span class="str"> // This is my C++ file.</span><span class="strut"> </span></p> +<p id="t2121" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t2122" class="pln"><span class="str"> fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing']</span><span class="strut"> </span></p> +<p id="t2123" class="pln"><span class="str"> for fn in fnames:</span><span class="strut"> </span></p> +<p id="t2124" class="pln"><span class="str"> cog.outl("void %s();" % fn)</span><span class="strut"> </span></p> +<p id="t2125" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t2126" class="pln"><span class="str"> Some Sample Code Here</span><span class="strut"> </span></p> +<p id="t2127" class="pln"><span class="str"> //[[[end]]]Data Data</span><span class="strut"> </span></p> +<p id="t2128" class="pln"><span class="str"> And Some More</span><span class="strut"> </span></p> +<p id="t2129" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t2130" class="pln"><span class="strut"> </span></p> +<p id="t2131" class="pln"> <span class="str">'test.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t2132" class="pln"><span class="str"> // This is my C++ file.</span><span class="strut"> </span></p> +<p id="t2133" class="pln"><span class="str"> void DoSomething();</span><span class="strut"> </span></p> +<p id="t2134" class="pln"><span class="str"> void DoAnotherThing();</span><span class="strut"> </span></p> +<p id="t2135" class="pln"><span class="str"> void DoLastThing();</span><span class="strut"> </span></p> +<p id="t2136" class="pln"><span class="str"> And Some More</span><span class="strut"> </span></p> +<p id="t2137" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t2138" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t2139" class="pln"><span class="strut"> </span></p> +<p id="t2140" 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="t2141" 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="t2142" 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="t2143" class="pln"><span class="strut"> </span></p> +<p id="t2144" 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="t2145" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t2146" class="pln"> <span class="str">'test.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t2147" class="pln"><span class="str"> // This is my C++ file.</span><span class="strut"> </span></p> +<p id="t2148" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t2149" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t2150" class="pln"><span class="strut"> </span></p> +<p id="t2151" 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="t2152" class="stm mis"> <span class="key">with</span> <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="op">:</span><span class="strut"> </span></p> +<p id="t2153" 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">'test.cog'</span><span class="op">]</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t2154" class="pln"><span class="strut"> </span></p> +<p id="t2155" 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="t2156" 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="t2157" class="pln"> <span class="com"># processFile().</span><span class="strut"> </span></p> +<p id="t2158" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t2159" class="pln"> <span class="str">'test.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t2160" class="pln"><span class="str"> // This is my C++ file.</span><span class="strut"> </span></p> +<p id="t2161" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t2162" class="pln"><span class="str"> for fn in fnames:</span><span class="strut"> </span></p> +<p id="t2163" class="pln"><span class="str"> cog.outl("void %s();" % fn)</span><span class="strut"> </span></p> +<p id="t2164" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t2165" class="pln"><span class="str"> Some Sample Code Here</span><span class="strut"> </span></p> +<p id="t2166" class="pln"><span class="str"> //[[[end]]]"""</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t2167" class="pln"><span class="strut"> </span></p> +<p id="t2168" class="pln"> <span class="str">'test.out'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t2169" class="pln"><span class="str"> // This is my C++ file.</span><span class="strut"> </span></p> +<p id="t2170" class="pln"><span class="str"> void DoBlake();</span><span class="strut"> </span></p> +<p id="t2171" class="pln"><span class="str"> void DoWinton();</span><span class="strut"> </span></p> +<p id="t2172" class="pln"><span class="str"> void DoContribution();</span><span class="strut"> </span></p> +<p id="t2173" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t2174" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t2175" class="pln"><span class="strut"> </span></p> +<p id="t2176" 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="t2177" 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="t2178" 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="t2179" 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="t2180" 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="t2181" 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="t2182" class="pln"><span class="strut"> </span></p> +<p id="t2183" class="pln"><span class="strut"> </span></p> +<p id="t2184" 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="t2185" class="pln"><span class="strut"> </span></p> +<p id="t2186" 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="t2187" class="pln"> <span class="com"># Test that cog.error() doesn't show a traceback.</span><span class="strut"> </span></p> +<p id="t2188" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t2189" class="pln"> <span class="str">'error.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t2190" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t2191" class="pln"><span class="str"> cog.error("Something Bad!")</span><span class="strut"> </span></p> +<p id="t2192" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t2193" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t2194" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t2195" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t2196" class="pln"><span class="strut"> </span></p> +<p id="t2197" 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="t2198" 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="t2199" 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="t2200" 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="t2201" class="pln"><span class="strut"> </span></p> +<p id="t2202" 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="t2203" class="pln"> <span class="com"># Test that a genuine error does show a traceback.</span><span class="strut"> </span></p> +<p id="t2204" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t2205" class="pln"> <span class="str">'error.cog'</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t2206" class="pln"><span class="str"> //[[[cog</span><span class="strut"> </span></p> +<p id="t2207" class="pln"><span class="str"> raise RuntimeError("Hey!")</span><span class="strut"> </span></p> +<p id="t2208" class="pln"><span class="str"> //]]]</span><span class="strut"> </span></p> +<p id="t2209" class="pln"><span class="str"> //[[[end]]]</span><span class="strut"> </span></p> +<p id="t2210" class="pln"><span class="str"> """</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t2211" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t2212" class="pln"><span class="strut"> </span></p> +<p id="t2213" 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="t2214" 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="t2215" 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="t2216" 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="t2217" 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="t2218" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertIn</span><span class="op">(</span><span class="str">"RuntimeError: Hey!"</span><span class="op">,</span> <span class="nam">output</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t2219" class="pln"><span class="strut"> </span></p> +<p id="t2220" class="pln"><span class="strut"> </span></p> +<p id="t2221" class="pln"><span class="com"># Things not yet tested:</span><span class="strut"> </span></p> +<p id="t2222" class="pln"><span class="com"># - A bad -w command (currently fails silently).</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="https://coverage.readthedocs.org">coverage.py v4.0.3</a>, + created at 2015-11-24 07:02 + </p> + </div> +</div> + +</body> +</html> diff --git a/doc/sample_html/cogapp_test_makefiles.html b/doc/sample_html/cogapp_test_makefiles.html deleted file mode 100644 index bb9ef2e6..00000000 --- a/doc/sample_html/cogapp_test_makefiles.html +++ /dev/null @@ -1,270 +0,0 @@ -<!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 cogapp/test_makefiles: 0%</title> - <link rel='stylesheet' href='style.css' type='text/css'> - - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript' charset='utf-8'> - jQuery(document).ready(coverage.pyfile_ready); - </script> -</head> -<body id='pyfile'> - -<div id='header'> - <div class='content'> - <h1>Coverage for <b>cogapp/test_makefiles</b> : - <span class='pc_cov'>0%</span> - </h1> - <img id='keyboard_icon' src='keybd_closed.png'> - <h2 class='stats'> - 55 statements - <span class='run hide_run shortkey_r button_toggle_run'>0 run</span> - <span class='mis shortkey_m button_toggle_mis'>55 missing</span> - <span class='exc shortkey_x button_toggle_exc'>2 excluded</span> - - <span class='par run hide_run shortkey_p button_toggle_par'>0 partial</span> - - </h2> - </div> -</div> - -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png'> -<p class='legend'>Hot-keys on this page</p> - <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays - </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk - </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page - </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk - </p> - </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='pln'><a href='#n3'>3</a></p> -<p id='n4' class='pln'><a href='#n4'>4</a></p> -<p id='n5' class='pln'><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> -<p id='n8' class='stm mis'><a href='#n8'>8</a></p> -<p id='n9' class='stm mis'><a href='#n9'>9</a></p> -<p id='n10' class='stm mis'><a href='#n10'>10</a></p> -<p id='n11' class='pln'><a href='#n11'>11</a></p> -<p id='n12' class='stm mis'><a href='#n12'>12</a></p> -<p id='n13' class='pln'><a href='#n13'>13</a></p> -<p id='n14' class='stm mis'><a href='#n14'>14</a></p> -<p id='n15' class='pln'><a href='#n15'>15</a></p> -<p id='n16' class='stm mis'><a href='#n16'>16</a></p> -<p id='n17' class='stm mis'><a href='#n17'>17</a></p> -<p id='n18' class='stm mis'><a href='#n18'>18</a></p> -<p id='n19' class='pln'><a href='#n19'>19</a></p> -<p id='n20' class='stm mis'><a href='#n20'>20</a></p> -<p id='n21' class='pln'><a href='#n21'>21</a></p> -<p id='n22' class='stm mis'><a href='#n22'>22</a></p> -<p id='n23' class='pln'><a href='#n23'>23</a></p> -<p id='n24' class='stm mis'><a href='#n24'>24</a></p> -<p id='n25' class='stm mis'><a href='#n25'>25</a></p> -<p id='n26' class='pln'><a href='#n26'>26</a></p> -<p id='n27' class='stm mis'><a href='#n27'>27</a></p> -<p id='n28' class='stm mis'><a href='#n28'>28</a></p> -<p id='n29' class='stm mis'><a href='#n29'>29</a></p> -<p id='n30' class='stm mis'><a href='#n30'>30</a></p> -<p id='n31' class='stm mis'><a href='#n31'>31</a></p> -<p id='n32' class='pln'><a href='#n32'>32</a></p> -<p id='n33' class='stm mis'><a href='#n33'>33</a></p> -<p id='n34' class='stm mis'><a href='#n34'>34</a></p> -<p id='n35' class='stm mis'><a href='#n35'>35</a></p> -<p id='n36' class='pln'><a href='#n36'>36</a></p> -<p id='n37' class='stm mis'><a href='#n37'>37</a></p> -<p id='n38' class='stm mis'><a href='#n38'>38</a></p> -<p id='n39' class='stm mis'><a href='#n39'>39</a></p> -<p id='n40' class='stm mis'><a href='#n40'>40</a></p> -<p id='n41' class='stm mis'><a href='#n41'>41</a></p> -<p id='n42' class='stm mis'><a href='#n42'>42</a></p> -<p id='n43' class='pln'><a href='#n43'>43</a></p> -<p id='n44' class='stm mis'><a href='#n44'>44</a></p> -<p id='n45' class='stm mis'><a href='#n45'>45</a></p> -<p id='n46' class='stm mis'><a href='#n46'>46</a></p> -<p id='n47' class='pln'><a href='#n47'>47</a></p> -<p id='n48' class='stm mis'><a href='#n48'>48</a></p> -<p id='n49' class='stm mis'><a href='#n49'>49</a></p> -<p id='n50' class='stm mis'><a href='#n50'>50</a></p> -<p id='n51' class='pln'><a href='#n51'>51</a></p> -<p id='n52' class='stm mis'><a href='#n52'>52</a></p> -<p id='n53' class='stm mis'><a href='#n53'>53</a></p> -<p id='n54' class='pln'><a href='#n54'>54</a></p> -<p id='n55' class='pln'><a href='#n55'>55</a></p> -<p id='n56' class='pln'><a href='#n56'>56</a></p> -<p id='n57' class='pln'><a href='#n57'>57</a></p> -<p id='n58' class='pln'><a href='#n58'>58</a></p> -<p id='n59' class='pln'><a href='#n59'>59</a></p> -<p id='n60' class='pln'><a href='#n60'>60</a></p> -<p id='n61' class='pln'><a href='#n61'>61</a></p> -<p id='n62' class='stm mis'><a href='#n62'>62</a></p> -<p id='n63' class='stm mis'><a href='#n63'>63</a></p> -<p id='n64' class='stm mis'><a href='#n64'>64</a></p> -<p id='n65' class='stm mis'><a href='#n65'>65</a></p> -<p id='n66' class='stm mis'><a href='#n66'>66</a></p> -<p id='n67' class='pln'><a href='#n67'>67</a></p> -<p id='n68' class='stm mis'><a href='#n68'>68</a></p> -<p id='n69' class='stm mis'><a href='#n69'>69</a></p> -<p id='n70' class='stm mis'><a href='#n70'>70</a></p> -<p id='n71' class='stm mis'><a href='#n71'>71</a></p> -<p id='n72' class='stm mis'><a href='#n72'>72</a></p> -<p id='n73' class='stm mis'><a href='#n73'>73</a></p> -<p id='n74' class='stm mis'><a href='#n74'>74</a></p> -<p id='n75' class='stm mis'><a href='#n75'>75</a></p> -<p id='n76' class='pln'><a href='#n76'>76</a></p> -<p id='n77' class='stm mis'><a href='#n77'>77</a></p> -<p id='n78' class='stm mis'><a href='#n78'>78</a></p> -<p id='n79' class='stm mis'><a href='#n79'>79</a></p> -<p id='n80' class='pln'><a href='#n80'>80</a></p> -<p id='n81' class='pln'><a href='#n81'>81</a></p> -<p id='n82' class='pln'><a href='#n82'>82</a></p> -<p id='n83' class='pln'><a href='#n83'>83</a></p> -<p id='n84' class='pln'><a href='#n84'>84</a></p> -<p id='n85' class='pln'><a href='#n85'>85</a></p> -<p id='n86' class='stm mis'><a href='#n86'>86</a></p> -<p id='n87' class='stm mis'><a href='#n87'>87</a></p> -<p id='n88' class='stm mis'><a href='#n88'>88</a></p> -<p id='n89' class='stm mis'><a href='#n89'>89</a></p> -<p id='n90' class='pln'><a href='#n90'>90</a></p> -<p id='n91' class='pln'><a href='#n91'>91</a></p> -<p id='n92' class='exc'><a href='#n92'>92</a></p> -<p id='n93' class='exc'><a href='#n93'>93</a></p> - - </td> - <td class='text' valign='top'> -<p id='t1' class='pln'><span class='str'>""" Test the cogapp.makefiles modules</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-2012, 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 mis'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>absolute_import</span><span class='strut'> </span></p> -<p id='t8' class='stm mis'><span class='key'>import</span> <span class='nam'>unittest</span> <span class='com'># This is a unittest, so this is fundamental.</span><span class='strut'> </span></p> -<p id='t9' class='stm mis'><span class='key'>import</span> <span class='nam'>shutil</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>,</span> <span class='nam'>random</span><span class='op'>,</span> <span class='nam'>types</span><span class='op'>,</span> <span class='nam'>tempfile</span> <span class='com'># We need these modules to write the tests.</span><span class='strut'> </span></p> -<p id='t10' class='stm mis'><span class='key'>from</span> <span class='op'>.</span> <span class='key'>import</span> <span class='nam'>makefiles</span><span class='strut'> </span></p> -<p id='t11' class='pln'><span class='strut'> </span></p> -<p id='t12' class='stm mis'><span class='key'>class</span> <span class='nam'>SimpleTests</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='t13' class='pln'><span class='strut'> </span></p> -<p id='t14' class='stm mis'> <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='t15' class='pln'> <span class='com'># Create a temporary directory.</span><span class='strut'> </span></p> -<p id='t16' class='stm mis'> <span class='nam'>my_dir</span> <span class='op'>=</span> <span class='str'>'testmakefiles_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='strut'> </span></p> -<p id='t17' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>tempdir</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'>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='nam'>my_dir</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t18' 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'>tempdir</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 mis'> <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='t21' class='pln'> <span class='com'># Get rid of the temporary directory.</span><span class='strut'> </span></p> -<p id='t22' class='stm mis'> <span class='nam'>shutil</span><span class='op'>.</span><span class='nam'>rmtree</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='t23' class='pln'><span class='strut'> </span></p> -<p id='t24' class='stm mis'> <span class='key'>def</span> <span class='nam'>exists</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>dname</span><span class='op'>,</span> <span class='nam'>fname</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t25' class='stm mis'> <span class='key'>return</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='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'>dname</span><span class='op'>,</span> <span class='nam'>fname</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t26' class='pln'><span class='strut'> </span></p> -<p id='t27' class='stm mis'> <span class='key'>def</span> <span class='nam'>checkFilesExist</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='nam'>dname</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t28' class='stm mis'> <span class='key'>for</span> <span class='nam'>fname</span> <span class='key'>in</span> <span class='nam'>d</span><span class='op'>.</span><span class='nam'>keys</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t29' class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>exists</span><span class='op'>(</span><span class='nam'>dname</span><span class='op'>,</span> <span class='nam'>fname</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t30' class='stm mis'> <span class='key'>if</span> <span class='nam'>type</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>[</span><span class='nam'>fname</span><span class='op'>]</span><span class='op'>)</span> <span class='op'>==</span> <span class='nam'>type</span><span class='op'>(</span><span class='op'>{</span><span class='op'>}</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t31' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>checkFilesExist</span><span class='op'>(</span><span class='nam'>d</span><span class='op'>[</span><span class='nam'>fname</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'>join</span><span class='op'>(</span><span class='nam'>dname</span><span class='op'>,</span> <span class='nam'>fname</span><span class='op'>)</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 mis'> <span class='key'>def</span> <span class='nam'>checkFilesDontExist</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='nam'>dname</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t34' class='stm mis'> <span class='key'>for</span> <span class='nam'>fname</span> <span class='key'>in</span> <span class='nam'>d</span><span class='op'>.</span><span class='nam'>keys</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t35' class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>exists</span><span class='op'>(</span><span class='nam'>dname</span><span class='op'>,</span> <span class='nam'>fname</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t36' class='pln'><span class='strut'> </span></p> -<p id='t37' class='stm mis'> <span class='key'>def</span> <span class='nam'>testOneFile</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='t38' class='stm mis'> <span class='nam'>fname</span> <span class='op'>=</span> <span class='str'>'foo.txt'</span><span class='strut'> </span></p> -<p id='t39' class='stm mis'> <span class='nam'>notfname</span> <span class='op'>=</span> <span class='str'>'not_here.txt'</span><span class='strut'> </span></p> -<p id='t40' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span> <span class='nam'>fname</span><span class='op'>:</span> <span class='str'>"howdy"</span> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t41' class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>exists</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'>fname</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t42' class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>exists</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'>notfname</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t43' class='pln'><span class='strut'> </span></p> -<p id='t44' class='stm mis'> <span class='nam'>makefiles</span><span class='op'>.</span><span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</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='t45' class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>exists</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'>fname</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t46' class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>exists</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'>notfname</span><span class='op'>)</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 mis'> <span class='nam'>makefiles</span><span class='op'>.</span><span class='nam'>removeFiles</span><span class='op'>(</span><span class='nam'>d</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='t49' class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>exists</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'>fname</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t50' class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>exists</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'>notfname</span><span class='op'>)</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 mis'> <span class='key'>def</span> <span class='nam'>testManyFiles</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='t53' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t54' class='pln'> <span class='str'>'top1.txt'</span><span class='op'>:</span> <span class='str'>"howdy"</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t55' class='pln'> <span class='str'>'top2.txt'</span><span class='op'>:</span> <span class='str'>"hello"</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t56' class='pln'> <span class='str'>'sub'</span><span class='op'>:</span> <span class='op'>{</span><span class='strut'> </span></p> -<p id='t57' class='pln'> <span class='str'>'sub1.txt'</span><span class='op'>:</span> <span class='str'>"inside"</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t58' class='pln'> <span class='str'>'sub2.txt'</span><span class='op'>:</span> <span class='str'>"inside2"</span><span class='strut'> </span></p> -<p id='t59' class='pln'> <span class='op'>}</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t60' class='pln'> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t61' class='pln'><span class='strut'> </span></p> -<p id='t62' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>checkFilesDontExist</span><span class='op'>(</span><span class='nam'>d</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='t63' class='stm mis'> <span class='nam'>makefiles</span><span class='op'>.</span><span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</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='t64' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>checkFilesExist</span><span class='op'>(</span><span class='nam'>d</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='t65' class='stm mis'> <span class='nam'>makefiles</span><span class='op'>.</span><span class='nam'>removeFiles</span><span class='op'>(</span><span class='nam'>d</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='t66' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>checkFilesDontExist</span><span class='op'>(</span><span class='nam'>d</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='t67' class='pln'><span class='strut'> </span></p> -<p id='t68' class='stm mis'> <span class='key'>def</span> <span class='nam'>testContents</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='nam'>fname</span> <span class='op'>=</span> <span class='str'>'bar.txt'</span><span class='strut'> </span></p> -<p id='t70' class='stm mis'> <span class='nam'>cont0</span> <span class='op'>=</span> <span class='str'>"I am bar.txt"</span><span class='strut'> </span></p> -<p id='t71' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span> <span class='nam'>fname</span><span class='op'>:</span> <span class='nam'>cont0</span> <span class='op'>}</span><span class='strut'> </span></p> -<p id='t72' class='stm mis'> <span class='nam'>makefiles</span><span class='op'>.</span><span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</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='t73' class='stm mis'> <span class='nam'>fcont1</span> <span class='op'>=</span> <span class='nam'>open</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'>tempdir</span><span class='op'>,</span> <span class='nam'>fname</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t74' class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='nam'>fcont1</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span> <span class='op'>==</span> <span class='nam'>cont0</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t75' class='stm mis'> <span class='nam'>fcont1</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='t76' class='pln'><span class='strut'> </span></p> -<p id='t77' class='stm mis'> <span class='key'>def</span> <span class='nam'>testDedent</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='t78' class='stm mis'> <span class='nam'>fname</span> <span class='op'>=</span> <span class='str'>'dedent.txt'</span><span class='strut'> </span></p> -<p id='t79' class='stm mis'> <span class='nam'>d</span> <span class='op'>=</span> <span class='op'>{</span> <span class='nam'>fname</span><span class='op'>:</span> <span class='str'>"""\</span><span class='strut'> </span></p> -<p id='t80' class='pln'><span class='str'> This is dedent.txt</span><span class='strut'> </span></p> -<p id='t81' class='pln'><span class='str'> \tTabbed in.</span><span class='strut'> </span></p> -<p id='t82' class='pln'><span class='str'> spaced in.</span><span class='strut'> </span></p> -<p id='t83' class='pln'><span class='str'> OK.</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='op'>}</span><span class='strut'> </span></p> -<p id='t86' class='stm mis'> <span class='nam'>makefiles</span><span class='op'>.</span><span class='nam'>makeFiles</span><span class='op'>(</span><span class='nam'>d</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='t87' class='stm mis'> <span class='nam'>fcont</span> <span class='op'>=</span> <span class='nam'>open</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'>tempdir</span><span class='op'>,</span> <span class='nam'>fname</span><span class='op'>)</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t88' class='stm mis'> <span class='key'>assert</span><span class='op'>(</span><span class='nam'>fcont</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span> <span class='op'>==</span> <span class='str'>"This is dedent.txt\n\tTabbed in.\n spaced in.\nOK.\n"</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t89' class='stm mis'> <span class='nam'>fcont</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='t90' class='pln'><span class='strut'> </span></p> -<p id='t91' class='pln'><span class='strut'> </span></p> -<p id='t92' 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='t93' 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> - - </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.7.1</a> - </p> - </div> -</div> - -</body> -</html> diff --git a/doc/sample_html/cogapp_test_makefiles_py.html b/doc/sample_html/cogapp_test_makefiles_py.html new file mode 100644 index 00000000..1fba8b01 --- /dev/null +++ b/doc/sample_html/cogapp_test_makefiles_py.html @@ -0,0 +1,275 @@ + + + +<!DOCTYPE html> +<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 cogapp/test_makefiles.py: 0.00%</title> + <link rel="stylesheet" href="style.css" type="text/css"> + + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> + jQuery(document).ready(coverage.pyfile_ready); + </script> +</head> +<body class="pyfile"> + +<div id="header"> + <div class="content"> + <h1>Coverage for <b>cogapp/test_makefiles.py</b> : + <span class="pc_cov">0.00%</span> + </h1> + + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> + + <h2 class="stats"> + 55 statements + <span class="run hide_run shortkey_r button_toggle_run">0 run</span> + <span class="mis shortkey_m button_toggle_mis">55 missing</span> + <span class="exc shortkey_x button_toggle_exc">0 excluded</span> + + + <span class="par run hide_run shortkey_p button_toggle_par">0 partial</span> + + </h2> + </div> +</div> + +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> + <div> +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays + </p> +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk + </p> +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page + </p> +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk + </p> + </div> +</div> + +<div id="source"> + <table> + <tr> + <td class="linenos"> +<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="pln"><a href="#n4">4</a></p> +<p id="n5" class="pln"><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> +<p id="n8" class="pln"><a href="#n8">8</a></p> +<p id="n9" class="stm mis"><a href="#n9">9</a></p> +<p id="n10" class="stm mis"><a href="#n10">10</a></p> +<p id="n11" class="pln"><a href="#n11">11</a></p> +<p id="n12" class="stm mis"><a href="#n12">12</a></p> +<p id="n13" class="pln"><a href="#n13">13</a></p> +<p id="n14" class="pln"><a href="#n14">14</a></p> +<p id="n15" class="stm mis"><a href="#n15">15</a></p> +<p id="n16" class="pln"><a href="#n16">16</a></p> +<p id="n17" class="stm mis"><a href="#n17">17</a></p> +<p id="n18" class="pln"><a href="#n18">18</a></p> +<p id="n19" class="stm mis"><a href="#n19">19</a></p> +<p id="n20" class="stm mis"><a href="#n20">20</a></p> +<p id="n21" class="stm mis"><a href="#n21">21</a></p> +<p id="n22" class="pln"><a href="#n22">22</a></p> +<p id="n23" class="stm mis"><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="pln"><a href="#n26">26</a></p> +<p id="n27" class="stm mis"><a href="#n27">27</a></p> +<p id="n28" class="stm mis"><a href="#n28">28</a></p> +<p id="n29" class="pln"><a href="#n29">29</a></p> +<p id="n30" class="stm mis"><a href="#n30">30</a></p> +<p id="n31" class="stm mis"><a href="#n31">31</a></p> +<p id="n32" class="stm mis"><a href="#n32">32</a></p> +<p id="n33" class="stm mis"><a href="#n33">33</a></p> +<p id="n34" class="stm mis"><a href="#n34">34</a></p> +<p id="n35" class="pln"><a href="#n35">35</a></p> +<p id="n36" class="stm mis"><a href="#n36">36</a></p> +<p id="n37" class="stm mis"><a href="#n37">37</a></p> +<p id="n38" class="stm mis"><a href="#n38">38</a></p> +<p id="n39" class="pln"><a href="#n39">39</a></p> +<p id="n40" class="stm mis"><a href="#n40">40</a></p> +<p id="n41" class="stm mis"><a href="#n41">41</a></p> +<p id="n42" class="stm mis"><a href="#n42">42</a></p> +<p id="n43" class="stm mis"><a href="#n43">43</a></p> +<p id="n44" class="stm mis"><a href="#n44">44</a></p> +<p id="n45" class="stm mis"><a href="#n45">45</a></p> +<p id="n46" class="pln"><a href="#n46">46</a></p> +<p id="n47" class="stm mis"><a href="#n47">47</a></p> +<p id="n48" class="stm mis"><a href="#n48">48</a></p> +<p id="n49" class="stm mis"><a href="#n49">49</a></p> +<p id="n50" class="pln"><a href="#n50">50</a></p> +<p id="n51" class="stm mis"><a href="#n51">51</a></p> +<p id="n52" class="stm mis"><a href="#n52">52</a></p> +<p id="n53" class="stm mis"><a href="#n53">53</a></p> +<p id="n54" class="pln"><a href="#n54">54</a></p> +<p id="n55" class="stm mis"><a href="#n55">55</a></p> +<p id="n56" class="stm mis"><a href="#n56">56</a></p> +<p id="n57" class="pln"><a href="#n57">57</a></p> +<p id="n58" class="pln"><a href="#n58">58</a></p> +<p id="n59" class="pln"><a href="#n59">59</a></p> +<p id="n60" class="pln"><a href="#n60">60</a></p> +<p id="n61" class="pln"><a href="#n61">61</a></p> +<p id="n62" class="pln"><a href="#n62">62</a></p> +<p id="n63" class="pln"><a href="#n63">63</a></p> +<p id="n64" class="pln"><a href="#n64">64</a></p> +<p id="n65" class="stm mis"><a href="#n65">65</a></p> +<p id="n66" class="stm mis"><a href="#n66">66</a></p> +<p id="n67" class="stm mis"><a href="#n67">67</a></p> +<p id="n68" class="stm mis"><a href="#n68">68</a></p> +<p id="n69" class="stm mis"><a href="#n69">69</a></p> +<p id="n70" class="pln"><a href="#n70">70</a></p> +<p id="n71" class="stm mis"><a href="#n71">71</a></p> +<p id="n72" class="stm mis"><a href="#n72">72</a></p> +<p id="n73" class="stm mis"><a href="#n73">73</a></p> +<p id="n74" class="stm mis"><a href="#n74">74</a></p> +<p id="n75" class="stm mis"><a href="#n75">75</a></p> +<p id="n76" class="stm mis"><a href="#n76">76</a></p> +<p id="n77" class="stm mis"><a href="#n77">77</a></p> +<p id="n78" class="stm mis"><a href="#n78">78</a></p> +<p id="n79" class="pln"><a href="#n79">79</a></p> +<p id="n80" class="stm mis"><a href="#n80">80</a></p> +<p id="n81" class="stm mis"><a href="#n81">81</a></p> +<p id="n82" class="stm mis"><a href="#n82">82</a></p> +<p id="n83" class="pln"><a href="#n83">83</a></p> +<p id="n84" class="pln"><a href="#n84">84</a></p> +<p id="n85" class="pln"><a href="#n85">85</a></p> +<p id="n86" class="pln"><a href="#n86">86</a></p> +<p id="n87" class="pln"><a href="#n87">87</a></p> +<p id="n88" class="pln"><a href="#n88">88</a></p> +<p id="n89" class="stm mis"><a href="#n89">89</a></p> +<p id="n90" class="stm mis"><a href="#n90">90</a></p> +<p id="n91" class="stm mis"><a href="#n91">91</a></p> +<p id="n92" class="stm mis"><a href="#n92">92</a></p> + + </td> + <td class="text"> +<p id="t1" class="pln"><span class="str">""" Test the cogapp.makefiles modules</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="strut"> </span></p> +<p id="t4" class="pln"><span class="str"> Copyright 2004-2015, 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 mis"><span class="key">from</span> <span class="nam">__future__</span> <span class="key">import</span> <span class="nam">absolute_import</span><span class="strut"> </span></p> +<p id="t8" class="pln"><span class="strut"> </span></p> +<p id="t9" class="stm mis"><span class="key">import</span> <span class="nam">unittest</span><span class="strut"> </span></p> +<p id="t10" class="stm mis"><span class="key">import</span> <span class="nam">shutil</span><span class="op">,</span> <span class="nam">os</span><span class="op">,</span> <span class="nam">random</span><span class="op">,</span> <span class="nam">tempfile</span><span class="strut"> </span></p> +<p id="t11" class="pln"><span class="strut"> </span></p> +<p id="t12" class="stm mis"><span class="key">from</span> <span class="op">.</span> <span class="key">import</span> <span class="nam">makefiles</span><span class="strut"> </span></p> +<p id="t13" class="pln"><span class="strut"> </span></p> +<p id="t14" class="pln"><span class="strut"> </span></p> +<p id="t15" class="stm mis"><span class="key">class</span> <span class="nam">SimpleTests</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="t16" class="pln"><span class="strut"> </span></p> +<p id="t17" class="stm mis"> <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="t18" class="pln"> <span class="com"># Create a temporary directory.</span><span class="strut"> </span></p> +<p id="t19" class="stm mis"> <span class="nam">my_dir</span> <span class="op">=</span> <span class="str">'testmakefiles_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="strut"> </span></p> +<p id="t20" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">tempdir</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">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="nam">my_dir</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t21" 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">tempdir</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t22" class="pln"><span class="strut"> </span></p> +<p id="t23" class="stm mis"> <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="t24" class="pln"> <span class="com"># Get rid of the temporary directory.</span><span class="strut"> </span></p> +<p id="t25" class="stm mis"> <span class="nam">shutil</span><span class="op">.</span><span class="nam">rmtree</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="t26" class="pln"><span class="strut"> </span></p> +<p id="t27" class="stm mis"> <span class="key">def</span> <span class="nam">exists</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">dname</span><span class="op">,</span> <span class="nam">fname</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t28" class="stm mis"> <span class="key">return</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="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">dname</span><span class="op">,</span> <span class="nam">fname</span><span class="op">)</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t29" class="pln"><span class="strut"> </span></p> +<p id="t30" class="stm mis"> <span class="key">def</span> <span class="nam">checkFilesExist</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="nam">dname</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t31" class="stm mis"> <span class="key">for</span> <span class="nam">fname</span> <span class="key">in</span> <span class="nam">d</span><span class="op">.</span><span class="nam">keys</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t32" class="stm mis"> <span class="key">assert</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">exists</span><span class="op">(</span><span class="nam">dname</span><span class="op">,</span> <span class="nam">fname</span><span class="op">)</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t33" class="stm mis"> <span class="key">if</span> <span class="nam">type</span><span class="op">(</span><span class="nam">d</span><span class="op">[</span><span class="nam">fname</span><span class="op">]</span><span class="op">)</span> <span class="op">==</span> <span class="nam">type</span><span class="op">(</span><span class="op">{</span><span class="op">}</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t34" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">checkFilesExist</span><span class="op">(</span><span class="nam">d</span><span class="op">[</span><span class="nam">fname</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">join</span><span class="op">(</span><span class="nam">dname</span><span class="op">,</span> <span class="nam">fname</span><span class="op">)</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t35" class="pln"><span class="strut"> </span></p> +<p id="t36" class="stm mis"> <span class="key">def</span> <span class="nam">checkFilesDontExist</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="nam">dname</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t37" class="stm mis"> <span class="key">for</span> <span class="nam">fname</span> <span class="key">in</span> <span class="nam">d</span><span class="op">.</span><span class="nam">keys</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t38" class="stm mis"> <span class="key">assert</span><span class="op">(</span><span class="key">not</span> <span class="nam">self</span><span class="op">.</span><span class="nam">exists</span><span class="op">(</span><span class="nam">dname</span><span class="op">,</span> <span class="nam">fname</span><span class="op">)</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t39" class="pln"><span class="strut"> </span></p> +<p id="t40" class="stm mis"> <span class="key">def</span> <span class="nam">testOneFile</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="t41" class="stm mis"> <span class="nam">fname</span> <span class="op">=</span> <span class="str">'foo.txt'</span><span class="strut"> </span></p> +<p id="t42" class="stm mis"> <span class="nam">notfname</span> <span class="op">=</span> <span class="str">'not_here.txt'</span><span class="strut"> </span></p> +<p id="t43" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span> <span class="nam">fname</span><span class="op">:</span> <span class="str">"howdy"</span> <span class="op">}</span><span class="strut"> </span></p> +<p id="t44" class="stm mis"> <span class="key">assert</span><span class="op">(</span><span class="key">not</span> <span class="nam">self</span><span class="op">.</span><span class="nam">exists</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">fname</span><span class="op">)</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t45" class="stm mis"> <span class="key">assert</span><span class="op">(</span><span class="key">not</span> <span class="nam">self</span><span class="op">.</span><span class="nam">exists</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">notfname</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="stm mis"> <span class="nam">makefiles</span><span class="op">.</span><span class="nam">makeFiles</span><span class="op">(</span><span class="nam">d</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="t48" class="stm mis"> <span class="key">assert</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">exists</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">fname</span><span class="op">)</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t49" class="stm mis"> <span class="key">assert</span><span class="op">(</span><span class="key">not</span> <span class="nam">self</span><span class="op">.</span><span class="nam">exists</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">notfname</span><span class="op">)</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t50" class="pln"><span class="strut"> </span></p> +<p id="t51" class="stm mis"> <span class="nam">makefiles</span><span class="op">.</span><span class="nam">removeFiles</span><span class="op">(</span><span class="nam">d</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="t52" class="stm mis"> <span class="key">assert</span><span class="op">(</span><span class="key">not</span> <span class="nam">self</span><span class="op">.</span><span class="nam">exists</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">fname</span><span class="op">)</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t53" class="stm mis"> <span class="key">assert</span><span class="op">(</span><span class="key">not</span> <span class="nam">self</span><span class="op">.</span><span class="nam">exists</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">notfname</span><span class="op">)</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t54" class="pln"><span class="strut"> </span></p> +<p id="t55" class="stm mis"> <span class="key">def</span> <span class="nam">testManyFiles</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="t56" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t57" class="pln"> <span class="str">'top1.txt'</span><span class="op">:</span> <span class="str">"howdy"</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t58" class="pln"> <span class="str">'top2.txt'</span><span class="op">:</span> <span class="str">"hello"</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t59" class="pln"> <span class="str">'sub'</span><span class="op">:</span> <span class="op">{</span><span class="strut"> </span></p> +<p id="t60" class="pln"> <span class="str">'sub1.txt'</span><span class="op">:</span> <span class="str">"inside"</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t61" class="pln"> <span class="str">'sub2.txt'</span><span class="op">:</span> <span class="str">"inside2"</span><span class="strut"> </span></p> +<p id="t62" class="pln"> <span class="op">}</span><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="pln"><span class="strut"> </span></p> +<p id="t65" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">checkFilesDontExist</span><span class="op">(</span><span class="nam">d</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="t66" class="stm mis"> <span class="nam">makefiles</span><span class="op">.</span><span class="nam">makeFiles</span><span class="op">(</span><span class="nam">d</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="t67" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">checkFilesExist</span><span class="op">(</span><span class="nam">d</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="t68" class="stm mis"> <span class="nam">makefiles</span><span class="op">.</span><span class="nam">removeFiles</span><span class="op">(</span><span class="nam">d</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="t69" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">checkFilesDontExist</span><span class="op">(</span><span class="nam">d</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="t70" class="pln"><span class="strut"> </span></p> +<p id="t71" class="stm mis"> <span class="key">def</span> <span class="nam">testContents</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="t72" class="stm mis"> <span class="nam">fname</span> <span class="op">=</span> <span class="str">'bar.txt'</span><span class="strut"> </span></p> +<p id="t73" class="stm mis"> <span class="nam">cont0</span> <span class="op">=</span> <span class="str">"I am bar.txt"</span><span class="strut"> </span></p> +<p id="t74" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span> <span class="nam">fname</span><span class="op">:</span> <span class="nam">cont0</span> <span class="op">}</span><span class="strut"> </span></p> +<p id="t75" class="stm mis"> <span class="nam">makefiles</span><span class="op">.</span><span class="nam">makeFiles</span><span class="op">(</span><span class="nam">d</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="t76" class="stm mis"> <span class="nam">fcont1</span> <span class="op">=</span> <span class="nam">open</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">tempdir</span><span class="op">,</span> <span class="nam">fname</span><span class="op">)</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t77" class="stm mis"> <span class="key">assert</span><span class="op">(</span><span class="nam">fcont1</span><span class="op">.</span><span class="nam">read</span><span class="op">(</span><span class="op">)</span> <span class="op">==</span> <span class="nam">cont0</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t78" class="stm mis"> <span class="nam">fcont1</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="t79" class="pln"><span class="strut"> </span></p> +<p id="t80" class="stm mis"> <span class="key">def</span> <span class="nam">testDedent</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="t81" class="stm mis"> <span class="nam">fname</span> <span class="op">=</span> <span class="str">'dedent.txt'</span><span class="strut"> </span></p> +<p id="t82" class="stm mis"> <span class="nam">d</span> <span class="op">=</span> <span class="op">{</span> <span class="nam">fname</span><span class="op">:</span> <span class="str">"""\</span><span class="strut"> </span></p> +<p id="t83" class="pln"><span class="str"> This is dedent.txt</span><span class="strut"> </span></p> +<p id="t84" class="pln"><span class="str"> \tTabbed in.</span><span class="strut"> </span></p> +<p id="t85" class="pln"><span class="str"> spaced in.</span><span class="strut"> </span></p> +<p id="t86" class="pln"><span class="str"> OK.</span><span class="strut"> </span></p> +<p id="t87" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t88" class="pln"> <span class="op">}</span><span class="strut"> </span></p> +<p id="t89" class="stm mis"> <span class="nam">makefiles</span><span class="op">.</span><span class="nam">makeFiles</span><span class="op">(</span><span class="nam">d</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="t90" class="stm mis"> <span class="nam">fcont</span> <span class="op">=</span> <span class="nam">open</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">tempdir</span><span class="op">,</span> <span class="nam">fname</span><span class="op">)</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t91" class="stm mis"> <span class="key">assert</span><span class="op">(</span><span class="nam">fcont</span><span class="op">.</span><span class="nam">read</span><span class="op">(</span><span class="op">)</span> <span class="op">==</span> <span class="str">"This is dedent.txt\n\tTabbed in.\n spaced in.\nOK.\n"</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t92" class="stm mis"> <span class="nam">fcont</span><span class="op">.</span><span class="nam">close</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="https://coverage.readthedocs.org">coverage.py v4.0.3</a>, + created at 2015-11-24 07:02 + </p> + </div> +</div> + +</body> +</html> diff --git a/doc/sample_html/cogapp_test_whiteutils.html b/doc/sample_html/cogapp_test_whiteutils.html deleted file mode 100644 index ffc7b887..00000000 --- a/doc/sample_html/cogapp_test_whiteutils.html +++ /dev/null @@ -1,290 +0,0 @@ -<!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 cogapp/test_whiteutils: 0%</title> - <link rel='stylesheet' href='style.css' type='text/css'> - - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript' charset='utf-8'> - jQuery(document).ready(coverage.pyfile_ready); - </script> -</head> -<body id='pyfile'> - -<div id='header'> - <div class='content'> - <h1>Coverage for <b>cogapp/test_whiteutils</b> : - <span class='pc_cov'>0%</span> - </h1> - <img id='keyboard_icon' src='keybd_closed.png'> - <h2 class='stats'> - 69 statements - <span class='run hide_run shortkey_r button_toggle_run'>0 run</span> - <span class='mis shortkey_m button_toggle_mis'>69 missing</span> - <span class='exc shortkey_x button_toggle_exc'>2 excluded</span> - - <span class='par run hide_run shortkey_p button_toggle_par'>0 partial</span> - - </h2> - </div> -</div> - -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png'> -<p class='legend'>Hot-keys on this page</p> - <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays - </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk - </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page - </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk - </p> - </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='pln'><a href='#n3'>3</a></p> -<p id='n4' class='pln'><a href='#n4'>4</a></p> -<p id='n5' class='pln'><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> -<p id='n8' class='stm mis'><a href='#n8'>8</a></p> -<p id='n9' class='stm mis'><a href='#n9'>9</a></p> -<p id='n10' class='pln'><a href='#n10'>10</a></p> -<p id='n11' class='stm mis'><a href='#n11'>11</a></p> -<p id='n12' class='pln'><a href='#n12'>12</a></p> -<p id='n13' class='pln'><a href='#n13'>13</a></p> -<p id='n14' class='pln'><a href='#n14'>14</a></p> -<p id='n15' class='stm mis'><a href='#n15'>15</a></p> -<p id='n16' class='stm mis'><a href='#n16'>16</a></p> -<p id='n17' class='stm mis'><a href='#n17'>17</a></p> -<p id='n18' class='stm mis'><a href='#n18'>18</a></p> -<p id='n19' class='stm mis'><a href='#n19'>19</a></p> -<p id='n20' class='stm mis'><a href='#n20'>20</a></p> -<p id='n21' class='stm mis'><a href='#n21'>21</a></p> -<p id='n22' class='stm mis'><a href='#n22'>22</a></p> -<p id='n23' class='pln'><a href='#n23'>23</a></p> -<p id='n24' class='stm mis'><a href='#n24'>24</a></p> -<p id='n25' class='stm mis'><a href='#n25'>25</a></p> -<p id='n26' class='stm mis'><a href='#n26'>26</a></p> -<p id='n27' class='stm mis'><a href='#n27'>27</a></p> -<p id='n28' class='pln'><a href='#n28'>28</a></p> -<p id='n29' class='stm mis'><a href='#n29'>29</a></p> -<p id='n30' class='stm mis'><a href='#n30'>30</a></p> -<p id='n31' class='stm mis'><a href='#n31'>31</a></p> -<p id='n32' class='stm mis'><a href='#n32'>32</a></p> -<p id='n33' class='stm mis'><a href='#n33'>33</a></p> -<p id='n34' class='pln'><a href='#n34'>34</a></p> -<p id='n35' class='stm mis'><a href='#n35'>35</a></p> -<p id='n36' class='stm mis'><a href='#n36'>36</a></p> -<p id='n37' class='pln'><a href='#n37'>37</a></p> -<p id='n38' class='stm mis'><a href='#n38'>38</a></p> -<p id='n39' class='stm mis'><a href='#n39'>39</a></p> -<p id='n40' class='stm mis'><a href='#n40'>40</a></p> -<p id='n41' class='pln'><a href='#n41'>41</a></p> -<p id='n42' class='stm mis'><a href='#n42'>42</a></p> -<p id='n43' class='pln'><a href='#n43'>43</a></p> -<p id='n44' class='pln'><a href='#n44'>44</a></p> -<p id='n45' class='pln'><a href='#n45'>45</a></p> -<p id='n46' class='stm mis'><a href='#n46'>46</a></p> -<p id='n47' class='stm mis'><a href='#n47'>47</a></p> -<p id='n48' class='stm mis'><a href='#n48'>48</a></p> -<p id='n49' class='stm mis'><a href='#n49'>49</a></p> -<p id='n50' class='stm mis'><a href='#n50'>50</a></p> -<p id='n51' class='stm mis'><a href='#n51'>51</a></p> -<p id='n52' class='stm mis'><a href='#n52'>52</a></p> -<p id='n53' class='stm mis'><a href='#n53'>53</a></p> -<p id='n54' class='stm mis'><a href='#n54'>54</a></p> -<p id='n55' class='stm mis'><a href='#n55'>55</a></p> -<p id='n56' class='stm mis'><a href='#n56'>56</a></p> -<p id='n57' class='pln'><a href='#n57'>57</a></p> -<p id='n58' class='stm mis'><a href='#n58'>58</a></p> -<p id='n59' class='stm mis'><a href='#n59'>59</a></p> -<p id='n60' class='stm mis'><a href='#n60'>60</a></p> -<p id='n61' class='stm mis'><a href='#n61'>61</a></p> -<p id='n62' class='stm mis'><a href='#n62'>62</a></p> -<p id='n63' class='stm mis'><a href='#n63'>63</a></p> -<p id='n64' class='stm mis'><a href='#n64'>64</a></p> -<p id='n65' class='stm mis'><a href='#n65'>65</a></p> -<p id='n66' class='stm mis'><a href='#n66'>66</a></p> -<p id='n67' class='stm mis'><a href='#n67'>67</a></p> -<p id='n68' class='stm mis'><a href='#n68'>68</a></p> -<p id='n69' class='pln'><a href='#n69'>69</a></p> -<p id='n70' class='stm mis'><a href='#n70'>70</a></p> -<p id='n71' class='stm mis'><a href='#n71'>71</a></p> -<p id='n72' class='pln'><a href='#n72'>72</a></p> -<p id='n73' class='pln'><a href='#n73'>73</a></p> -<p id='n74' class='pln'><a href='#n74'>74</a></p> -<p id='n75' class='pln'><a href='#n75'>75</a></p> -<p id='n76' class='stm mis'><a href='#n76'>76</a></p> -<p id='n77' class='pln'><a href='#n77'>77</a></p> -<p id='n78' class='pln'><a href='#n78'>78</a></p> -<p id='n79' class='pln'><a href='#n79'>79</a></p> -<p id='n80' class='stm mis'><a href='#n80'>80</a></p> -<p id='n81' class='stm mis'><a href='#n81'>81</a></p> -<p id='n82' class='stm mis'><a href='#n82'>82</a></p> -<p id='n83' class='stm mis'><a href='#n83'>83</a></p> -<p id='n84' class='stm mis'><a href='#n84'>84</a></p> -<p id='n85' class='pln'><a href='#n85'>85</a></p> -<p id='n86' class='stm mis'><a href='#n86'>86</a></p> -<p id='n87' class='stm mis'><a href='#n87'>87</a></p> -<p id='n88' class='stm mis'><a href='#n88'>88</a></p> -<p id='n89' class='stm mis'><a href='#n89'>89</a></p> -<p id='n90' class='pln'><a href='#n90'>90</a></p> -<p id='n91' class='stm mis'><a href='#n91'>91</a></p> -<p id='n92' class='stm mis'><a href='#n92'>92</a></p> -<p id='n93' class='stm mis'><a href='#n93'>93</a></p> -<p id='n94' class='stm mis'><a href='#n94'>94</a></p> -<p id='n95' class='pln'><a href='#n95'>95</a></p> -<p id='n96' class='stm mis'><a href='#n96'>96</a></p> -<p id='n97' class='stm mis'><a href='#n97'>97</a></p> -<p id='n98' class='pln'><a href='#n98'>98</a></p> -<p id='n99' class='stm mis'><a href='#n99'>99</a></p> -<p id='n100' class='stm mis'><a href='#n100'>100</a></p> -<p id='n101' class='pln'><a href='#n101'>101</a></p> -<p id='n102' class='exc'><a href='#n102'>102</a></p> -<p id='n103' class='exc'><a href='#n103'>103</a></p> - - </td> - <td class='text' valign='top'> -<p id='t1' class='pln'><span class='str'>""" Test the cogapp.whiteutils module.</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-2012, 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 mis'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>absolute_import</span><span class='strut'> </span></p> -<p id='t8' class='stm mis'><span class='key'>import</span> <span class='nam'>unittest</span><span class='strut'> </span></p> -<p id='t9' class='stm mis'><span class='key'>from</span> <span class='op'>.</span><span class='nam'>whiteutils</span> <span class='key'>import</span> <span class='op'>*</span><span class='strut'> </span></p> -<p id='t10' class='pln'><span class='strut'> </span></p> -<p id='t11' class='stm mis'><span class='key'>class</span> <span class='nam'>WhitePrefixTests</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='t12' class='pln'> <span class='str'>""" Test cases for cogapp.whiteutils.</span><span class='strut'> </span></p> -<p id='t13' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t14' class='pln'><span class='strut'> </span></p> -<p id='t15' class='stm mis'> <span class='key'>def</span> <span class='nam'>testSingleLine</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='t16' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>whitePrefix</span><span class='op'>(</span><span class='op'>[</span><span class='str'>''</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='t17' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>whitePrefix</span><span class='op'>(</span><span class='op'>[</span><span class='str'>' '</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='t18' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>whitePrefix</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'x'</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='t19' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>whitePrefix</span><span class='op'>(</span><span class='op'>[</span><span class='str'>' x'</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='t20' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>whitePrefix</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'\tx'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'\t'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t21' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>whitePrefix</span><span class='op'>(</span><span class='op'>[</span><span class='str'>' x'</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='t22' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>whitePrefix</span><span class='op'>(</span><span class='op'>[</span><span class='str'>' \t \tx '</span><span class='op'>]</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>' \t \t'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t23' class='pln'><span class='strut'> </span></p> -<p id='t24' class='stm mis'> <span class='key'>def</span> <span class='nam'>testMultiLine</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='t25' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>whitePrefix</span><span class='op'>(</span><span class='op'>[</span><span class='str'>' x'</span><span class='op'>,</span><span class='str'>' x'</span><span class='op'>,</span><span class='str'>' x'</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='t26' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>whitePrefix</span><span class='op'>(</span><span class='op'>[</span><span class='str'>' y'</span><span class='op'>,</span><span class='str'>' y'</span><span class='op'>,</span><span class='str'>' y'</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='t27' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>whitePrefix</span><span class='op'>(</span><span class='op'>[</span><span class='str'>' y'</span><span class='op'>,</span><span class='str'>' y'</span><span class='op'>,</span><span class='str'>' y'</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='t28' class='pln'><span class='strut'> </span></p> -<p id='t29' class='stm mis'> <span class='key'>def</span> <span class='nam'>testBlankLinesAreIgnored</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='t30' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>whitePrefix</span><span class='op'>(</span><span class='op'>[</span><span class='str'>' x'</span><span class='op'>,</span><span class='str'>' x'</span><span class='op'>,</span><span class='str'>''</span><span class='op'>,</span><span class='str'>' x'</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='t31' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>whitePrefix</span><span class='op'>(</span><span class='op'>[</span><span class='str'>''</span><span class='op'>,</span><span class='str'>' x'</span><span class='op'>,</span><span class='str'>' x'</span><span class='op'>,</span><span class='str'>' x'</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='t32' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>whitePrefix</span><span class='op'>(</span><span class='op'>[</span><span class='str'>' x'</span><span class='op'>,</span><span class='str'>' x'</span><span class='op'>,</span><span class='str'>' x'</span><span class='op'>,</span><span class='str'>''</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='t33' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>whitePrefix</span><span class='op'>(</span><span class='op'>[</span><span class='str'>' x'</span><span class='op'>,</span><span class='str'>' x'</span><span class='op'>,</span><span class='str'>' '</span><span class='op'>,</span><span class='str'>' x'</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='t34' class='pln'><span class='strut'> </span></p> -<p id='t35' class='stm mis'> <span class='key'>def</span> <span class='nam'>testTabCharacters</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='t36' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>whitePrefix</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'\timport sys'</span><span class='op'>,</span> <span class='str'>''</span><span class='op'>,</span> <span class='str'>'\tprint sys.argv'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'\t'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t37' class='pln'><span class='strut'> </span></p> -<p id='t38' class='stm mis'> <span class='key'>def</span> <span class='nam'>testDecreasingLengths</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='t39' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>whitePrefix</span><span class='op'>(</span><span class='op'>[</span><span class='str'>' x'</span><span class='op'>,</span><span class='str'>' x'</span><span class='op'>,</span><span class='str'>' x'</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='t40' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>whitePrefix</span><span class='op'>(</span><span class='op'>[</span><span class='str'>' x'</span><span class='op'>,</span><span class='str'>' x'</span><span class='op'>,</span><span class='str'>' x'</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='t41' class='pln'><span class='strut'> </span></p> -<p id='t42' class='stm mis'><span class='key'>class</span> <span class='nam'>ReindentBlockTests</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='t43' class='pln'> <span class='str'>""" Test cases for cogapp.reindentBlock.</span><span class='strut'> </span></p> -<p id='t44' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t45' class='pln'><span class='strut'> </span></p> -<p id='t46' class='stm mis'> <span class='key'>def</span> <span class='nam'>testNonTermLine</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='t47' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>reindentBlock</span><span class='op'>(</span><span class='str'>''</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>''</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t48' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>reindentBlock</span><span class='op'>(</span><span class='str'>'x'</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'x'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t49' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>reindentBlock</span><span class='op'>(</span><span class='str'>' x'</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'x'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t50' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>reindentBlock</span><span class='op'>(</span><span class='str'>' x'</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'x'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t51' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>reindentBlock</span><span class='op'>(</span><span class='str'>'\tx'</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'x'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t52' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>reindentBlock</span><span class='op'>(</span><span class='str'>'x'</span><span class='op'>,</span> <span class='str'>' '</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>' x'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t53' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>reindentBlock</span><span class='op'>(</span><span class='str'>'x'</span><span class='op'>,</span> <span class='str'>'\t'</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'\tx'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t54' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>reindentBlock</span><span class='op'>(</span><span class='str'>' x'</span><span class='op'>,</span> <span class='str'>' '</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>' x'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t55' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>reindentBlock</span><span class='op'>(</span><span class='str'>' x'</span><span class='op'>,</span> <span class='str'>'\t'</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'\tx'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t56' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>reindentBlock</span><span class='op'>(</span><span class='str'>' x'</span><span class='op'>,</span> <span class='str'>' '</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>' x'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t57' class='pln'><span class='strut'> </span></p> -<p id='t58' class='stm mis'> <span class='key'>def</span> <span class='nam'>testSingleLine</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='t59' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>reindentBlock</span><span class='op'>(</span><span class='str'>'\n'</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='t60' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>reindentBlock</span><span class='op'>(</span><span class='str'>'x\n'</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'x\n'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t61' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>reindentBlock</span><span class='op'>(</span><span class='str'>' x\n'</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'x\n'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t62' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>reindentBlock</span><span class='op'>(</span><span class='str'>' x\n'</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'x\n'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t63' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>reindentBlock</span><span class='op'>(</span><span class='str'>'\tx\n'</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'x\n'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t64' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>reindentBlock</span><span class='op'>(</span><span class='str'>'x\n'</span><span class='op'>,</span> <span class='str'>' '</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>' x\n'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t65' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>reindentBlock</span><span class='op'>(</span><span class='str'>'x\n'</span><span class='op'>,</span> <span class='str'>'\t'</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'\tx\n'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t66' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>reindentBlock</span><span class='op'>(</span><span class='str'>' x\n'</span><span class='op'>,</span> <span class='str'>' '</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>' x\n'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t67' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>reindentBlock</span><span class='op'>(</span><span class='str'>' x\n'</span><span class='op'>,</span> <span class='str'>'\t'</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'\tx\n'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t68' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>reindentBlock</span><span class='op'>(</span><span class='str'>' x\n'</span><span class='op'>,</span> <span class='str'>' '</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>' x\n'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t69' class='pln'><span class='strut'> </span></p> -<p id='t70' class='stm mis'> <span class='key'>def</span> <span class='nam'>testRealBlock</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='t71' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='strut'> </span></p> -<p id='t72' class='pln'> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='str'>'\timport sys\n\n\tprint sys.argv\n'</span><span class='op'>)</span><span class='op'>,</span><span class='strut'> </span></p> -<p id='t73' class='pln'> <span class='str'>'import sys\n\nprint sys.argv\n'</span><span class='strut'> </span></p> -<p id='t74' class='pln'> <span class='op'>)</span><span class='strut'> </span></p> -<p id='t75' class='pln'><span class='strut'> </span></p> -<p id='t76' class='stm mis'><span class='key'>class</span> <span class='nam'>CommonPrefixTests</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='t77' class='pln'> <span class='str'>""" Test cases for cogapp.commonPrefix.</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='strut'> </span></p> -<p id='t80' class='stm mis'> <span class='key'>def</span> <span class='nam'>testDegenerateCases</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='t81' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>commonPrefix</span><span class='op'>(</span><span class='op'>[</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='t82' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>commonPrefix</span><span class='op'>(</span><span class='op'>[</span><span class='str'>''</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='t83' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>commonPrefix</span><span class='op'>(</span><span class='op'>[</span><span class='str'>''</span><span class='op'>,</span><span class='str'>''</span><span class='op'>,</span><span class='str'>''</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='op'>,</span> <span class='str'>''</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t84' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>commonPrefix</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'cat in the hat'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'cat in the hat'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t85' class='pln'><span class='strut'> </span></p> -<p id='t86' class='stm mis'> <span class='key'>def</span> <span class='nam'>testNoCommonPrefix</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='t87' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>commonPrefix</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'a'</span><span class='op'>,</span><span class='str'>'b'</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='t88' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>commonPrefix</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'a'</span><span class='op'>,</span><span class='str'>'b'</span><span class='op'>,</span><span class='str'>'c'</span><span class='op'>,</span><span class='str'>'d'</span><span class='op'>,</span><span class='str'>'e'</span><span class='op'>,</span><span class='str'>'f'</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='t89' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>commonPrefix</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'a'</span><span class='op'>,</span><span class='str'>'a'</span><span class='op'>,</span><span class='str'>'a'</span><span class='op'>,</span><span class='str'>'a'</span><span class='op'>,</span><span class='str'>'a'</span><span class='op'>,</span><span class='str'>'x'</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='t90' class='pln'><span class='strut'> </span></p> -<p id='t91' class='stm mis'> <span class='key'>def</span> <span class='nam'>testUsualCases</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='t92' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>commonPrefix</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'ab'</span><span class='op'>,</span> <span class='str'>'ac'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'a'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t93' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>commonPrefix</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'aab'</span><span class='op'>,</span> <span class='str'>'aac'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'aa'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t94' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>commonPrefix</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'aab'</span><span class='op'>,</span> <span class='str'>'aab'</span><span class='op'>,</span> <span class='str'>'aab'</span><span class='op'>,</span> <span class='str'>'aac'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'aa'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t95' class='pln'><span class='strut'> </span></p> -<p id='t96' class='stm mis'> <span class='key'>def</span> <span class='nam'>testBlankLine</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='t97' class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>commonPrefix</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'abc'</span><span class='op'>,</span> <span class='str'>'abx'</span><span class='op'>,</span> <span class='str'>''</span><span class='op'>,</span> <span class='str'>'aby'</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='t98' class='pln'><span class='strut'> </span></p> -<p id='t99' class='stm mis'> <span class='key'>def</span> <span class='nam'>testDecreasingLengths</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 mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>assertEqual</span><span class='op'>(</span><span class='nam'>commonPrefix</span><span class='op'>(</span><span class='op'>[</span><span class='str'>'abcd'</span><span class='op'>,</span> <span class='str'>'abc'</span><span class='op'>,</span> <span class='str'>'ab'</span><span class='op'>]</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'ab'</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t101' class='pln'><span class='strut'> </span></p> -<p id='t102' 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='t103' 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> - - </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.7.1</a> - </p> - </div> -</div> - -</body> -</html> diff --git a/doc/sample_html/cogapp_test_whiteutils_py.html b/doc/sample_html/cogapp_test_whiteutils_py.html new file mode 100644 index 00000000..0a0eb777 --- /dev/null +++ b/doc/sample_html/cogapp_test_whiteutils_py.html @@ -0,0 +1,295 @@ + + + +<!DOCTYPE html> +<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 cogapp/test_whiteutils.py: 0.00%</title> + <link rel="stylesheet" href="style.css" type="text/css"> + + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> + jQuery(document).ready(coverage.pyfile_ready); + </script> +</head> +<body class="pyfile"> + +<div id="header"> + <div class="content"> + <h1>Coverage for <b>cogapp/test_whiteutils.py</b> : + <span class="pc_cov">0.00%</span> + </h1> + + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> + + <h2 class="stats"> + 69 statements + <span class="run hide_run shortkey_r button_toggle_run">0 run</span> + <span class="mis shortkey_m button_toggle_mis">69 missing</span> + <span class="exc shortkey_x button_toggle_exc">0 excluded</span> + + + <span class="par run hide_run shortkey_p button_toggle_par">0 partial</span> + + </h2> + </div> +</div> + +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> + <div> +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays + </p> +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk + </p> +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page + </p> +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk + </p> + </div> +</div> + +<div id="source"> + <table> + <tr> + <td class="linenos"> +<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="pln"><a href="#n4">4</a></p> +<p id="n5" class="pln"><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> +<p id="n8" class="pln"><a href="#n8">8</a></p> +<p id="n9" class="stm mis"><a href="#n9">9</a></p> +<p id="n10" class="pln"><a href="#n10">10</a></p> +<p id="n11" class="stm mis"><a href="#n11">11</a></p> +<p id="n12" class="pln"><a href="#n12">12</a></p> +<p id="n13" class="pln"><a href="#n13">13</a></p> +<p id="n14" class="stm mis"><a href="#n14">14</a></p> +<p id="n15" class="pln"><a href="#n15">15</a></p> +<p id="n16" class="pln"><a href="#n16">16</a></p> +<p id="n17" class="stm mis"><a href="#n17">17</a></p> +<p id="n18" class="stm mis"><a href="#n18">18</a></p> +<p id="n19" class="stm mis"><a href="#n19">19</a></p> +<p id="n20" class="stm mis"><a href="#n20">20</a></p> +<p id="n21" class="stm mis"><a href="#n21">21</a></p> +<p id="n22" class="stm mis"><a href="#n22">22</a></p> +<p id="n23" class="stm mis"><a href="#n23">23</a></p> +<p id="n24" class="stm mis"><a href="#n24">24</a></p> +<p id="n25" class="pln"><a href="#n25">25</a></p> +<p id="n26" class="stm mis"><a href="#n26">26</a></p> +<p id="n27" class="stm mis"><a href="#n27">27</a></p> +<p id="n28" class="stm mis"><a href="#n28">28</a></p> +<p id="n29" class="stm mis"><a href="#n29">29</a></p> +<p id="n30" class="pln"><a href="#n30">30</a></p> +<p id="n31" class="stm mis"><a href="#n31">31</a></p> +<p id="n32" class="stm mis"><a href="#n32">32</a></p> +<p id="n33" class="stm mis"><a href="#n33">33</a></p> +<p id="n34" class="stm mis"><a href="#n34">34</a></p> +<p id="n35" class="stm mis"><a href="#n35">35</a></p> +<p id="n36" class="pln"><a href="#n36">36</a></p> +<p id="n37" class="stm mis"><a href="#n37">37</a></p> +<p id="n38" class="stm mis"><a href="#n38">38</a></p> +<p id="n39" class="pln"><a href="#n39">39</a></p> +<p id="n40" class="stm mis"><a href="#n40">40</a></p> +<p id="n41" class="stm mis"><a href="#n41">41</a></p> +<p id="n42" class="stm mis"><a href="#n42">42</a></p> +<p id="n43" class="pln"><a href="#n43">43</a></p> +<p id="n44" class="pln"><a href="#n44">44</a></p> +<p id="n45" class="stm mis"><a href="#n45">45</a></p> +<p id="n46" class="pln"><a href="#n46">46</a></p> +<p id="n47" class="pln"><a href="#n47">47</a></p> +<p id="n48" class="stm mis"><a href="#n48">48</a></p> +<p id="n49" class="stm mis"><a href="#n49">49</a></p> +<p id="n50" class="stm mis"><a href="#n50">50</a></p> +<p id="n51" class="stm mis"><a href="#n51">51</a></p> +<p id="n52" class="stm mis"><a href="#n52">52</a></p> +<p id="n53" class="stm mis"><a href="#n53">53</a></p> +<p id="n54" class="stm mis"><a href="#n54">54</a></p> +<p id="n55" class="stm mis"><a href="#n55">55</a></p> +<p id="n56" class="stm mis"><a href="#n56">56</a></p> +<p id="n57" class="stm mis"><a href="#n57">57</a></p> +<p id="n58" class="stm mis"><a href="#n58">58</a></p> +<p id="n59" class="pln"><a href="#n59">59</a></p> +<p id="n60" class="stm mis"><a href="#n60">60</a></p> +<p id="n61" class="stm mis"><a href="#n61">61</a></p> +<p id="n62" class="stm mis"><a href="#n62">62</a></p> +<p id="n63" class="stm mis"><a href="#n63">63</a></p> +<p id="n64" class="stm mis"><a href="#n64">64</a></p> +<p id="n65" class="stm mis"><a href="#n65">65</a></p> +<p id="n66" class="stm mis"><a href="#n66">66</a></p> +<p id="n67" class="stm mis"><a href="#n67">67</a></p> +<p id="n68" class="stm mis"><a href="#n68">68</a></p> +<p id="n69" class="stm mis"><a href="#n69">69</a></p> +<p id="n70" class="stm mis"><a href="#n70">70</a></p> +<p id="n71" class="pln"><a href="#n71">71</a></p> +<p id="n72" class="stm mis"><a href="#n72">72</a></p> +<p id="n73" class="stm mis"><a href="#n73">73</a></p> +<p id="n74" class="pln"><a href="#n74">74</a></p> +<p id="n75" class="pln"><a href="#n75">75</a></p> +<p id="n76" class="pln"><a href="#n76">76</a></p> +<p id="n77" class="pln"><a href="#n77">77</a></p> +<p id="n78" class="pln"><a href="#n78">78</a></p> +<p id="n79" class="stm mis"><a href="#n79">79</a></p> +<p id="n80" class="pln"><a href="#n80">80</a></p> +<p id="n81" class="pln"><a href="#n81">81</a></p> +<p id="n82" class="stm mis"><a href="#n82">82</a></p> +<p id="n83" class="stm mis"><a href="#n83">83</a></p> +<p id="n84" class="stm mis"><a href="#n84">84</a></p> +<p id="n85" class="stm mis"><a href="#n85">85</a></p> +<p id="n86" class="stm mis"><a href="#n86">86</a></p> +<p id="n87" class="pln"><a href="#n87">87</a></p> +<p id="n88" class="stm mis"><a href="#n88">88</a></p> +<p id="n89" class="stm mis"><a href="#n89">89</a></p> +<p id="n90" class="stm mis"><a href="#n90">90</a></p> +<p id="n91" class="stm mis"><a href="#n91">91</a></p> +<p id="n92" class="pln"><a href="#n92">92</a></p> +<p id="n93" class="stm mis"><a href="#n93">93</a></p> +<p id="n94" class="stm mis"><a href="#n94">94</a></p> +<p id="n95" class="stm mis"><a href="#n95">95</a></p> +<p id="n96" class="stm mis"><a href="#n96">96</a></p> +<p id="n97" class="pln"><a href="#n97">97</a></p> +<p id="n98" class="stm mis"><a href="#n98">98</a></p> +<p id="n99" class="stm mis"><a href="#n99">99</a></p> +<p id="n100" class="pln"><a href="#n100">100</a></p> +<p id="n101" class="stm mis"><a href="#n101">101</a></p> +<p id="n102" class="stm mis"><a href="#n102">102</a></p> + + </td> + <td class="text"> +<p id="t1" class="pln"><span class="str">""" Test the cogapp.whiteutils module.</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="strut"> </span></p> +<p id="t4" class="pln"><span class="str"> Copyright 2004-2015, 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 mis"><span class="key">from</span> <span class="nam">__future__</span> <span class="key">import</span> <span class="nam">absolute_import</span><span class="strut"> </span></p> +<p id="t8" class="pln"><span class="strut"> </span></p> +<p id="t9" class="stm mis"><span class="key">import</span> <span class="nam">unittest</span><span class="strut"> </span></p> +<p id="t10" class="pln"><span class="strut"> </span></p> +<p id="t11" class="stm mis"><span class="key">from</span> <span class="op">.</span><span class="nam">whiteutils</span> <span class="key">import</span> <span class="op">*</span><span class="strut"> </span></p> +<p id="t12" class="pln"><span class="strut"> </span></p> +<p id="t13" class="pln"><span class="strut"> </span></p> +<p id="t14" class="stm mis"><span class="key">class</span> <span class="nam">WhitePrefixTests</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="t15" class="pln"> <span class="str">""" Test cases for cogapp.whiteutils.</span><span class="strut"> </span></p> +<p id="t16" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t17" class="stm mis"> <span class="key">def</span> <span class="nam">testSingleLine</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="t18" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">whitePrefix</span><span class="op">(</span><span class="op">[</span><span class="str">''</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="t19" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">whitePrefix</span><span class="op">(</span><span class="op">[</span><span class="str">' '</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="t20" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">whitePrefix</span><span class="op">(</span><span class="op">[</span><span class="str">'x'</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="t21" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">whitePrefix</span><span class="op">(</span><span class="op">[</span><span class="str">' x'</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="t22" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">whitePrefix</span><span class="op">(</span><span class="op">[</span><span class="str">'\tx'</span><span class="op">]</span><span class="op">)</span><span class="op">,</span> <span class="str">'\t'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t23" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">whitePrefix</span><span class="op">(</span><span class="op">[</span><span class="str">' x'</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="t24" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">whitePrefix</span><span class="op">(</span><span class="op">[</span><span class="str">' \t \tx '</span><span class="op">]</span><span class="op">)</span><span class="op">,</span> <span class="str">' \t \t'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t25" class="pln"><span class="strut"> </span></p> +<p id="t26" class="stm mis"> <span class="key">def</span> <span class="nam">testMultiLine</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="t27" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">whitePrefix</span><span class="op">(</span><span class="op">[</span><span class="str">' x'</span><span class="op">,</span><span class="str">' x'</span><span class="op">,</span><span class="str">' x'</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="t28" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">whitePrefix</span><span class="op">(</span><span class="op">[</span><span class="str">' y'</span><span class="op">,</span><span class="str">' y'</span><span class="op">,</span><span class="str">' y'</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="t29" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">whitePrefix</span><span class="op">(</span><span class="op">[</span><span class="str">' y'</span><span class="op">,</span><span class="str">' y'</span><span class="op">,</span><span class="str">' y'</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="t30" class="pln"><span class="strut"> </span></p> +<p id="t31" class="stm mis"> <span class="key">def</span> <span class="nam">testBlankLinesAreIgnored</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="t32" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">whitePrefix</span><span class="op">(</span><span class="op">[</span><span class="str">' x'</span><span class="op">,</span><span class="str">' x'</span><span class="op">,</span><span class="str">''</span><span class="op">,</span><span class="str">' x'</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="t33" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">whitePrefix</span><span class="op">(</span><span class="op">[</span><span class="str">''</span><span class="op">,</span><span class="str">' x'</span><span class="op">,</span><span class="str">' x'</span><span class="op">,</span><span class="str">' x'</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="t34" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">whitePrefix</span><span class="op">(</span><span class="op">[</span><span class="str">' x'</span><span class="op">,</span><span class="str">' x'</span><span class="op">,</span><span class="str">' x'</span><span class="op">,</span><span class="str">''</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="t35" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">whitePrefix</span><span class="op">(</span><span class="op">[</span><span class="str">' x'</span><span class="op">,</span><span class="str">' x'</span><span class="op">,</span><span class="str">' '</span><span class="op">,</span><span class="str">' x'</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="t36" class="pln"><span class="strut"> </span></p> +<p id="t37" class="stm mis"> <span class="key">def</span> <span class="nam">testTabCharacters</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="t38" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">whitePrefix</span><span class="op">(</span><span class="op">[</span><span class="str">'\timport sys'</span><span class="op">,</span> <span class="str">''</span><span class="op">,</span> <span class="str">'\tprint sys.argv'</span><span class="op">]</span><span class="op">)</span><span class="op">,</span> <span class="str">'\t'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t39" class="pln"><span class="strut"> </span></p> +<p id="t40" class="stm mis"> <span class="key">def</span> <span class="nam">testDecreasingLengths</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="t41" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">whitePrefix</span><span class="op">(</span><span class="op">[</span><span class="str">' x'</span><span class="op">,</span><span class="str">' x'</span><span class="op">,</span><span class="str">' x'</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="t42" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">whitePrefix</span><span class="op">(</span><span class="op">[</span><span class="str">' x'</span><span class="op">,</span><span class="str">' x'</span><span class="op">,</span><span class="str">' x'</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="t43" class="pln"><span class="strut"> </span></p> +<p id="t44" class="pln"><span class="strut"> </span></p> +<p id="t45" class="stm mis"><span class="key">class</span> <span class="nam">ReindentBlockTests</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="t46" class="pln"> <span class="str">""" Test cases for cogapp.reindentBlock.</span><span class="strut"> </span></p> +<p id="t47" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t48" class="stm mis"> <span class="key">def</span> <span class="nam">testNonTermLine</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="t49" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">reindentBlock</span><span class="op">(</span><span class="str">''</span><span class="op">)</span><span class="op">,</span> <span class="str">''</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t50" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">reindentBlock</span><span class="op">(</span><span class="str">'x'</span><span class="op">)</span><span class="op">,</span> <span class="str">'x'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t51" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">reindentBlock</span><span class="op">(</span><span class="str">' x'</span><span class="op">)</span><span class="op">,</span> <span class="str">'x'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t52" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">reindentBlock</span><span class="op">(</span><span class="str">' x'</span><span class="op">)</span><span class="op">,</span> <span class="str">'x'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t53" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">reindentBlock</span><span class="op">(</span><span class="str">'\tx'</span><span class="op">)</span><span class="op">,</span> <span class="str">'x'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t54" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">reindentBlock</span><span class="op">(</span><span class="str">'x'</span><span class="op">,</span> <span class="str">' '</span><span class="op">)</span><span class="op">,</span> <span class="str">' x'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t55" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">reindentBlock</span><span class="op">(</span><span class="str">'x'</span><span class="op">,</span> <span class="str">'\t'</span><span class="op">)</span><span class="op">,</span> <span class="str">'\tx'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t56" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">reindentBlock</span><span class="op">(</span><span class="str">' x'</span><span class="op">,</span> <span class="str">' '</span><span class="op">)</span><span class="op">,</span> <span class="str">' x'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t57" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">reindentBlock</span><span class="op">(</span><span class="str">' x'</span><span class="op">,</span> <span class="str">'\t'</span><span class="op">)</span><span class="op">,</span> <span class="str">'\tx'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t58" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">reindentBlock</span><span class="op">(</span><span class="str">' x'</span><span class="op">,</span> <span class="str">' '</span><span class="op">)</span><span class="op">,</span> <span class="str">' x'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t59" class="pln"><span class="strut"> </span></p> +<p id="t60" class="stm mis"> <span class="key">def</span> <span class="nam">testSingleLine</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="t61" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">reindentBlock</span><span class="op">(</span><span class="str">'\n'</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="t62" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">reindentBlock</span><span class="op">(</span><span class="str">'x\n'</span><span class="op">)</span><span class="op">,</span> <span class="str">'x\n'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t63" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">reindentBlock</span><span class="op">(</span><span class="str">' x\n'</span><span class="op">)</span><span class="op">,</span> <span class="str">'x\n'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t64" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">reindentBlock</span><span class="op">(</span><span class="str">' x\n'</span><span class="op">)</span><span class="op">,</span> <span class="str">'x\n'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t65" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">reindentBlock</span><span class="op">(</span><span class="str">'\tx\n'</span><span class="op">)</span><span class="op">,</span> <span class="str">'x\n'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t66" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">reindentBlock</span><span class="op">(</span><span class="str">'x\n'</span><span class="op">,</span> <span class="str">' '</span><span class="op">)</span><span class="op">,</span> <span class="str">' x\n'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t67" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">reindentBlock</span><span class="op">(</span><span class="str">'x\n'</span><span class="op">,</span> <span class="str">'\t'</span><span class="op">)</span><span class="op">,</span> <span class="str">'\tx\n'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t68" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">reindentBlock</span><span class="op">(</span><span class="str">' x\n'</span><span class="op">,</span> <span class="str">' '</span><span class="op">)</span><span class="op">,</span> <span class="str">' x\n'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t69" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">reindentBlock</span><span class="op">(</span><span class="str">' x\n'</span><span class="op">,</span> <span class="str">'\t'</span><span class="op">)</span><span class="op">,</span> <span class="str">'\tx\n'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t70" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">reindentBlock</span><span class="op">(</span><span class="str">' x\n'</span><span class="op">,</span> <span class="str">' '</span><span class="op">)</span><span class="op">,</span> <span class="str">' x\n'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t71" class="pln"><span class="strut"> </span></p> +<p id="t72" class="stm mis"> <span class="key">def</span> <span class="nam">testRealBlock</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="t73" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="strut"> </span></p> +<p id="t74" class="pln"> <span class="nam">reindentBlock</span><span class="op">(</span><span class="str">'\timport sys\n\n\tprint sys.argv\n'</span><span class="op">)</span><span class="op">,</span><span class="strut"> </span></p> +<p id="t75" class="pln"> <span class="str">'import sys\n\nprint sys.argv\n'</span><span class="strut"> </span></p> +<p id="t76" class="pln"> <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="strut"> </span></p> +<p id="t79" class="stm mis"><span class="key">class</span> <span class="nam">CommonPrefixTests</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="t80" class="pln"> <span class="str">""" Test cases for cogapp.commonPrefix.</span><span class="strut"> </span></p> +<p id="t81" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t82" class="stm mis"> <span class="key">def</span> <span class="nam">testDegenerateCases</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="t83" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">commonPrefix</span><span class="op">(</span><span class="op">[</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="t84" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">commonPrefix</span><span class="op">(</span><span class="op">[</span><span class="str">''</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="t85" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">commonPrefix</span><span class="op">(</span><span class="op">[</span><span class="str">''</span><span class="op">,</span><span class="str">''</span><span class="op">,</span><span class="str">''</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="op">,</span> <span class="str">''</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t86" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">commonPrefix</span><span class="op">(</span><span class="op">[</span><span class="str">'cat in the hat'</span><span class="op">]</span><span class="op">)</span><span class="op">,</span> <span class="str">'cat in the hat'</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 mis"> <span class="key">def</span> <span class="nam">testNoCommonPrefix</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="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">commonPrefix</span><span class="op">(</span><span class="op">[</span><span class="str">'a'</span><span class="op">,</span><span class="str">'b'</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="t90" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">commonPrefix</span><span class="op">(</span><span class="op">[</span><span class="str">'a'</span><span class="op">,</span><span class="str">'b'</span><span class="op">,</span><span class="str">'c'</span><span class="op">,</span><span class="str">'d'</span><span class="op">,</span><span class="str">'e'</span><span class="op">,</span><span class="str">'f'</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="t91" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">commonPrefix</span><span class="op">(</span><span class="op">[</span><span class="str">'a'</span><span class="op">,</span><span class="str">'a'</span><span class="op">,</span><span class="str">'a'</span><span class="op">,</span><span class="str">'a'</span><span class="op">,</span><span class="str">'a'</span><span class="op">,</span><span class="str">'x'</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="t92" class="pln"><span class="strut"> </span></p> +<p id="t93" class="stm mis"> <span class="key">def</span> <span class="nam">testUsualCases</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="t94" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">commonPrefix</span><span class="op">(</span><span class="op">[</span><span class="str">'ab'</span><span class="op">,</span> <span class="str">'ac'</span><span class="op">]</span><span class="op">)</span><span class="op">,</span> <span class="str">'a'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t95" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">commonPrefix</span><span class="op">(</span><span class="op">[</span><span class="str">'aab'</span><span class="op">,</span> <span class="str">'aac'</span><span class="op">]</span><span class="op">)</span><span class="op">,</span> <span class="str">'aa'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t96" class="stm mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">commonPrefix</span><span class="op">(</span><span class="op">[</span><span class="str">'aab'</span><span class="op">,</span> <span class="str">'aab'</span><span class="op">,</span> <span class="str">'aab'</span><span class="op">,</span> <span class="str">'aac'</span><span class="op">]</span><span class="op">)</span><span class="op">,</span> <span class="str">'aa'</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t97" class="pln"><span class="strut"> </span></p> +<p id="t98" class="stm mis"> <span class="key">def</span> <span class="nam">testBlankLine</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 mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">commonPrefix</span><span class="op">(</span><span class="op">[</span><span class="str">'abc'</span><span class="op">,</span> <span class="str">'abx'</span><span class="op">,</span> <span class="str">''</span><span class="op">,</span> <span class="str">'aby'</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="t100" class="pln"><span class="strut"> </span></p> +<p id="t101" class="stm mis"> <span class="key">def</span> <span class="nam">testDecreasingLengths</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 mis"> <span class="nam">self</span><span class="op">.</span><span class="nam">assertEqual</span><span class="op">(</span><span class="nam">commonPrefix</span><span class="op">(</span><span class="op">[</span><span class="str">'abcd'</span><span class="op">,</span> <span class="str">'abc'</span><span class="op">,</span> <span class="str">'ab'</span><span class="op">]</span><span class="op">)</span><span class="op">,</span> <span class="str">'ab'</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="https://coverage.readthedocs.org">coverage.py v4.0.3</a>, + created at 2015-11-24 07:02 + </p> + </div> +</div> + +</body> +</html> diff --git a/doc/sample_html/cogapp_whiteutils.html b/doc/sample_html/cogapp_whiteutils.html deleted file mode 100644 index c262ff9c..00000000 --- a/doc/sample_html/cogapp_whiteutils.html +++ /dev/null @@ -1,226 +0,0 @@ -<!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 cogapp/whiteutils: 92%</title> - <link rel='stylesheet' href='style.css' type='text/css'> - - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript' charset='utf-8'> - jQuery(document).ready(coverage.pyfile_ready); - </script> -</head> -<body id='pyfile'> - -<div id='header'> - <div class='content'> - <h1>Coverage for <b>cogapp/whiteutils</b> : - <span class='pc_cov'>92%</span> - </h1> - <img id='keyboard_icon' src='keybd_closed.png'> - <h2 class='stats'> - 45 statements - <span class='run hide_run shortkey_r button_toggle_run'>42 run</span> - <span class='mis shortkey_m button_toggle_mis'>3 missing</span> - <span class='exc shortkey_x button_toggle_exc'>0 excluded</span> - - <span class='par run hide_run shortkey_p button_toggle_par'>3 partial</span> - - </h2> - </div> -</div> - -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png'> -<p class='legend'>Hot-keys on this page</p> - <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays - </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk - </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page - </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk - </p> - </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='pln'><a href='#n3'>3</a></p> -<p id='n4' class='pln'><a href='#n4'>4</a></p> -<p id='n5' class='pln'><a href='#n5'>5</a></p> -<p id='n6' class='pln'><a href='#n6'>6</a></p> -<p id='n7' class='stm run hide_run'><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='pln'><a href='#n10'>10</a></p> -<p id='n11' class='stm run hide_run'><a href='#n11'>11</a></p> -<p id='n12' class='pln'><a href='#n12'>12</a></p> -<p id='n13' class='pln'><a href='#n13'>13</a></p> -<p id='n14' class='pln'><a href='#n14'>14</a></p> -<p id='n15' class='pln'><a href='#n15'>15</a></p> -<p id='n16' class='stm run hide_run'><a href='#n16'>16</a></p> -<p id='n17' class='pln'><a href='#n17'>17</a></p> -<p id='n18' class='stm run hide_run'><a href='#n18'>18</a></p> -<p id='n19' class='pln'><a href='#n19'>19</a></p> -<p id='n20' class='pln'><a href='#n20'>20</a></p> -<p id='n21' class='pln'><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 par run hide_run'><a href='#n23'>23</a></p> -<p id='n24' class='stm run hide_run'><a href='#n24'>24</a></p> -<p id='n25' class='stm run hide_run'><a href='#n25'>25</a></p> -<p id='n26' class='pln'><a href='#n26'>26</a></p> -<p id='n27' class='pln'><a href='#n27'>27</a></p> -<p id='n28' class='pln'><a href='#n28'>28</a></p> -<p id='n29' class='stm run hide_run'><a href='#n29'>29</a></p> -<p id='n30' class='stm run hide_run'><a href='#n30'>30</a></p> -<p id='n31' class='stm par run hide_run'><a href='#n31'>31</a></p> -<p id='n32' class='stm mis'><a href='#n32'>32</a></p> -<p id='n33' class='stm mis'><a href='#n33'>33</a></p> -<p id='n34' class='stm run hide_run'><a href='#n34'>34</a></p> -<p id='n35' class='pln'><a href='#n35'>35</a></p> -<p id='n36' class='stm run hide_run'><a href='#n36'>36</a></p> -<p id='n37' class='pln'><a href='#n37'>37</a></p> -<p id='n38' class='pln'><a href='#n38'>38</a></p> -<p id='n39' class='pln'><a href='#n39'>39</a></p> -<p id='n40' class='pln'><a href='#n40'>40</a></p> -<p id='n41' class='stm run hide_run'><a href='#n41'>41</a></p> -<p id='n42' class='stm run hide_run'><a href='#n42'>42</a></p> -<p id='n43' class='stm run hide_run'><a href='#n43'>43</a></p> -<p id='n44' class='stm run hide_run'><a href='#n44'>44</a></p> -<p id='n45' class='stm run hide_run'><a href='#n45'>45</a></p> -<p id='n46' class='stm run hide_run'><a href='#n46'>46</a></p> -<p id='n47' class='stm run hide_run'><a href='#n47'>47</a></p> -<p id='n48' class='stm run hide_run'><a href='#n48'>48</a></p> -<p id='n49' class='stm run hide_run'><a href='#n49'>49</a></p> -<p id='n50' class='stm run hide_run'><a href='#n50'>50</a></p> -<p id='n51' class='stm run hide_run'><a href='#n51'>51</a></p> -<p id='n52' class='stm run hide_run'><a href='#n52'>52</a></p> -<p id='n53' class='stm run hide_run'><a href='#n53'>53</a></p> -<p id='n54' class='stm run hide_run'><a href='#n54'>54</a></p> -<p id='n55' class='pln'><a href='#n55'>55</a></p> -<p id='n56' class='stm run hide_run'><a href='#n56'>56</a></p> -<p id='n57' class='pln'><a href='#n57'>57</a></p> -<p id='n58' class='pln'><a href='#n58'>58</a></p> -<p id='n59' class='stm par run hide_run'><a href='#n59'>59</a></p> -<p id='n60' class='stm mis'><a href='#n60'>60</a></p> -<p id='n61' class='stm run hide_run'><a href='#n61'>61</a></p> -<p id='n62' class='stm run hide_run'><a href='#n62'>62</a></p> -<p id='n63' class='stm run hide_run'><a href='#n63'>63</a></p> -<p id='n64' class='stm run hide_run'><a href='#n64'>64</a></p> -<p id='n65' class='stm run hide_run'><a href='#n65'>65</a></p> -<p id='n66' class='stm run hide_run'><a href='#n66'>66</a></p> -<p id='n67' class='stm run hide_run'><a href='#n67'>67</a></p> -<p id='n68' class='stm run hide_run'><a href='#n68'>68</a></p> -<p id='n69' class='stm run hide_run'><a href='#n69'>69</a></p> -<p id='n70' class='stm run hide_run'><a href='#n70'>70</a></p> -<p id='n71' class='stm run hide_run'><a href='#n71'>71</a></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-2012, 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'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>absolute_import</span><span class='strut'> </span></p> -<p id='t8' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>re</span><span class='strut'> </span></p> -<p id='t9' class='stm run hide_run'><span class='key'>from</span> <span class='op'>.</span><span class='nam'>backward</span> <span class='key'>import</span> <span class='nam'>string_types</span><span class='op'>,</span> <span class='nam'>bytes_types</span><span class='op'>,</span> <span class='nam'>to_bytes</span><span class='op'>,</span> <span class='nam'>text_types</span><span class='op'>,</span> <span class='nam'>b</span><span class='strut'> </span></p> -<p id='t10' class='pln'><span class='strut'> </span></p> -<p id='t11' 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='t12' class='pln'> <span class='str'>""" Determine the whitespace prefix common to all non-blank lines</span><span class='strut'> </span></p> -<p id='t13' class='pln'><span class='str'> in the argument list.</span><span class='strut'> </span></p> -<p id='t14' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t15' class='pln'> <span class='com'># Remove all blank lines from the list</span><span class='strut'> </span></p> -<p id='t16' 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='t17' class='pln'><span class='strut'> </span></p> -<p id='t18' 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='t19' class='pln'><span class='strut'> </span></p> -<p id='t20' class='pln'> <span class='com'># Find initial whitespace chunk in the first line.</span><span class='strut'> </span></p> -<p id='t21' class='pln'> <span class='com'># This is the best prefix we can hope for.</span><span class='strut'> </span></p> -<p id='t22' class='stm run hide_run'> <span class='nam'>pat</span> <span class='op'>=</span> <span class='str'>r'\s*'</span><span class='strut'> </span></p> -<p id='t23' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>25</span> <span class='key'>if</span> <span class='nam'>isinstance</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='nam'>bytes_types</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t24' class='stm run hide_run'> <span class='nam'>pat</span> <span class='op'>=</span> <span class='nam'>to_bytes</span><span class='op'>(</span><span class='nam'>pat</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t25' 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='nam'>pat</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='t26' class='pln'><span class='strut'> </span></p> -<p id='t27' class='pln'> <span class='com'># Loop over the other strings, keeping only as much of</span><span class='strut'> </span></p> -<p id='t28' class='pln'> <span class='com'># the prefix as matches each string.</span><span class='strut'> </span></p> -<p id='t29' 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='t30' 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='t31' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>32</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='t32' 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='t33' class='stm mis'> <span class='key'>break</span><span class='strut'> </span></p> -<p id='t34' class='stm run hide_run'> <span class='key'>return</span> <span class='nam'>prefix</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='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='t37' 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='t38' class='pln'><span class='str'> Remove any common whitespace indentation.</span><span class='strut'> </span></p> -<p id='t39' class='pln'><span class='str'> Re-indent using newIndent, and return it as a single string.</span><span class='strut'> </span></p> -<p id='t40' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t41' class='stm run hide_run'> <span class='nam'>sep</span><span class='op'>,</span> <span class='nam'>nothing</span> <span class='op'>=</span> <span class='str'>'\n'</span><span class='op'>,</span> <span class='str'>''</span><span class='strut'> </span></p> -<p id='t42' 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'>bytes_types</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t43' class='stm run hide_run'> <span class='nam'>sep</span><span class='op'>,</span> <span class='nam'>nothing</span> <span class='op'>=</span> <span class='nam'>b</span><span class='op'>(</span><span class='str'>'\n'</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>b</span><span class='op'>(</span><span class='str'>''</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t44' 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'>string_types</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t45' 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='nam'>sep</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t46' 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='t47' 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='t48' 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='t49' 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='t50' 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='nam'>nothing</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t51' 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='t52' 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='t53' 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='t54' class='stm run hide_run'> <span class='key'>return</span> <span class='nam'>sep</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='t55' class='pln'><span class='strut'> </span></p> -<p id='t56' 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='t57' 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='t58' class='pln'><span class='str'> """</span><span class='strut'> </span></p> -<p id='t59' class='stm par run hide_run'><span class='annotate' title='no jump to this line number'>60</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='t60' class='stm mis'> <span class='key'>return</span> <span class='str'>''</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'>strings</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='strut'> </span></p> -<p id='t62' 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='t63' 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='t64' 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='t65' 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='t66' class='stm run hide_run'> <span class='key'>return</span> <span class='str'>''</span><span class='strut'> </span></p> -<p id='t67' 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='t68' 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='t69' 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='t70' class='stm run hide_run'> <span class='key'>break</span><span class='strut'> </span></p> -<p id='t71' class='stm run hide_run'> <span class='key'>return</span> <span class='nam'>prefix</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.7.1</a> - </p> - </div> -</div> - -</body> -</html> diff --git a/doc/sample_html/cogapp_whiteutils_py.html b/doc/sample_html/cogapp_whiteutils_py.html new file mode 100644 index 00000000..eee9d628 --- /dev/null +++ b/doc/sample_html/cogapp_whiteutils_py.html @@ -0,0 +1,233 @@ + + + +<!DOCTYPE html> +<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 cogapp/whiteutils.py: 92.21%</title> + <link rel="stylesheet" href="style.css" type="text/css"> + + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> + jQuery(document).ready(coverage.pyfile_ready); + </script> +</head> +<body class="pyfile"> + +<div id="header"> + <div class="content"> + <h1>Coverage for <b>cogapp/whiteutils.py</b> : + <span class="pc_cov">92.21%</span> + </h1> + + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> + + <h2 class="stats"> + 45 statements + <span class="run hide_run shortkey_r button_toggle_run">42 run</span> + <span class="mis shortkey_m button_toggle_mis">3 missing</span> + <span class="exc shortkey_x button_toggle_exc">0 excluded</span> + + + <span class="par run hide_run shortkey_p button_toggle_par">3 partial</span> + + </h2> + </div> +</div> + +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> + <div> +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays + </p> +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk + </p> +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page + </p> +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk + </p> + </div> +</div> + +<div id="source"> + <table> + <tr> + <td class="linenos"> +<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="pln"><a href="#n4">4</a></p> +<p id="n5" class="pln"><a href="#n5">5</a></p> +<p id="n6" class="pln"><a href="#n6">6</a></p> +<p id="n7" class="stm run hide_run"><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="pln"><a href="#n10">10</a></p> +<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p> +<p id="n12" class="pln"><a href="#n12">12</a></p> +<p id="n13" class="pln"><a href="#n13">13</a></p> +<p id="n14" class="pln"><a href="#n14">14</a></p> +<p id="n15" class="pln"><a href="#n15">15</a></p> +<p id="n16" class="stm run hide_run"><a href="#n16">16</a></p> +<p id="n17" class="pln"><a href="#n17">17</a></p> +<p id="n18" class="stm run hide_run"><a href="#n18">18</a></p> +<p id="n19" class="pln"><a href="#n19">19</a></p> +<p id="n20" class="pln"><a href="#n20">20</a></p> +<p id="n21" class="pln"><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 par run hide_run"><a href="#n23">23</a></p> +<p id="n24" class="stm run hide_run"><a href="#n24">24</a></p> +<p id="n25" class="stm run hide_run"><a href="#n25">25</a></p> +<p id="n26" class="pln"><a href="#n26">26</a></p> +<p id="n27" class="pln"><a href="#n27">27</a></p> +<p id="n28" class="pln"><a href="#n28">28</a></p> +<p id="n29" class="stm run hide_run"><a href="#n29">29</a></p> +<p id="n30" class="stm run hide_run"><a href="#n30">30</a></p> +<p id="n31" class="stm par run hide_run"><a href="#n31">31</a></p> +<p id="n32" class="stm mis"><a href="#n32">32</a></p> +<p id="n33" class="stm mis"><a href="#n33">33</a></p> +<p id="n34" class="stm run hide_run"><a href="#n34">34</a></p> +<p id="n35" class="pln"><a href="#n35">35</a></p> +<p id="n36" class="stm run hide_run"><a href="#n36">36</a></p> +<p id="n37" class="pln"><a href="#n37">37</a></p> +<p id="n38" class="pln"><a href="#n38">38</a></p> +<p id="n39" class="pln"><a href="#n39">39</a></p> +<p id="n40" class="pln"><a href="#n40">40</a></p> +<p id="n41" class="stm run hide_run"><a href="#n41">41</a></p> +<p id="n42" class="stm run hide_run"><a href="#n42">42</a></p> +<p id="n43" class="stm run hide_run"><a href="#n43">43</a></p> +<p id="n44" class="stm run hide_run"><a href="#n44">44</a></p> +<p id="n45" class="stm run hide_run"><a href="#n45">45</a></p> +<p id="n46" class="stm run hide_run"><a href="#n46">46</a></p> +<p id="n47" class="stm run hide_run"><a href="#n47">47</a></p> +<p id="n48" class="stm run hide_run"><a href="#n48">48</a></p> +<p id="n49" class="stm run hide_run"><a href="#n49">49</a></p> +<p id="n50" class="stm run hide_run"><a href="#n50">50</a></p> +<p id="n51" class="stm run hide_run"><a href="#n51">51</a></p> +<p id="n52" class="stm run hide_run"><a href="#n52">52</a></p> +<p id="n53" class="stm run hide_run"><a href="#n53">53</a></p> +<p id="n54" class="stm run hide_run"><a href="#n54">54</a></p> +<p id="n55" class="pln"><a href="#n55">55</a></p> +<p id="n56" class="stm run hide_run"><a href="#n56">56</a></p> +<p id="n57" class="pln"><a href="#n57">57</a></p> +<p id="n58" class="pln"><a href="#n58">58</a></p> +<p id="n59" class="stm par run hide_run"><a href="#n59">59</a></p> +<p id="n60" class="stm mis"><a href="#n60">60</a></p> +<p id="n61" class="stm run hide_run"><a href="#n61">61</a></p> +<p id="n62" class="stm run hide_run"><a href="#n62">62</a></p> +<p id="n63" class="stm run hide_run"><a href="#n63">63</a></p> +<p id="n64" class="stm run hide_run"><a href="#n64">64</a></p> +<p id="n65" class="stm run hide_run"><a href="#n65">65</a></p> +<p id="n66" class="stm run hide_run"><a href="#n66">66</a></p> +<p id="n67" class="stm run hide_run"><a href="#n67">67</a></p> +<p id="n68" class="stm run hide_run"><a href="#n68">68</a></p> +<p id="n69" class="stm run hide_run"><a href="#n69">69</a></p> +<p id="n70" class="stm run hide_run"><a href="#n70">70</a></p> +<p id="n71" class="stm run hide_run"><a href="#n71">71</a></p> + + </td> + <td class="text"> +<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="strut"> </span></p> +<p id="t4" class="pln"><span class="str"> Copyright 2004-2015, 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">from</span> <span class="nam">__future__</span> <span class="key">import</span> <span class="nam">absolute_import</span><span class="strut"> </span></p> +<p id="t8" class="stm run hide_run"><span class="key">import</span> <span class="nam">re</span><span class="strut"> </span></p> +<p id="t9" class="stm run hide_run"><span class="key">from</span> <span class="op">.</span><span class="nam">backward</span> <span class="key">import</span> <span class="nam">string_types</span><span class="op">,</span> <span class="nam">bytes_types</span><span class="op">,</span> <span class="nam">to_bytes</span><span class="op">,</span> <span class="nam">b</span><span class="strut"> </span></p> +<p id="t10" class="pln"><span class="strut"> </span></p> +<p id="t11" 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="t12" class="pln"> <span class="str">""" Determine the whitespace prefix common to all non-blank lines</span><span class="strut"> </span></p> +<p id="t13" class="pln"><span class="str"> in the argument list.</span><span class="strut"> </span></p> +<p id="t14" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t15" class="pln"> <span class="com"># Remove all blank lines from the list</span><span class="strut"> </span></p> +<p id="t16" 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="t17" class="pln"><span class="strut"> </span></p> +<p id="t18" 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="t19" class="pln"><span class="strut"> </span></p> +<p id="t20" class="pln"> <span class="com"># Find initial whitespace chunk in the first line.</span><span class="strut"> </span></p> +<p id="t21" class="pln"> <span class="com"># This is the best prefix we can hope for.</span><span class="strut"> </span></p> +<p id="t22" class="stm run hide_run"> <span class="nam">pat</span> <span class="op">=</span> <span class="str">r'\s*'</span><span class="strut"> </span></p> +<p id="t23" class="stm par run hide_run"><span class="annotate" title="Line 23 was executed, but never jumped to line 25">23 ↛ 25 [?]</span> <span class="key">if</span> <span class="nam">isinstance</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="nam">bytes_types</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t24" class="stm run hide_run"> <span class="nam">pat</span> <span class="op">=</span> <span class="nam">to_bytes</span><span class="op">(</span><span class="nam">pat</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t25" 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="nam">pat</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="t26" class="pln"><span class="strut"> </span></p> +<p id="t27" class="pln"> <span class="com"># Loop over the other strings, keeping only as much of</span><span class="strut"> </span></p> +<p id="t28" class="pln"> <span class="com"># the prefix as matches each string.</span><span class="strut"> </span></p> +<p id="t29" 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="t30" 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="t31" class="stm par run hide_run"><span class="annotate" title="Line 31 was executed, but never jumped to line 32">31 ↛ 32 [?]</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="t32" 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="t33" class="stm mis"> <span class="key">break</span><span class="strut"> </span></p> +<p id="t34" class="stm run hide_run"> <span class="key">return</span> <span class="nam">prefix</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="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="t37" 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="t38" class="pln"><span class="str"> Remove any common whitespace indentation.</span><span class="strut"> </span></p> +<p id="t39" class="pln"><span class="str"> Re-indent using newIndent, and return it as a single string.</span><span class="strut"> </span></p> +<p id="t40" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t41" class="stm run hide_run"> <span class="nam">sep</span><span class="op">,</span> <span class="nam">nothing</span> <span class="op">=</span> <span class="str">'\n'</span><span class="op">,</span> <span class="str">''</span><span class="strut"> </span></p> +<p id="t42" 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">bytes_types</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t43" class="stm run hide_run"> <span class="nam">sep</span><span class="op">,</span> <span class="nam">nothing</span> <span class="op">=</span> <span class="nam">b</span><span class="op">(</span><span class="str">'\n'</span><span class="op">)</span><span class="op">,</span> <span class="nam">b</span><span class="op">(</span><span class="str">''</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t44" 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">string_types</span><span class="op">)</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t45" 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="nam">sep</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t46" 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="t47" 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="t48" 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="t49" 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="t50" 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="nam">nothing</span><span class="op">,</span> <span class="num">1</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t51" 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="t52" 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="t53" 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="t54" class="stm run hide_run"> <span class="key">return</span> <span class="nam">sep</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="t55" class="pln"><span class="strut"> </span></p> +<p id="t56" 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="t57" 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="t58" class="pln"><span class="str"> """</span><span class="strut"> </span></p> +<p id="t59" class="stm par run hide_run"><span class="annotate" title="Line 59 was executed, but never jumped to line 60">59 ↛ 60 [?]</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="t60" class="stm mis"> <span class="key">return</span> <span class="str">''</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">strings</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="strut"> </span></p> +<p id="t62" 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="t63" 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="t64" 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="t65" 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="t66" class="stm run hide_run"> <span class="key">return</span> <span class="str">''</span><span class="strut"> </span></p> +<p id="t67" 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="t68" 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="t69" 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="t70" class="stm run hide_run"> <span class="key">break</span><span class="strut"> </span></p> +<p id="t71" class="stm run hide_run"> <span class="key">return</span> <span class="nam">prefix</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="https://coverage.readthedocs.org">coverage.py v4.0.3</a>, + created at 2015-11-24 07:02 + </p> + </div> +</div> + +</body> +</html> diff --git a/doc/sample_html/coverage_html.js b/doc/sample_html/coverage_html.js index b24006d2..bd6a8753 100644 --- a/doc/sample_html/coverage_html.js +++ b/doc/sample_html/coverage_html.js @@ -1,10 +1,13 @@ +// Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +// For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + // Coverage.py HTML report browser code. /*jslint browser: true, sloppy: true, vars: true, plusplus: true, maxerr: 50, indent: 4 */ /*global coverage: true, document, window, $ */ coverage = {}; -// Find all the elements with shortkey_* class, and use them to assign a shotrtcut key. +// Find all the elements with shortkey_* class, and use them to assign a shortcut key. coverage.assign_shortkeys = function () { $("*[class*='shortkey_']").each(function (i, e) { $.each($(e).attr("class").split(" "), function (i, c) { @@ -35,6 +38,137 @@ coverage.wire_up_help_panel = function () { }); }; +// Create the events for the filter box. +coverage.wire_up_filter = function () { + // Cache elements. + var table = $("table.index"); + var table_rows = table.find("tbody tr"); + var table_row_names = table_rows.find("td.name a"); + var no_rows = $("#no_rows"); + + // Create a duplicate table footer that we can modify with dynamic summed values. + var table_footer = $("table.index tfoot tr"); + var table_dynamic_footer = table_footer.clone(); + table_dynamic_footer.attr('class', 'total_dynamic hidden'); + table_footer.after(table_dynamic_footer); + + // Observe filter keyevents. + $("#filter").on("keyup change", $.debounce(150, function (event) { + var filter_value = $(this).val(); + + if (filter_value === "") { + // Filter box is empty, remove all filtering. + table_rows.removeClass("hidden"); + + // Show standard footer, hide dynamic footer. + table_footer.removeClass("hidden"); + table_dynamic_footer.addClass("hidden"); + + // Hide placeholder, show table. + if (no_rows.length > 0) { + no_rows.hide(); + } + table.show(); + + } + else { + // Filter table items by value. + var hide = $([]); + var show = $([]); + + // Compile elements to hide / show. + $.each(table_row_names, function () { + var element = $(this).parents("tr"); + + if ($(this).text().indexOf(filter_value) === -1) { + // hide + hide = hide.add(element); + } + else { + // show + show = show.add(element); + } + }); + + // Perform DOM manipulation. + hide.addClass("hidden"); + show.removeClass("hidden"); + + // Show placeholder if no rows will be displayed. + if (no_rows.length > 0) { + if (show.length === 0) { + // Show placeholder, hide table. + no_rows.show(); + table.hide(); + } + else { + // Hide placeholder, show table. + no_rows.hide(); + table.show(); + } + } + + // Manage dynamic header: + if (hide.length > 0) { + // Calculate new dynamic sum values based on visible rows. + for (var column = 2; column < 20; column++) { + // Calculate summed value. + var cells = table_rows.find('td:nth-child(' + column + ')'); + if (!cells.length) { + // No more columns...! + break; + } + + var sum = 0, numer = 0, denom = 0; + $.each(cells.filter(':visible'), function () { + var ratio = $(this).data("ratio"); + if (ratio) { + var splitted = ratio.split(" "); + numer += parseInt(splitted[0], 10); + denom += parseInt(splitted[1], 10); + } + else { + sum += parseInt(this.innerHTML, 10); + } + }); + + // Get footer cell element. + var footer_cell = table_dynamic_footer.find('td:nth-child(' + column + ')'); + + // Set value into dynamic footer cell element. + if (cells[0].innerHTML.indexOf('%') > -1) { + // Percentage columns use the numerator and denominator, + // and adapt to the number of decimal places. + var match = /\.([0-9]+)/.exec(cells[0].innerHTML); + var places = 0; + if (match) { + places = match[1].length; + } + var pct = numer * 100 / denom; + footer_cell.text(pct.toFixed(places) + '%'); + } + else { + footer_cell.text(sum); + } + } + + // Hide standard footer, show dynamic footer. + table_footer.addClass("hidden"); + table_dynamic_footer.removeClass("hidden"); + } + else { + // Show standard footer, hide dynamic footer. + table_footer.removeClass("hidden"); + table_dynamic_footer.addClass("hidden"); + } + } + })); + + // Trigger change event on setup, to force filter on page refresh + // (filter value may still be present). + $("#filter").trigger("change"); +}; + // Loaded on index.html coverage.index_ready = function ($) { // Look for a cookie containing previous sort settings: @@ -95,6 +229,7 @@ coverage.index_ready = function ($) { coverage.assign_shortkeys(); coverage.wire_up_help_panel(); + coverage.wire_up_filter(); // Watch for page unload events so we can save the final sort settings: $(window).unload(function () { @@ -187,12 +322,13 @@ coverage.to_next_chunk = function () { // Find the start of the next colored chunk. var probe = c.sel_end; + var color, probe_line; while (true) { - var probe_line = c.line_elt(probe); + probe_line = c.line_elt(probe); if (probe_line.length === 0) { return; } - var color = probe_line.css("background-color"); + color = probe_line.css("background-color"); if (!c.is_transparent(color)) { break; } diff --git a/doc/sample_html/index.html b/doc/sample_html/index.html index 336868ba..f2dd3a55 100644 --- a/doc/sample_html/index.html +++ b/doc/sample_html/index.html @@ -1,81 +1,90 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> + + + +<!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Coverage report</title> - <link rel='stylesheet' href='style.css' type='text/css'> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.tablesorter.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript' charset='utf-8'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.debounce.min.js"></script> + <script type="text/javascript" src="jquery.tablesorter.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.index_ready); </script> </head> -<body id='indexfile'> +<body class="indexfile"> -<div id='header'> - <div class='content'> +<div id="header"> + <div class="content"> <h1>Coverage report: - <span class='pc_cov'>40%</span> + <span class="pc_cov">37.82%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png'> + + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> + + <form id="filter_container"> + <input id="filter" type="text" value="" placeholder="filter..." /> + </form> </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png'> - <p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> + <p class="legend">Hot-keys on this page</p> <div> - <p class='keyhelp'> - <span class='key'>n</span> - <span class='key'>s</span> - <span class='key'>m</span> - <span class='key'>x</span> + <p class="keyhelp"> + <span class="key">n</span> + <span class="key">s</span> + <span class="key">m</span> + <span class="key">x</span> - <span class='key'>b</span> - <span class='key'>p</span> + <span class="key">b</span> + <span class="key">p</span> - <span class='key'>c</span> change column sorting + <span class="key">c</span> change column sorting </p> </div> </div> -<div id='index'> - <table class='index'> +<div id="index"> + <table class="index"> <thead> - <tr class='tablehead' title='Click to sort'> - <th class='name left headerSortDown shortkey_n'>Module</th> - <th class='shortkey_s'>statements</th> - <th class='shortkey_m'>missing</th> - <th class='shortkey_x'>excluded</th> + <tr class="tablehead" title="Click to sort"> + <th class="name left headerSortDown shortkey_n">Module</th> + <th class="shortkey_s">statements</th> + <th class="shortkey_m">missing</th> + <th class="shortkey_x">excluded</th> - <th class='shortkey_b'>branches</th> - <th class='shortkey_p'>partial</th> + <th class="shortkey_b">branches</th> + <th class="shortkey_p">partial</th> - <th class='right shortkey_c'>coverage</th> + <th class="right shortkey_c">coverage</th> </tr> </thead> <tfoot> - <tr class='total'> - <td class='name left'>Total</td> - <td>1242</td> - <td>746</td> - <td>27</td> + <tr class="total"> + <td class="name left">Total</td> + <td>1348</td> + <td>838</td> + <td>13</td> - <td>216</td> + <td>228</td> <td>30</td> - <td class='right'>40%</td> + <td class="right" data-ratio="596 1576">37.82%</td> </tr> </tfoot> <tbody> - <tr class='file'> - <td class='name left'><a href='cogapp___init__.html'>cogapp/__init__</a></td> + <tr class="file"> + <td class="name left"><a href="cogapp___init___py.html">cogapp/__init__.py</a></td> <td>2</td> <td>0</td> <td>0</td> @@ -83,11 +92,11 @@ <td>0</td> <td>0</td> - <td class='right'>100%</td> + <td class="right" data-ratio="2 2">100.00%</td> </tr> - <tr class='file'> - <td class='name left'><a href='cogapp___main__.html'>cogapp/__main__</a></td> + <tr class="file"> + <td class="name left"><a href="cogapp___main___py.html">cogapp/__main__.py</a></td> <td>3</td> <td>3</td> <td>0</td> @@ -95,35 +104,35 @@ <td>0</td> <td>0</td> - <td class='right'>0%</td> + <td class="right" data-ratio="0 3">0.00%</td> </tr> - <tr class='file'> - <td class='name left'><a href='cogapp_backward.html'>cogapp/backward</a></td> - <td>25</td> - <td>12</td> + <tr class="file"> + <td class="name left"><a href="cogapp_backward_py.html">cogapp/backward.py</a></td> + <td>19</td> + <td>8</td> <td>0</td> <td>2</td> <td>1</td> - <td class='right'>52%</td> + <td class="right" data-ratio="12 21">57.14%</td> </tr> - <tr class='file'> - <td class='name left'><a href='cogapp_cogapp.html'>cogapp/cogapp</a></td> - <td>403</td> - <td>180</td> - <td>3</td> + <tr class="file"> + <td class="name left"><a href="cogapp_cogapp_py.html">cogapp/cogapp.py</a></td> + <td>423</td> + <td>194</td> + <td>4</td> - <td>158</td> + <td>168</td> <td>26</td> - <td class='right'>49%</td> + <td class="right" data-ratio="283 591">47.88%</td> </tr> - <tr class='file'> - <td class='name left'><a href='cogapp_makefiles.html'>cogapp/makefiles</a></td> + <tr class="file"> + <td class="name left"><a href="cogapp_makefiles_py.html">cogapp/makefiles.py</a></td> <td>28</td> <td>20</td> <td>3</td> @@ -131,47 +140,47 @@ <td>14</td> <td>0</td> - <td class='right'>19%</td> + <td class="right" data-ratio="8 42">19.05%</td> </tr> - <tr class='file'> - <td class='name left'><a href='cogapp_test_cogapp.html'>cogapp/test_cogapp</a></td> - <td>612</td> - <td>404</td> - <td>17</td> + <tr class="file"> + <td class="name left"><a href="cogapp_test_cogapp_py.html">cogapp/test_cogapp.py</a></td> + <td>704</td> + <td>486</td> + <td>6</td> - <td>4</td> + <td>6</td> <td>0</td> - <td class='right'>34%</td> + <td class="right" data-ratio="220 710">30.99%</td> </tr> - <tr class='file'> - <td class='name left'><a href='cogapp_test_makefiles.html'>cogapp/test_makefiles</a></td> + <tr class="file"> + <td class="name left"><a href="cogapp_test_makefiles_py.html">cogapp/test_makefiles.py</a></td> <td>55</td> <td>55</td> - <td>2</td> + <td>0</td> <td>6</td> <td>0</td> - <td class='right'>0%</td> + <td class="right" data-ratio="0 61">0.00%</td> </tr> - <tr class='file'> - <td class='name left'><a href='cogapp_test_whiteutils.html'>cogapp/test_whiteutils</a></td> + <tr class="file"> + <td class="name left"><a href="cogapp_test_whiteutils_py.html">cogapp/test_whiteutils.py</a></td> <td>69</td> <td>69</td> - <td>2</td> + <td>0</td> <td>0</td> <td>0</td> - <td class='right'>0%</td> + <td class="right" data-ratio="0 69">0.00%</td> </tr> - <tr class='file'> - <td class='name left'><a href='cogapp_whiteutils.html'>cogapp/whiteutils</a></td> + <tr class="file"> + <td class="name left"><a href="cogapp_whiteutils_py.html">cogapp/whiteutils.py</a></td> <td>45</td> <td>3</td> <td>0</td> @@ -179,17 +188,22 @@ <td>32</td> <td>3</td> - <td class='right'>92%</td> + <td class="right" data-ratio="71 77">92.21%</td> </tr> </tbody> </table> + + <p id="no_rows"> + No items found using the specified filter. + </p> </div> -<div id='footer'> - <div class='content'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.7.1</a> + <a class="nav" href="https://coverage.readthedocs.org">coverage.py v4.0.3</a>, + created at 2015-11-24 07:02 </p> </div> </div> diff --git a/doc/sample_html/jquery.debounce.min.js b/doc/sample_html/jquery.debounce.min.js new file mode 100644 index 00000000..648fe5d3 --- /dev/null +++ b/doc/sample_html/jquery.debounce.min.js @@ -0,0 +1,9 @@ +/* + * jQuery throttle / debounce - v1.1 - 3/7/2010 + * http://benalman.com/projects/jquery-throttle-debounce-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ +(function(b,c){var $=b.jQuery||b.Cowboy||(b.Cowboy={}),a;$.throttle=a=function(e,f,j,i){var h,d=0;if(typeof f!=="boolean"){i=j;j=f;f=c}function g(){var o=this,m=+new Date()-d,n=arguments;function l(){d=+new Date();j.apply(o,n)}function k(){h=c}if(i&&!h){l()}h&&clearTimeout(h);if(i===c&&m>e){l()}else{if(f!==true){h=setTimeout(i?k:l,i===c?e-m:e)}}}if($.guid){g.guid=j.guid=j.guid||$.guid++}return g};$.debounce=function(d,e,f){return f===c?a(d,e,false):a(d,f,e!==false)}})(this); diff --git a/doc/sample_html/jquery.min.js b/doc/sample_html/jquery.min.js index c941a5f7..d1608e37 100644 --- a/doc/sample_html/jquery.min.js +++ b/doc/sample_html/jquery.min.js @@ -1,166 +1,4 @@ -/*! - * jQuery JavaScript Library v1.4.3 - * http://jquery.com/ - * - * Copyright 2010, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2010, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Thu Oct 14 23:10:06 2010 -0400 - */ -(function(E,A){function U(){return false}function ba(){return true}function ja(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ga(a){var b,d,e=[],f=[],h,k,l,n,s,v,B,D;k=c.data(this,this.nodeType?"events":"__events__");if(typeof k==="function")k=k.events;if(!(a.liveFired===this||!k||!k.live||a.button&&a.type==="click")){if(a.namespace)D=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var H=k.live.slice(0);for(n=0;n<H.length;n++){k=H[n];k.origType.replace(X, -"")===a.type?f.push(k.selector):H.splice(n--,1)}f=c(a.target).closest(f,a.currentTarget);s=0;for(v=f.length;s<v;s++){B=f[s];for(n=0;n<H.length;n++){k=H[n];if(B.selector===k.selector&&(!D||D.test(k.namespace))){l=B.elem;h=null;if(k.preType==="mouseenter"||k.preType==="mouseleave"){a.type=k.preType;h=c(a.relatedTarget).closest(k.selector)[0]}if(!h||h!==l)e.push({elem:l,handleObj:k,level:B.level})}}}s=0;for(v=e.length;s<v;s++){f=e[s];if(d&&f.level>d)break;a.currentTarget=f.elem;a.data=f.handleObj.data; -a.handleObj=f.handleObj;D=f.handleObj.origHandler.apply(f.elem,arguments);if(D===false||a.isPropagationStopped()){d=f.level;if(D===false)b=false}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(Ha,"`").replace(Ia,"&")}function ka(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Ja.test(b))return c.filter(b, -e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function la(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this,e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var k in e[h])c.event.add(this,h,e[h][k],e[h][k].data)}}})}function Ka(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)} -function ma(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?La:Ma,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a,"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function ca(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Na.test(a)?e(a,h):ca(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)? -e(a,""):c.each(b,function(f,h){ca(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(na.concat.apply([],na.slice(0,b)),function(){d[this]=a});return d}function oa(a){if(!da[a]){var b=c("<"+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";da[a]=d}return da[a]}function ea(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var u=E.document,c=function(){function a(){if(!b.isReady){try{u.documentElement.doScroll("left")}catch(i){setTimeout(a, -1);return}b.ready()}}var b=function(i,r){return new b.fn.init(i,r)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,k=/\S/,l=/^\s+/,n=/\s+$/,s=/\W/,v=/\d/,B=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,D=/^[\],:{}\s]*$/,H=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,G=/(?:^|:|,)(?:\s*\[)+/g,M=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,j=/(msie) ([\w.]+)/,o=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false, -q=[],t,x=Object.prototype.toString,C=Object.prototype.hasOwnProperty,P=Array.prototype.push,N=Array.prototype.slice,R=String.prototype.trim,Q=Array.prototype.indexOf,L={};b.fn=b.prototype={init:function(i,r){var y,z,F;if(!i)return this;if(i.nodeType){this.context=this[0]=i;this.length=1;return this}if(i==="body"&&!r&&u.body){this.context=u;this[0]=u.body;this.selector="body";this.length=1;return this}if(typeof i==="string")if((y=h.exec(i))&&(y[1]||!r))if(y[1]){F=r?r.ownerDocument||r:u;if(z=B.exec(i))if(b.isPlainObject(r)){i= -[u.createElement(z[1])];b.fn.attr.call(i,r,true)}else i=[F.createElement(z[1])];else{z=b.buildFragment([y[1]],[F]);i=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this,i)}else{if((z=u.getElementById(y[2]))&&z.parentNode){if(z.id!==y[2])return f.find(i);this.length=1;this[0]=z}this.context=u;this.selector=i;return this}else if(!r&&!s.test(i)){this.selector=i;this.context=u;i=u.getElementsByTagName(i);return b.merge(this,i)}else return!r||r.jquery?(r||f).find(i):b(r).find(i); -else if(b.isFunction(i))return f.ready(i);if(i.selector!==A){this.selector=i.selector;this.context=i.context}return b.makeArray(i,this)},selector:"",jquery:"1.4.3",length:0,size:function(){return this.length},toArray:function(){return N.call(this,0)},get:function(i){return i==null?this.toArray():i<0?this.slice(i)[0]:this[i]},pushStack:function(i,r,y){var z=b();b.isArray(i)?P.apply(z,i):b.merge(z,i);z.prevObject=this;z.context=this.context;if(r==="find")z.selector=this.selector+(this.selector?" ": -"")+y;else if(r)z.selector=this.selector+"."+r+"("+y+")";return z},each:function(i,r){return b.each(this,i,r)},ready:function(i){b.bindReady();if(b.isReady)i.call(u,b);else q&&q.push(i);return this},eq:function(i){return i===-1?this.slice(i):this.slice(i,+i+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(i){return this.pushStack(b.map(this,function(r,y){return i.call(r, -y,r)}))},end:function(){return this.prevObject||b(null)},push:P,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var i=arguments[0]||{},r=1,y=arguments.length,z=false,F,I,K,J,fa;if(typeof i==="boolean"){z=i;i=arguments[1]||{};r=2}if(typeof i!=="object"&&!b.isFunction(i))i={};if(y===r){i=this;--r}for(;r<y;r++)if((F=arguments[r])!=null)for(I in F){K=i[I];J=F[I];if(i!==J)if(z&&J&&(b.isPlainObject(J)||(fa=b.isArray(J)))){if(fa){fa=false;clone=K&&b.isArray(K)?K:[]}else clone= -K&&b.isPlainObject(K)?K:{};i[I]=b.extend(z,clone,J)}else if(J!==A)i[I]=J}return i};b.extend({noConflict:function(i){E.$=e;if(i)E.jQuery=d;return b},isReady:false,readyWait:1,ready:function(i){i===true&&b.readyWait--;if(!b.readyWait||i!==true&&!b.isReady){if(!u.body)return setTimeout(b.ready,1);b.isReady=true;if(!(i!==true&&--b.readyWait>0)){if(q){for(var r=0;i=q[r++];)i.call(u,b);q=null}b.fn.triggerHandler&&b(u).triggerHandler("ready")}}},bindReady:function(){if(!p){p=true;if(u.readyState==="complete")return setTimeout(b.ready, -1);if(u.addEventListener){u.addEventListener("DOMContentLoaded",t,false);E.addEventListener("load",b.ready,false)}else if(u.attachEvent){u.attachEvent("onreadystatechange",t);E.attachEvent("onload",b.ready);var i=false;try{i=E.frameElement==null}catch(r){}u.documentElement.doScroll&&i&&a()}}},isFunction:function(i){return b.type(i)==="function"},isArray:Array.isArray||function(i){return b.type(i)==="array"},isWindow:function(i){return i&&typeof i==="object"&&"setInterval"in i},isNaN:function(i){return i== -null||!v.test(i)||isNaN(i)},type:function(i){return i==null?String(i):L[x.call(i)]||"object"},isPlainObject:function(i){if(!i||b.type(i)!=="object"||i.nodeType||b.isWindow(i))return false;if(i.constructor&&!C.call(i,"constructor")&&!C.call(i.constructor.prototype,"isPrototypeOf"))return false;for(var r in i);return r===A||C.call(i,r)},isEmptyObject:function(i){for(var r in i)return false;return true},error:function(i){throw i;},parseJSON:function(i){if(typeof i!=="string"||!i)return null;i=b.trim(i); -if(D.test(i.replace(H,"@").replace(w,"]").replace(G,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(i):(new Function("return "+i))();else b.error("Invalid JSON: "+i)},noop:function(){},globalEval:function(i){if(i&&k.test(i)){var r=u.getElementsByTagName("head")[0]||u.documentElement,y=u.createElement("script");y.type="text/javascript";if(b.support.scriptEval)y.appendChild(u.createTextNode(i));else y.text=i;r.insertBefore(y,r.firstChild);r.removeChild(y)}},nodeName:function(i,r){return i.nodeName&&i.nodeName.toUpperCase()=== -r.toUpperCase()},each:function(i,r,y){var z,F=0,I=i.length,K=I===A||b.isFunction(i);if(y)if(K)for(z in i){if(r.apply(i[z],y)===false)break}else for(;F<I;){if(r.apply(i[F++],y)===false)break}else if(K)for(z in i){if(r.call(i[z],z,i[z])===false)break}else for(y=i[0];F<I&&r.call(y,F,y)!==false;y=i[++F]);return i},trim:R?function(i){return i==null?"":R.call(i)}:function(i){return i==null?"":i.toString().replace(l,"").replace(n,"")},makeArray:function(i,r){var y=r||[];if(i!=null){var z=b.type(i);i.length== -null||z==="string"||z==="function"||z==="regexp"||b.isWindow(i)?P.call(y,i):b.merge(y,i)}return y},inArray:function(i,r){if(r.indexOf)return r.indexOf(i);for(var y=0,z=r.length;y<z;y++)if(r[y]===i)return y;return-1},merge:function(i,r){var y=i.length,z=0;if(typeof r.length==="number")for(var F=r.length;z<F;z++)i[y++]=r[z];else for(;r[z]!==A;)i[y++]=r[z++];i.length=y;return i},grep:function(i,r,y){var z=[],F;y=!!y;for(var I=0,K=i.length;I<K;I++){F=!!r(i[I],I);y!==F&&z.push(i[I])}return z},map:function(i, -r,y){for(var z=[],F,I=0,K=i.length;I<K;I++){F=r(i[I],I,y);if(F!=null)z[z.length]=F}return z.concat.apply([],z)},guid:1,proxy:function(i,r,y){if(arguments.length===2)if(typeof r==="string"){y=i;i=y[r];r=A}else if(r&&!b.isFunction(r)){y=r;r=A}if(!r&&i)r=function(){return i.apply(y||this,arguments)};if(i)r.guid=i.guid=i.guid||r.guid||b.guid++;return r},access:function(i,r,y,z,F,I){var K=i.length;if(typeof r==="object"){for(var J in r)b.access(i,J,r[J],z,F,y);return i}if(y!==A){z=!I&&z&&b.isFunction(y); -for(J=0;J<K;J++)F(i[J],r,z?y.call(i[J],J,F(i[J],r)):y,I);return i}return K?F(i[0],r):A},now:function(){return(new Date).getTime()},uaMatch:function(i){i=i.toLowerCase();i=M.exec(i)||g.exec(i)||j.exec(i)||i.indexOf("compatible")<0&&o.exec(i)||[];return{browser:i[1]||"",version:i[2]||"0"}},browser:{}});b.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(i,r){L["[object "+r+"]"]=r.toLowerCase()});m=b.uaMatch(m);if(m.browser){b.browser[m.browser]=true;b.browser.version= -m.version}if(b.browser.webkit)b.browser.safari=true;if(Q)b.inArray=function(i,r){return Q.call(r,i)};if(!/\s/.test("\u00a0")){l=/^[\s\xA0]+/;n=/[\s\xA0]+$/}f=b(u);if(u.addEventListener)t=function(){u.removeEventListener("DOMContentLoaded",t,false);b.ready()};else if(u.attachEvent)t=function(){if(u.readyState==="complete"){u.detachEvent("onreadystatechange",t);b.ready()}};return E.jQuery=E.$=b}();(function(){c.support={};var a=u.documentElement,b=u.createElement("script"),d=u.createElement("div"), -e="script"+c.now();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],k=u.createElement("select"),l=k.appendChild(u.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")), -hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:l.selected,optDisabled:false,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};k.disabled=true;c.support.optDisabled=!l.disabled;b.type="text/javascript";try{b.appendChild(u.createTextNode("window."+e+"=1;"))}catch(n){}a.insertBefore(b, -a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function s(){c.support.noCloneEvent=false;d.detachEvent("onclick",s)});d.cloneNode(true).fireEvent("onclick")}d=u.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=u.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var s=u.createElement("div"); -s.style.width=s.style.paddingLeft="1px";u.body.appendChild(s);c.boxModel=c.support.boxModel=s.offsetWidth===2;if("zoom"in s.style){s.style.display="inline";s.style.zoom=1;c.support.inlineBlockNeedsLayout=s.offsetWidth===2;s.style.display="";s.innerHTML="<div style='width:4px;'></div>";c.support.shrinkWrapBlocks=s.offsetWidth!==2}s.innerHTML="<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";var v=s.getElementsByTagName("td");c.support.reliableHiddenOffsets=v[0].offsetHeight=== -0;v[0].style.display="";v[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&v[0].offsetHeight===0;s.innerHTML="";u.body.removeChild(s).style.display="none"});a=function(s){var v=u.createElement("div");s="on"+s;var B=s in v;if(!B){v.setAttribute(s,"return;");B=typeof v[s]==="function"}return B};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength", -cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var pa={},Oa=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?pa:a;var e=a.nodeType,f=e?a[c.expando]:null,h=c.cache;if(!(e&&!f&&typeof b==="string"&&d===A)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]= -c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==A)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?pa:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando);else if(d)delete f[e];else for(var k in a)delete a[k]}},acceptData:function(a){if(a.nodeName){var b= -c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){if(typeof a==="undefined")return this.length?c.data(this[0]):null;else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===A){var e=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(e===A&&this.length){e=c.data(this[0],a);if(e===A&&this[0].nodeType===1){e=this[0].getAttribute("data-"+a);if(typeof e=== -"string")try{e=e==="true"?true:e==="false"?false:e==="null"?null:!c.isNaN(e)?parseFloat(e):Oa.test(e)?c.parseJSON(e):e}catch(f){}else e=A}}return e===A&&d[1]?this.data(d[0]):e}else return this.each(function(){var h=c(this),k=[d[0],b];h.triggerHandler("setData"+d[1]+"!",k);c.data(this,a,b);h.triggerHandler("changeData"+d[1]+"!",k)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var e=c.data(a,b);if(!d)return e|| -[];if(!e||c.isArray(d))e=c.data(a,b,c.makeArray(d));else e.push(d);return e}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),e=d.shift();if(e==="inprogress")e=d.shift();if(e){b==="fx"&&d.unshift("inprogress");e.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===A)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this, -a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var qa=/[\n\t]/g,ga=/\s+/,Pa=/\r/g,Qa=/^(?:href|src|style)$/,Ra=/^(?:button|input)$/i,Sa=/^(?:button|input|object|select|textarea)$/i,Ta=/^a(?:rea)?$/i,ra=/^(?:radio|checkbox)$/i;c.fn.extend({attr:function(a,b){return c.access(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this, -a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(s){var v=c(this);v.addClass(a.call(this,s,v.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ga),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1)if(f.className){for(var h=" "+f.className+" ",k=f.className,l=0,n=b.length;l<n;l++)if(h.indexOf(" "+b[l]+" ")<0)k+=" "+b[l];f.className=c.trim(k)}else f.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(n){var s= -c(this);s.removeClass(a.call(this,n,s.attr("class")))});if(a&&typeof a==="string"||a===A)for(var b=(a||"").split(ga),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1&&f.className)if(a){for(var h=(" "+f.className+" ").replace(qa," "),k=0,l=b.length;k<l;k++)h=h.replace(" "+b[k]+" "," ");f.className=c.trim(h)}else f.className=""}return this},toggleClass:function(a,b){var d=typeof a,e=typeof b==="boolean";if(c.isFunction(a))return this.each(function(f){var h=c(this);h.toggleClass(a.call(this, -f,h.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var f,h=0,k=c(this),l=b,n=a.split(ga);f=n[h++];){l=e?l:!k.hasClass(f);k[l?"addClass":"removeClass"](f)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(qa," ").indexOf(a)>-1)return true;return false}, -val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one";if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h<e;h++){var k=f[h];if(k.selected&&(c.support.optDisabled?!k.disabled:k.getAttribute("disabled")===null)&&(!k.parentNode.disabled||!c.nodeName(k.parentNode,"optgroup"))){a=c(k).val();if(b)return a;d.push(a)}}return d}if(ra.test(b.type)&& -!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Pa,"")}return A}var l=c.isFunction(a);return this.each(function(n){var s=c(this),v=a;if(this.nodeType===1){if(l)v=a.call(this,n,s.val());if(v==null)v="";else if(typeof v==="number")v+="";else if(c.isArray(v))v=c.map(v,function(D){return D==null?"":D+""});if(c.isArray(v)&&ra.test(this.type))this.checked=c.inArray(s.val(),v)>=0;else if(c.nodeName(this,"select")){var B=c.makeArray(v);c("option",this).each(function(){this.selected= -c.inArray(c(this).val(),B)>=0});if(!B.length)this.selectedIndex=-1}else this.value=v}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return A;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==A;b=e&&c.props[b]||b;if(a.nodeType===1){var h=Qa.test(b);if((b in a||a[b]!==A)&&e&&!h){if(f){b==="type"&&Ra.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); -if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:Sa.test(a.nodeName)||Ta.test(a.nodeName)&&a.href?0:A;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return A;a=!c.support.hrefNormalized&&e&& -h?a.getAttribute(b,2):a.getAttribute(b);return a===null?A:a}}});var X=/\.(.*)$/,ha=/^(?:textarea|input|select)$/i,Ha=/\./g,Ia=/ /g,Ua=/[^\w\s.|`]/g,Va=function(a){return a.replace(Ua,"\\$&")},sa={focusin:0,focusout:0};c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var k=a.nodeType?"events":"__events__",l=h[k],n=h.handle;if(typeof l=== -"function"){n=l.handle;l=l.events}else if(!l){a.nodeType||(h[k]=h=function(){});h.events=l={}}if(!n)h.handle=n=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(n.elem,arguments):A};n.elem=a;b=b.split(" ");for(var s=0,v;k=b[s++];){h=f?c.extend({},f):{handler:d,data:e};if(k.indexOf(".")>-1){v=k.split(".");k=v.shift();h.namespace=v.slice(0).sort().join(".")}else{v=[];h.namespace=""}h.type=k;if(!h.guid)h.guid=d.guid;var B=l[k],D=c.event.special[k]||{};if(!B){B=l[k]=[]; -if(!D.setup||D.setup.call(a,e,v,n)===false)if(a.addEventListener)a.addEventListener(k,n,false);else a.attachEvent&&a.attachEvent("on"+k,n)}if(D.add){D.add.call(a,h);if(!h.handler.guid)h.handler.guid=d.guid}B.push(h);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,k=0,l,n,s,v,B,D,H=a.nodeType?"events":"__events__",w=c.data(a),G=w&&w[H];if(w&&G){if(typeof G==="function"){w=G;G=G.events}if(b&&b.type){d=b.handler;b=b.type}if(!b|| -typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in G)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[k++];){v=f;l=f.indexOf(".")<0;n=[];if(!l){n=f.split(".");f=n.shift();s=RegExp("(^|\\.)"+c.map(n.slice(0).sort(),Va).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(B=G[f])if(d){v=c.event.special[f]||{};for(h=e||0;h<B.length;h++){D=B[h];if(d.guid===D.guid){if(l||s.test(D.namespace)){e==null&&B.splice(h--,1);v.remove&&v.remove.call(a,D)}if(e!=null)break}}if(B.length===0||e!=null&&B.length===1){if(!v.teardown|| -v.teardown.call(a,n)===false)c.removeEvent(a,f,w.handle);delete G[f]}}else for(h=0;h<B.length;h++){D=B[h];if(l||s.test(D.namespace)){c.event.remove(a,v,D.handler,h);B.splice(h--,1)}}}if(c.isEmptyObject(G)){if(b=w.handle)b.elem=null;delete w.events;delete w.handle;if(typeof w==="function")c.removeData(a,H);else c.isEmptyObject(w)&&c.removeData(a)}}}}},trigger:function(a,b,d,e){var f=a.type||a;if(!e){a=typeof a==="object"?a[c.expando]?a:c.extend(c.Event(f),a):c.Event(f);if(f.indexOf("!")>=0){a.type= -f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return A;a.result=A;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)=== -false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){e=a.target;var k,l=f.replace(X,""),n=c.nodeName(e,"a")&&l==="click",s=c.event.special[l]||{};if((!s._default||s._default.call(d,a)===false)&&!n&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[l]){if(k=e["on"+l])e["on"+l]=null;c.event.triggered=true;e[l]()}}catch(v){}if(k)e["on"+l]=k;c.event.triggered=false}}},handle:function(a){var b,d,e; -d=[];var f,h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var k=d.length;f<k;f++){var l=d[f];if(b||e.test(l.namespace)){a.handler=l.handler;a.data= -l.data;a.handleObj=l;l=l.handler.apply(this,h);if(l!==A){a.result=l;if(l===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), -fix:function(a){if(a[c.expando])return a;var b=a;a=c.Event(b);for(var d=this.props.length,e;d;){e=this.props[--d];a[e]=b[e]}if(!a.target)a.target=a.srcElement||u;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=u.documentElement;d=u.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop|| -d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(a.which==null&&(a.charCode!=null||a.keyCode!=null))a.which=a.charCode!=null?a.charCode:a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==A)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,Y(a.origType,a.selector),c.extend({},a,{handler:Ga,guid:a.handler.guid}))},remove:function(a){c.event.remove(this, -Y(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,d){if(c.isWindow(this))this.onbeforeunload=d},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.removeEvent=u.removeEventListener?function(a,b,d){a.removeEventListener&&a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent&&a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp= -c.now();this[c.expando]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=ba;var a=this.originalEvent;if(a)if(a.preventDefault)a.preventDefault();else a.returnValue=false},stopPropagation:function(){this.isPropagationStopped=ba;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ba;this.stopPropagation()},isDefaultPrevented:U,isPropagationStopped:U,isImmediatePropagationStopped:U}; -var ta=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},ua=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?ua:ta,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?ua:ta)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(){if(this.nodeName.toLowerCase()!== -"form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length){a.liveFired=A;return ja("submit",this,arguments)}});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13){a.liveFired=A;return ja("submit",this,arguments)}})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};if(!c.support.changeBubbles){var V, -va=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ha.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=va(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===A||f===e))if(e!=null||f){a.type="change";a.liveFired= -A;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",va(a))}},setup:function(){if(this.type=== -"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ha.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ha.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}u.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){sa[b]++===0&&u.addEventListener(a,d,true)},teardown:function(){--sa[b]=== -0&&u.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=A}var k=b==="one"?c.proxy(f,function(n){c(this).unbind(n,k);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var l=this.length;h<l;h++)c.event.add(this[h],d,k,e)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&!a.preventDefault)for(var d in a)this.unbind(d, -a[d]);else{d=0;for(var e=this.length;d<e;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,e){return this.live(b,d,e,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var d=c.Event(a);d.preventDefault();d.stopPropagation();c.event.trigger(d,b,this[0]);return d.result}},toggle:function(a){for(var b=arguments,d= -1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(e){var f=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,f+1);e.preventDefault();return b[f].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var wa={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,e,f,h){var k,l=0,n,s,v=h||this.selector;h=h?this:c(this.context);if(typeof d=== -"object"&&!d.preventDefault){for(k in d)h[b](k,e,d[k],v);return this}if(c.isFunction(e)){f=e;e=A}for(d=(d||"").split(" ");(k=d[l++])!=null;){n=X.exec(k);s="";if(n){s=n[0];k=k.replace(X,"")}if(k==="hover")d.push("mouseenter"+s,"mouseleave"+s);else{n=k;if(k==="focus"||k==="blur"){d.push(wa[k]+s);k+=s}else k=(wa[k]||k)+s;if(b==="live"){s=0;for(var B=h.length;s<B;s++)c.event.add(h[s],"live."+Y(k,v),{data:e,selector:v,handler:f,origType:k,origHandler:f,preType:n})}else h.unbind("live."+Y(k,v),f)}}return this}}); -c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d,e){if(e==null){e=d;d=null}return arguments.length>0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}}); -(function(){function a(g,j,o,m,p,q){p=0;for(var t=m.length;p<t;p++){var x=m[p];if(x){x=x[g];for(var C=false;x;){if(x.sizcache===o){C=m[x.sizset];break}if(x.nodeType===1&&!q){x.sizcache=o;x.sizset=p}if(x.nodeName.toLowerCase()===j){C=x;break}x=x[g]}m[p]=C}}}function b(g,j,o,m,p,q){p=0;for(var t=m.length;p<t;p++){var x=m[p];if(x){x=x[g];for(var C=false;x;){if(x.sizcache===o){C=m[x.sizset];break}if(x.nodeType===1){if(!q){x.sizcache=o;x.sizset=p}if(typeof j!=="string"){if(x===j){C=true;break}}else if(l.filter(j, -[x]).length>0){C=x;break}}x=x[g]}m[p]=C}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,k=true;[0,0].sort(function(){k=false;return 0});var l=function(g,j,o,m){o=o||[];var p=j=j||u;if(j.nodeType!==1&&j.nodeType!==9)return[];if(!g||typeof g!=="string")return o;var q=[],t,x,C,P,N=true,R=l.isXML(j),Q=g,L;do{d.exec("");if(t=d.exec(Q)){Q=t[3];q.push(t[1]);if(t[2]){P=t[3]; -break}}}while(t);if(q.length>1&&s.exec(g))if(q.length===2&&n.relative[q[0]])x=M(q[0]+q[1],j);else for(x=n.relative[q[0]]?[j]:l(q.shift(),j);q.length;){g=q.shift();if(n.relative[g])g+=q.shift();x=M(g,x)}else{if(!m&&q.length>1&&j.nodeType===9&&!R&&n.match.ID.test(q[0])&&!n.match.ID.test(q[q.length-1])){t=l.find(q.shift(),j,R);j=t.expr?l.filter(t.expr,t.set)[0]:t.set[0]}if(j){t=m?{expr:q.pop(),set:D(m)}:l.find(q.pop(),q.length===1&&(q[0]==="~"||q[0]==="+")&&j.parentNode?j.parentNode:j,R);x=t.expr?l.filter(t.expr, -t.set):t.set;if(q.length>0)C=D(x);else N=false;for(;q.length;){t=L=q.pop();if(n.relative[L])t=q.pop();else L="";if(t==null)t=j;n.relative[L](C,t,R)}}else C=[]}C||(C=x);C||l.error(L||g);if(f.call(C)==="[object Array]")if(N)if(j&&j.nodeType===1)for(g=0;C[g]!=null;g++){if(C[g]&&(C[g]===true||C[g].nodeType===1&&l.contains(j,C[g])))o.push(x[g])}else for(g=0;C[g]!=null;g++)C[g]&&C[g].nodeType===1&&o.push(x[g]);else o.push.apply(o,C);else D(C,o);if(P){l(P,p,o,m);l.uniqueSort(o)}return o};l.uniqueSort=function(g){if(w){h= -k;g.sort(w);if(h)for(var j=1;j<g.length;j++)g[j]===g[j-1]&&g.splice(j--,1)}return g};l.matches=function(g,j){return l(g,null,null,j)};l.matchesSelector=function(g,j){return l(j,null,null,[g]).length>0};l.find=function(g,j,o){var m;if(!g)return[];for(var p=0,q=n.order.length;p<q;p++){var t=n.order[p],x;if(x=n.leftMatch[t].exec(g)){var C=x[1];x.splice(1,1);if(C.substr(C.length-1)!=="\\"){x[1]=(x[1]||"").replace(/\\/g,"");m=n.find[t](x,j,o);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=j.getElementsByTagName("*")); -return{set:m,expr:g}};l.filter=function(g,j,o,m){for(var p=g,q=[],t=j,x,C,P=j&&j[0]&&l.isXML(j[0]);g&&j.length;){for(var N in n.filter)if((x=n.leftMatch[N].exec(g))!=null&&x[2]){var R=n.filter[N],Q,L;L=x[1];C=false;x.splice(1,1);if(L.substr(L.length-1)!=="\\"){if(t===q)q=[];if(n.preFilter[N])if(x=n.preFilter[N](x,t,o,q,m,P)){if(x===true)continue}else C=Q=true;if(x)for(var i=0;(L=t[i])!=null;i++)if(L){Q=R(L,x,i,t);var r=m^!!Q;if(o&&Q!=null)if(r)C=true;else t[i]=false;else if(r){q.push(L);C=true}}if(Q!== -A){o||(t=q);g=g.replace(n.match[N],"");if(!C)return[];break}}}if(g===p)if(C==null)l.error(g);else break;p=g}return t};l.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=l.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\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,j){var o=typeof j==="string",m=o&&!/\W/.test(j);o=o&&!m;if(m)j=j.toLowerCase();m=0;for(var p=g.length,q;m<p;m++)if(q=g[m]){for(;(q=q.previousSibling)&&q.nodeType!==1;);g[m]=o||q&&q.nodeName.toLowerCase()=== -j?q||false:q===j}o&&l.filter(j,g,true)},">":function(g,j){var o=typeof j==="string",m,p=0,q=g.length;if(o&&!/\W/.test(j))for(j=j.toLowerCase();p<q;p++){if(m=g[p]){o=m.parentNode;g[p]=o.nodeName.toLowerCase()===j?o:false}}else{for(;p<q;p++)if(m=g[p])g[p]=o?m.parentNode:m.parentNode===j;o&&l.filter(j,g,true)}},"":function(g,j,o){var m=e++,p=b,q;if(typeof j==="string"&&!/\W/.test(j)){q=j=j.toLowerCase();p=a}p("parentNode",j,m,g,q,o)},"~":function(g,j,o){var m=e++,p=b,q;if(typeof j==="string"&&!/\W/.test(j)){q= -j=j.toLowerCase();p=a}p("previousSibling",j,m,g,q,o)}},find:{ID:function(g,j,o){if(typeof j.getElementById!=="undefined"&&!o)return(g=j.getElementById(g[1]))&&g.parentNode?[g]:[]},NAME:function(g,j){if(typeof j.getElementsByName!=="undefined"){for(var o=[],m=j.getElementsByName(g[1]),p=0,q=m.length;p<q;p++)m[p].getAttribute("name")===g[1]&&o.push(m[p]);return o.length===0?null:o}},TAG:function(g,j){return j.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,j,o,m,p,q){g=" "+g[1].replace(/\\/g, -"")+" ";if(q)return g;q=0;for(var t;(t=j[q])!=null;q++)if(t)if(p^(t.className&&(" "+t.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))o||m.push(t);else if(o)j[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var j=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=j[1]+(j[2]||1)-0;g[3]=j[3]-0}g[0]=e++;return g},ATTR:function(g,j,o, -m,p,q){j=g[1].replace(/\\/g,"");if(!q&&n.attrMap[j])g[1]=n.attrMap[j];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,j,o,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=l(g[3],null,null,j);else{g=l.filter(g[3],j,o,true^p);o||m.push.apply(m,g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled=== -true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,j,o){return!!l(o[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"=== -g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,j){return j===0},last:function(g,j,o,m){return j===m.length-1},even:function(g,j){return j%2===0},odd:function(g,j){return j%2===1},lt:function(g,j,o){return j<o[3]-0},gt:function(g,j,o){return j>o[3]-0},nth:function(g,j,o){return o[3]- -0===j},eq:function(g,j,o){return o[3]-0===j}},filter:{PSEUDO:function(g,j,o,m){var p=j[1],q=n.filters[p];if(q)return q(g,o,j,m);else if(p==="contains")return(g.textContent||g.innerText||l.getText([g])||"").indexOf(j[3])>=0;else if(p==="not"){j=j[3];o=0;for(m=j.length;o<m;o++)if(j[o]===g)return false;return true}else l.error("Syntax error, unrecognized expression: "+p)},CHILD:function(g,j){var o=j[1],m=g;switch(o){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(o=== -"first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":o=j[2];var p=j[3];if(o===1&&p===0)return true;var q=j[0],t=g.parentNode;if(t&&(t.sizcache!==q||!g.nodeIndex)){var x=0;for(m=t.firstChild;m;m=m.nextSibling)if(m.nodeType===1)m.nodeIndex=++x;t.sizcache=q}m=g.nodeIndex-p;return o===0?m===0:m%o===0&&m/o>=0}},ID:function(g,j){return g.nodeType===1&&g.getAttribute("id")===j},TAG:function(g,j){return j==="*"&&g.nodeType===1||g.nodeName.toLowerCase()=== -j},CLASS:function(g,j){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(j)>-1},ATTR:function(g,j){var o=j[1];o=n.attrHandle[o]?n.attrHandle[o](g):g[o]!=null?g[o]:g.getAttribute(o);var m=o+"",p=j[2],q=j[4];return o==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&o!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,j,o,m){var p=n.setFilters[j[2]]; -if(p)return p(g,o,j,m)}}},s=n.match.POS,v=function(g,j){return"\\"+(j-0+1)},B;for(B in n.match){n.match[B]=RegExp(n.match[B].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[B]=RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[B].source.replace(/\\(\d+)/g,v))}var D=function(g,j){g=Array.prototype.slice.call(g,0);if(j){j.push.apply(j,g);return j}return g};try{Array.prototype.slice.call(u.documentElement.childNodes,0)}catch(H){D=function(g,j){var o=j||[],m=0;if(f.call(g)==="[object Array]")Array.prototype.push.apply(o, -g);else if(typeof g.length==="number")for(var p=g.length;m<p;m++)o.push(g[m]);else for(;g[m];m++)o.push(g[m]);return o}}var w,G;if(u.documentElement.compareDocumentPosition)w=function(g,j){if(g===j){h=true;return 0}if(!g.compareDocumentPosition||!j.compareDocumentPosition)return g.compareDocumentPosition?-1:1;return g.compareDocumentPosition(j)&4?-1:1};else{w=function(g,j){var o=[],m=[],p=g.parentNode,q=j.parentNode,t=p;if(g===j){h=true;return 0}else if(p===q)return G(g,j);else if(p){if(!q)return 1}else return-1; -for(;t;){o.unshift(t);t=t.parentNode}for(t=q;t;){m.unshift(t);t=t.parentNode}p=o.length;q=m.length;for(t=0;t<p&&t<q;t++)if(o[t]!==m[t])return G(o[t],m[t]);return t===p?G(g,m[t],-1):G(o[t],j,1)};G=function(g,j,o){if(g===j)return o;for(g=g.nextSibling;g;){if(g===j)return-1;g=g.nextSibling}return 1}}l.getText=function(g){for(var j="",o,m=0;g[m];m++){o=g[m];if(o.nodeType===3||o.nodeType===4)j+=o.nodeValue;else if(o.nodeType!==8)j+=l.getText(o.childNodes)}return j};(function(){var g=u.createElement("div"), -j="script"+(new Date).getTime();g.innerHTML="<a name='"+j+"'/>";var o=u.documentElement;o.insertBefore(g,o.firstChild);if(u.getElementById(j)){n.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:A:[]};n.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}o.removeChild(g); -o=g=null})();(function(){var g=u.createElement("div");g.appendChild(u.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(j,o){var m=o.getElementsByTagName(j[1]);if(j[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(j){return j.getAttribute("href",2)};g=null})();u.querySelectorAll&& -function(){var g=l,j=u.createElement("div");j.innerHTML="<p class='TEST'></p>";if(!(j.querySelectorAll&&j.querySelectorAll(".TEST").length===0)){l=function(m,p,q,t){p=p||u;if(!t&&!l.isXML(p))if(p.nodeType===9)try{return D(p.querySelectorAll(m),q)}catch(x){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var C=p.id,P=p.id="__sizzle__";try{return D(p.querySelectorAll("#"+P+" "+m),q)}catch(N){}finally{if(C)p.id=C;else p.removeAttribute("id")}}return g(m,p,q,t)};for(var o in g)l[o]=g[o]; -j=null}}();(function(){var g=u.documentElement,j=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,o=false;try{j.call(u.documentElement,":sizzle")}catch(m){o=true}if(j)l.matchesSelector=function(p,q){try{if(o||!n.match.PSEUDO.test(q))return j.call(p,q)}catch(t){}return l(q,null,null,[p]).length>0}})();(function(){var g=u.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length=== -0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(j,o,m){if(typeof o.getElementsByClassName!=="undefined"&&!m)return o.getElementsByClassName(j[1])};g=null}}})();l.contains=u.documentElement.contains?function(g,j){return g!==j&&(g.contains?g.contains(j):true)}:function(g,j){return!!(g.compareDocumentPosition(j)&16)};l.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var M=function(g, -j){for(var o=[],m="",p,q=j.nodeType?[j]:j;p=n.match.PSEUDO.exec(g);){m+=p[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;p=0;for(var t=q.length;p<t;p++)l(g,q[p],o);return l.filter(m,o)};c.find=l;c.expr=l.selectors;c.expr[":"]=c.expr.filters;c.unique=l.uniqueSort;c.text=l.getText;c.isXMLDoc=l.isXML;c.contains=l.contains})();var Wa=/Until$/,Xa=/^(?:parents|prevUntil|prevAll)/,Ya=/,/,Ja=/^.[^:#\[\.,]*$/,Za=Array.prototype.slice,$a=c.expr.match.POS;c.fn.extend({find:function(a){for(var b=this.pushStack("", -"find",a),d=0,e=0,f=this.length;e<f;e++){d=b.length;c.find(a,this[e],b);if(e>0)for(var h=d;h<b.length;h++)for(var k=0;k<d;k++)if(b[k]===b[h]){b.splice(h--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,e=b.length;d<e;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(ka(this,a,false),"not",a)},filter:function(a){return this.pushStack(ka(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a, -b){var d=[],e,f,h=this[0];if(c.isArray(a)){var k={},l,n=1;if(h&&a.length){e=0;for(f=a.length;e<f;e++){l=a[e];k[l]||(k[l]=c.expr.match.POS.test(l)?c(l,b||this.context):l)}for(;h&&h.ownerDocument&&h!==b;){for(l in k){e=k[l];if(e.jquery?e.index(h)>-1:c(h).is(e))d.push({selector:l,elem:h,level:n})}h=h.parentNode;n++}}return d}k=$a.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e<f;e++)for(h=this[e];h;)if(k?k.index(h)>-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h|| -!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context):c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}}); -c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling", -d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Wa.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||Ya.test(e))&&Xa.test(a))f=f.reverse();return this.pushStack(f,a,Za.call(arguments).join(","))}}); -c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===A||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var xa=/ jQuery\d+="(?:\d+|null)"/g, -$=/^\s+/,ya=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,za=/<([\w:]+)/,ab=/<tbody/i,bb=/<|&#?\w+;/,Aa=/<(?:script|object|embed|option|style)/i,Ba=/checked\s*(?:[^=]|=\s*.checked.)/i,cb=/\=([^="'>\s]+\/)>/g,O={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"], -area:[1,"<map>","</map>"],_default:[0,"",""]};O.optgroup=O.option;O.tbody=O.tfoot=O.colgroup=O.caption=O.thead;O.th=O.td;if(!c.support.htmlSerialize)O._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==A)return this.empty().append((this[0]&&this[0].ownerDocument||u).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this, -d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})}, -unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a= -c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*")); -c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(xa,"").replace(cb,'="$1">').replace($, -"")],e)[0]}else return this.cloneNode(true)});if(a===true){la(this,b);la(this.find("*"),b.find("*"))}return b},html:function(a){if(a===A)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(xa,""):null;else if(typeof a==="string"&&!Aa.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!O[(za.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ya,"<$1></$2>");try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(e){this.empty().append(a)}}else c.isFunction(a)? -this.each(function(f){var h=c(this);h.html(a.call(this,f,h.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),e=d.html();d.replaceWith(a.call(this,b,e))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a, -true)},domManip:function(a,b,d){var e,f,h=a[0],k=[],l;if(!c.support.checkClone&&arguments.length===3&&typeof h==="string"&&Ba.test(h))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(h))return this.each(function(s){var v=c(this);a[0]=h.call(this,s,b?v.html():A);v.domManip(a,b,d)});if(this[0]){e=h&&h.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:c.buildFragment(a,this,k);l=e.fragment;if(f=l.childNodes.length===1?l=l.firstChild: -l.firstChild){b=b&&c.nodeName(f,"tr");f=0;for(var n=this.length;f<n;f++)d.call(b?c.nodeName(this[f],"table")?this[f].getElementsByTagName("tbody")[0]||this[f].appendChild(this[f].ownerDocument.createElement("tbody")):this[f]:this[f],f>0||e.cacheable||this.length>1?l.cloneNode(true):l)}k.length&&c.each(k,Ka)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:u;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===u&&!Aa.test(a[0])&&(c.support.checkClone|| -!Ba.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h= -d.length;f<h;f++){var k=(f>0?this.clone(true):this).get();c(d[f])[b](k);e=e.concat(k)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||u;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||u;for(var f=[],h=0,k;(k=a[h])!=null;h++){if(typeof k==="number")k+="";if(k){if(typeof k==="string"&&!bb.test(k))k=b.createTextNode(k);else if(typeof k==="string"){k=k.replace(ya,"<$1></$2>");var l=(za.exec(k)||["",""])[1].toLowerCase(),n=O[l]||O._default, -s=n[0],v=b.createElement("div");for(v.innerHTML=n[1]+k+n[2];s--;)v=v.lastChild;if(!c.support.tbody){s=ab.test(k);l=l==="table"&&!s?v.firstChild&&v.firstChild.childNodes:n[1]==="<table>"&&!s?v.childNodes:[];for(n=l.length-1;n>=0;--n)c.nodeName(l[n],"tbody")&&!l[n].childNodes.length&&l[n].parentNode.removeChild(l[n])}!c.support.leadingWhitespace&&$.test(k)&&v.insertBefore(b.createTextNode($.exec(k)[0]),v.firstChild);k=v.childNodes}if(k.nodeType)f.push(k);else f=c.merge(f,k)}}if(d)for(h=0;f[h];h++)if(e&& -c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script"))));d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,k=0,l;(l=a[k])!=null;k++)if(!(l.nodeName&&c.noData[l.nodeName.toLowerCase()]))if(d=l[c.expando]){if((b=e[d])&&b.events)for(var n in b.events)f[n]? -c.event.remove(l,n):c.removeEvent(l,n,b.handle);if(h)delete l[c.expando];else l.removeAttribute&&l.removeAttribute(c.expando);delete e[d]}}});var Ca=/alpha\([^)]*\)/i,db=/opacity=([^)]*)/,eb=/-([a-z])/ig,fb=/([A-Z])/g,Da=/^-?\d+(?:px)?$/i,gb=/^-?\d/,hb={position:"absolute",visibility:"hidden",display:"block"},La=["Left","Right"],Ma=["Top","Bottom"],W,ib=u.defaultView&&u.defaultView.getComputedStyle,jb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===A)return this; -return c.access(this,a,b,true,function(d,e,f){return f!==A?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true,zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),k=a.style,l=c.cssHooks[h];b=c.cssProps[h]|| -h;if(d!==A){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!l||!("set"in l)||(d=l.set(a,d))!==A)try{k[b]=d}catch(n){}}}else{if(l&&"get"in l&&(f=l.get(a,false,e))!==A)return f;return k[b]}}},css:function(a,b,d){var e,f=c.camelCase(b),h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==A)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]= -e[f]},camelCase:function(a){return a.replace(eb,jb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=ma(d,b,f);else c.swap(d,hb,function(){h=ma(d,b,f)});return h+"px"}},set:function(d,e){if(Da.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return db.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"": -b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f=d.filter||"";d.filter=Ca.test(f)?f.replace(Ca,e):d.filter+" "+e}};if(ib)W=function(a,b,d){var e;d=d.replace(fb,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return A;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};else if(u.documentElement.currentStyle)W=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b], -h=a.style;if(!Da.test(f)&&gb.test(f)){d=h.left;e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f};if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var kb=c.now(),lb=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, -mb=/^(?:select|textarea)/i,nb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,ob=/^(?:GET|HEAD|DELETE)$/,Na=/\[\]$/,T=/\=\?(&|$)/,ia=/\?/,pb=/([?&])_=[^&]*/,qb=/^(\w+:)?\/\/([^\/?#]+)/,rb=/%20/g,sb=/#.*$/,Ea=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ea)return Ea.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d= -b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(k,l){if(l==="success"||l==="notmodified")h.html(f?c("<div>").append(k.responseText.replace(lb,"")).find(f):k.responseText);d&&h.each(d,[k.responseText,l,k])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&& -!this.disabled&&(this.checked||mb.test(this.nodeName)||nb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})}, -getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html", -script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),k=ob.test(h);b.url=b.url.replace(sb,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ia.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data|| -!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+kb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var l=E[d];E[d]=function(m){f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);if(c.isFunction(l))l(m);else{E[d]=A;try{delete E[d]}catch(p){}}v&&v.removeChild(B)}}if(b.dataType==="script"&&b.cache===null)b.cache= -false;if(b.cache===false&&h==="GET"){var n=c.now(),s=b.url.replace(pb,"$1_="+n);b.url=s+(s===b.url?(ia.test(b.url)?"&":"?")+"_="+n:"")}if(b.data&&h==="GET")b.url+=(ia.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");n=(n=qb.exec(b.url))&&(n[1]&&n[1]!==location.protocol||n[2]!==location.host);if(b.dataType==="script"&&h==="GET"&&n){var v=u.getElementsByTagName("head")[0]||u.documentElement,B=u.createElement("script");if(b.scriptCharset)B.charset=b.scriptCharset;B.src= -b.url;if(!d){var D=false;B.onload=B.onreadystatechange=function(){if(!D&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){D=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);B.onload=B.onreadystatechange=null;v&&B.parentNode&&v.removeChild(B)}}}v.insertBefore(B,v.firstChild);return A}var H=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!k||a&&a.contentType)w.setRequestHeader("Content-Type", -b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}n||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(G){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&& -c.triggerGlobal(b,"ajaxSend",[w,b]);var M=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){H||c.handleComplete(b,w,e,f);H=true;if(w)w.onreadystatechange=c.noop}else if(!H&&w&&(w.readyState===4||m==="timeout")){H=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d|| -c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&g.call&&g.call(w);M("abort")}}catch(j){}b.async&&b.timeout>0&&setTimeout(function(){w&&!H&&M("timeout")},b.timeout);try{w.send(k||b.data==null?null:b.data)}catch(o){c.handleError(b,w,null,o);c.handleComplete(b,w,e,f)}b.async||M();return w}},param:function(a,b){var d=[],e=function(h,k){k=c.isFunction(k)?k():k;d[d.length]=encodeURIComponent(h)+ -"="+encodeURIComponent(k)};if(b===A)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)ca(f,a[f],b,e);return d.join("&").replace(rb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess",[b,a])},handleComplete:function(a, -b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),e=a.getResponseHeader("Etag"); -if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}});if(E.ActiveXObject)c.ajaxSettings.xhr= -function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var da={},tb=/^(?:toggle|show|hide)$/,ub=/^([+\-]=)?([\d+.\-]+)(.*)$/,aa,na=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show",3),a,b,d);else{a= -0;for(b=this.length;a<b;a++){if(!c.data(this[a],"olddisplay")&&this[a].style.display==="none")this[a].style.display="";this[a].style.display===""&&c.css(this[a],"display")==="none"&&c.data(this[a],"olddisplay",oa(this[a].nodeName))}for(a=0;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b,d){if(a||a===0)return this.animate(S("hide",3),a,b,d);else{a=0;for(b=this.length;a<b;a++){d=c.css(this[a],"display");d!=="none"&&c.data(this[a],"olddisplay",d)}for(a= -0;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b,d){var e=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||e?this.each(function(){var f=e?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(S("toggle",3),a,b,d);return this},fadeTo:function(a,b,d,e){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d,e)},animate:function(a,b,d,e){var f=c.speed(b,d,e);if(c.isEmptyObject(a))return this.each(f.complete); -return this[f.queue===false?"each":"queue"](function(){var h=c.extend({},f),k,l=this.nodeType===1,n=l&&c(this).is(":hidden"),s=this;for(k in a){var v=c.camelCase(k);if(k!==v){a[v]=a[k];delete a[k];k=v}if(a[k]==="hide"&&n||a[k]==="show"&&!n)return h.complete.call(this);if(l&&(k==="height"||k==="width")){h.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(c.css(this,"display")==="inline"&&c.css(this,"float")==="none")if(c.support.inlineBlockNeedsLayout)if(oa(this.nodeName)=== -"inline")this.style.display="inline-block";else{this.style.display="inline";this.style.zoom=1}else this.style.display="inline-block"}if(c.isArray(a[k])){(h.specialEasing=h.specialEasing||{})[k]=a[k][1];a[k]=a[k][0]}}if(h.overflow!=null)this.style.overflow="hidden";h.curAnim=c.extend({},a);c.each(a,function(B,D){var H=new c.fx(s,h,B);if(tb.test(D))H[D==="toggle"?n?"show":"hide":D](a);else{var w=ub.exec(D),G=H.cur(true)||0;if(w){var M=parseFloat(w[2]),g=w[3]||"px";if(g!=="px"){c.style(s,B,(M||1)+g); -G=(M||1)/H.cur(true)*G;c.style(s,B,G+g)}if(w[1])M=(w[1]==="-="?-1:1)*M+G;H.custom(G,M,g)}else H.custom(G,D,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var e=d.length-1;e>=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b, -d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a* -Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(h){return f.step(h)} -this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;var f=this;a=c.fx;e.elem=this.elem;if(e()&&c.timers.push(e)&&!aa)aa=setInterval(a.tick,a.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true; -this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(l,n){f.style["overflow"+n]=h.overflow[l]})}this.options.hide&&c(this.elem).hide();if(this.options.hide|| -this.options.show)for(var k in this.options.curAnim)c.style(this.elem,k,this.options.orig[k]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a= -c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},interval:13,stop:function(){clearInterval(aa);aa=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a=== -b.elem}).length};var vb=/^t(?:able|d|h)$/i,Fa=/^(?:body|html)$/i;c.fn.offset="getBoundingClientRect"in u.documentElement?function(a){var b=this[0],d;if(a)return this.each(function(k){c.offset.setOffset(this,a,k)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);try{d=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,h=f.documentElement;if(!d||!c.contains(h,b))return d||{top:0,left:0};b=f.body;f=ea(f);return{top:d.top+(f.pageYOffset||c.support.boxModel&& -h.scrollTop||b.scrollTop)-(h.clientTop||b.clientTop||0),left:d.left+(f.pageXOffset||c.support.boxModel&&h.scrollLeft||b.scrollLeft)-(h.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(s){c.offset.setOffset(this,a,s)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,e=b.ownerDocument,f,h=e.documentElement,k=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle; -for(var l=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==k&&b!==h;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;f=e?e.getComputedStyle(b,null):b.currentStyle;l-=b.scrollTop;n-=b.scrollLeft;if(b===d){l+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&vb.test(b.nodeName))){l+=parseFloat(f.borderTopWidth)||0;n+=parseFloat(f.borderLeftWidth)||0}d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&f.overflow!=="visible"){l+= -parseFloat(f.borderTopWidth)||0;n+=parseFloat(f.borderLeftWidth)||0}f=f}if(f.position==="relative"||f.position==="static"){l+=k.offsetTop;n+=k.offsetLeft}if(c.offset.supportsFixedPosition&&f.position==="fixed"){l+=Math.max(h.scrollTop,k.scrollTop);n+=Math.max(h.scrollLeft,k.scrollLeft)}return{top:l,left:n}};c.offset={initialize:function(){var a=u.body,b=u.createElement("div"),d,e,f,h=parseFloat(c.css(a,"marginTop"))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px", -height:"1px",visibility:"hidden"});b.innerHTML="<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>";a.insertBefore(b,a.firstChild);d=b.firstChild;e=d.firstChild;f=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=e.offsetTop!==5;this.doesAddBorderForTableAndCells= -f.offsetTop===5;e.style.position="fixed";e.style.top="20px";this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15;e.style.position=e.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==h;a.removeChild(b);c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.css(a, -"marginTop"))||0;d+=parseFloat(c.css(a,"marginLeft"))||0}return{top:b,left:d}},setOffset:function(a,b,d){var e=c.css(a,"position");if(e==="static")a.style.position="relative";var f=c(a),h=f.offset(),k=c.css(a,"top"),l=c.css(a,"left"),n=e==="absolute"&&c.inArray("auto",[k,l])>-1;e={};var s={};if(n)s=f.position();k=n?s.top:parseInt(k,10)||0;l=n?s.left:parseInt(l,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+k;if(b.left!=null)e.left=b.left-h.left+l;"using"in b?b.using.call(a, -e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Fa.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||u.body;a&&!Fa.test(a.nodeName)&& -c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==A)return this.each(function(){if(h=ea(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=ea(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase(); -c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(h){var k=c(this);k[d](e.call(this,h,k[d]()))});return c.isWindow(f)?f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b]:f.nodeType===9?Math.max(f.documentElement["client"+ -b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]):e===A?parseFloat(c.css(f,d)):this.css(d,typeof e==="string"?e:e+"px")}})})(window); +/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="<select msallowclip=''><option selected=''></option></select>",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=lb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=mb(b);function pb(){}pb.prototype=d.filters=d.pseudos,d.setFilters=new pb,g=fb.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fb.error(a):z(a,i).slice(0)};function qb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h; +if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==cb()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===cb()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ab:bb):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:bb,isPropagationStopped:bb,isImmediatePropagationStopped:bb,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ab,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ab,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ab,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=bb;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=bb),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function db(a){var b=eb.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var eb="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fb=/ jQuery\d+="(?:null|\d+)"/g,gb=new RegExp("<(?:"+eb+")[\\s/>]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/<tbody/i,lb=/<|&#?\w+;/,mb=/<(?:script|style|link)/i,nb=/checked\s*(?:[^=]|=\s*.checked.)/i,ob=/^$|\/(?:java|ecma)script/i,pb=/^true\/(.*)/,qb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,rb={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?"<table>"!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Cb[0].contentWindow||Cb[0].contentDocument).document,b.write(),b.close(),c=Eb(a,b),Cb.detach()),Db[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Gb=/^margin/,Hb=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ib,Jb,Kb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ib=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Hb.test(g)&&Gb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ib=function(a){return a.currentStyle},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Hb.test(g)&&!Kb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Lb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Mb=/alpha\([^)]*\)/i,Nb=/opacity\s*=\s*([^)]*)/,Ob=/^(none|table(?!-c[ea]).+)/,Pb=new RegExp("^("+S+")(.*)$","i"),Qb=new RegExp("^([+-])=("+S+")","i"),Rb={position:"absolute",visibility:"hidden",display:"block"},Sb={letterSpacing:"0",fontWeight:"400"},Tb=["Webkit","O","Moz","ms"];function Ub(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Tb.length;while(e--)if(b=Tb[e]+c,b in a)return b;return d}function Vb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fb(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wb(a,b,c){var d=Pb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Yb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ib(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Jb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Hb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xb(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Jb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ub(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ub(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Jb(a,b,d)),"normal"===f&&b in Sb&&(f=Sb[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Ob.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Rb,function(){return Yb(a,b,d)}):Yb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ib(a);return Wb(a,c,d?Xb(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Nb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Mb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Mb.test(f)?f.replace(Mb,e):f+" "+e)}}),m.cssHooks.marginRight=Lb(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Jb,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Gb.test(a)||(m.cssHooks[a+b].set=Wb)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ib(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Vb(this,!0)},hide:function(){return Vb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Zb(a,b,c,d,e){return new Zb.prototype.init(a,b,c,d,e)}m.Tween=Zb,Zb.prototype={constructor:Zb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px") +},cur:function(){var a=Zb.propHooks[this.prop];return a&&a.get?a.get(this):Zb.propHooks._default.get(this)},run:function(a){var b,c=Zb.propHooks[this.prop];return this.pos=b=this.options.duration?m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Zb.propHooks._default.set(this),this}},Zb.prototype.init.prototype=Zb.prototype,Zb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Zb.propHooks.scrollTop=Zb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Zb.prototype.init,m.fx.step={};var $b,_b,ac=/^(?:toggle|show|hide)$/,bc=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cc=/queueHooks$/,dc=[ic],ec={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bc.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bc.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fc(){return setTimeout(function(){$b=void 0}),$b=m.now()}function gc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hc(a,b,c){for(var d,e=(ec[b]||[]).concat(ec["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ic(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fb(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fb(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ac.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fb(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hc(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jc(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kc(a,b,c){var d,e,f=0,g=dc.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$b||fc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$b||fc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jc(k,j.opts.specialEasing);g>f;f++)if(d=dc[f].call(j,a,k,j.opts))return d;return m.map(k,hc,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kc,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],ec[c]=ec[c]||[],ec[c].unshift(b)},prefilter:function(a,b){b?dc.unshift(a):dc.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kc(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gc(b,!0),a,d,e)}}),m.each({slideDown:gc("show"),slideUp:gc("hide"),slideToggle:gc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($b=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$b=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_b||(_b=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_b),_b=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lc=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lc,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mc,nc,oc=m.expr.attrHandle,pc=/^(?:checked|selected)$/i,qc=k.getSetAttribute,rc=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nc:mc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rc&&qc||!pc.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qc?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nc={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rc&&qc||!pc.test(c)?a.setAttribute(!qc&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=oc[b]||m.find.attr;oc[b]=rc&&qc||!pc.test(b)?function(a,b,d){var e,f;return d||(f=oc[b],oc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,oc[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rc&&qc||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mc&&mc.set(a,b,c)}}),qc||(mc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},oc.id=oc.name=oc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mc.set},m.attrHooks.contenteditable={set:function(a,b,c){mc.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sc=/^(?:input|select|textarea|button|object)$/i,tc=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sc.test(a.nodeName)||tc.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var uc=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(uc," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vc=m.now(),wc=/\?/,xc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yc,zc,Ac=/#.*$/,Bc=/([?&])_=[^&]*/,Cc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Dc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ec=/^(?:GET|HEAD)$/,Fc=/^\/\//,Gc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hc={},Ic={},Jc="*/".concat("*");try{zc=location.href}catch(Kc){zc=y.createElement("a"),zc.href="",zc=zc.href}yc=Gc.exec(zc.toLowerCase())||[];function Lc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mc(a,b,c,d){var e={},f=a===Ic;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nc(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Oc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zc,type:"GET",isLocal:Dc.test(yc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nc(Nc(a,m.ajaxSettings),b):Nc(m.ajaxSettings,a)},ajaxPrefilter:Lc(Hc),ajaxTransport:Lc(Ic),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zc)+"").replace(Ac,"").replace(Fc,yc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yc[1]&&c[2]===yc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yc[3]||("http:"===yc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mc(Hc,k,b,v),2===t)return v;h=k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Ec.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bc.test(e)?e.replace(Bc,"$1_="+vc++):e+(wc.test(e)?"&":"?")+"_="+vc++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mc(Ic,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Oc(k,v,c)),u=Pc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qc=/%20/g,Rc=/\[\]$/,Sc=/\r?\n/g,Tc=/^(?:submit|button|image|reset|file)$/i,Uc=/^(?:input|select|textarea|keygen)/i;function Vc(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rc.test(a)?d(a,e):Vc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vc(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vc(c,a[c],b,e);return d.join("&").replace(Qc,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Uc.test(this.nodeName)&&!Tc.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sc,"\r\n")}}):{name:b.name,value:c.replace(Sc,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zc()||$c()}:Zc;var Wc=0,Xc={},Yc=m.ajaxSettings.xhr();a.ActiveXObject&&m(a).on("unload",function(){for(var a in Xc)Xc[a](void 0,!0)}),k.cors=!!Yc&&"withCredentials"in Yc,Yc=k.ajax=!!Yc,Yc&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xc[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zc(){try{return new a.XMLHttpRequest}catch(b){}}function $c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _c=[],ad=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_c.pop()||m.expando+"_"+vc++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ad.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ad.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ad,"$1"+e):b.jsonp!==!1&&(b.url+=(wc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_c.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bd=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bd)return bd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cd=a.document.documentElement;function dd(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dd(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cd;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cd})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dd(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=Lb(k.pixelPosition,function(a,c){return c?(c=Jb(a,b),Hb.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ed=a.jQuery,fd=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fd),b&&a.jQuery===m&&(a.jQuery=ed),m},typeof b===K&&(a.jQuery=a.$=m),m});
\ No newline at end of file diff --git a/doc/sample_html/status.dat b/doc/sample_html/status.dat deleted file mode 100644 index 53fb6526..00000000 --- a/doc/sample_html/status.dat +++ /dev/null @@ -1,340 +0,0 @@ -(dp1 -S'files' -p2 -(dp3 -S'cogapp_test_cogapp' -p4 -(dp5 -S'index' -p6 -(dp7 -S'html_filename' -p8 -S'cogapp_test_cogapp.html' -p9 -sS'name' -p10 -S'cogapp/test_cogapp' -p11 -sS'nums' -p12 -ccopy_reg -_reconstructor -p13 -(ccoverage.results -Numbers -p14 -c__builtin__ -object -p15 -NtRp16 -(dp17 -S'n_files' -p18 -I1 -sS'n_branches' -p19 -I4 -sS'n_statements' -p20 -I612 -sS'n_excluded' -p21 -I17 -sS'n_partial_branches' -p22 -I0 -sS'n_missing' -p23 -I404 -sS'n_missing_branches' -p24 -I2 -sbssS'hash' -p25 -S'\xaa\xeae\xeaG{\xcf\xde\xe3\xc8;.$\x1f\xb5,' -p26 -ssS'cogapp_whiteutils' -p27 -(dp28 -g6 -(dp29 -g8 -S'cogapp_whiteutils.html' -p30 -sg10 -S'cogapp/whiteutils' -p31 -sg12 -g13 -(g14 -g15 -NtRp32 -(dp33 -g18 -I1 -sg19 -I32 -sg20 -I45 -sg21 -I0 -sg22 -I3 -sg23 -I3 -sg24 -I3 -sbssg25 -S'o\xfd\x0e+s2="\xb2\x1c\xd6\xa1\xee\x85\x85\xda' -p34 -ssS'cogapp_test_makefiles' -p35 -(dp36 -g6 -(dp37 -g8 -S'cogapp_test_makefiles.html' -p38 -sg10 -S'cogapp/test_makefiles' -p39 -sg12 -g13 -(g14 -g15 -NtRp40 -(dp41 -g18 -I1 -sg19 -I6 -sg20 -I55 -sg21 -I2 -sg22 -I0 -sg23 -I55 -sg24 -I6 -sbssg25 -S'\xb7\xed\xc1\x98\x1c\x15\t\xf4"\xd8\xff\xb8o4U=' -p42 -ssS'cogapp_makefiles' -p43 -(dp44 -g6 -(dp45 -g8 -S'cogapp_makefiles.html' -p46 -sg10 -S'cogapp/makefiles' -p47 -sg12 -g13 -(g14 -g15 -NtRp48 -(dp49 -g18 -I1 -sg19 -I14 -sg20 -I28 -sg21 -I3 -sg22 -I0 -sg23 -I20 -sg24 -I14 -sbssg25 -S'p/\xc29Y\x0b\x02\x8a\x9eO\xbf\x89r\xa86\xf2' -p50 -ssS'cogapp_backward' -p51 -(dp52 -g6 -(dp53 -g8 -S'cogapp_backward.html' -p54 -sg10 -S'cogapp/backward' -p55 -sg12 -g13 -(g14 -g15 -NtRp56 -(dp57 -g18 -I1 -sg19 -I2 -sg20 -I25 -sg21 -I0 -sg22 -I1 -sg23 -I12 -sg24 -I1 -sbssg25 -S'\x91\x17\x7f\x8b\x0c\x83"6\rG\xd6gERX\xe5' -p58 -ssS'cogapp___main__' -p59 -(dp60 -g6 -(dp61 -g8 -S'cogapp___main__.html' -p62 -sg10 -S'cogapp/__main__' -p63 -sg12 -g13 -(g14 -g15 -NtRp64 -(dp65 -g18 -I1 -sg19 -I0 -sg20 -I3 -sg21 -I0 -sg22 -I0 -sg23 -I3 -sg24 -I0 -sbssg25 -S'r\x14\xdf\x8b\x90\x9f\xac\xdf@/\x85\x02\x9ck\x97\x10' -p66 -ssS'cogapp_test_whiteutils' -p67 -(dp68 -g6 -(dp69 -g8 -S'cogapp_test_whiteutils.html' -p70 -sg10 -S'cogapp/test_whiteutils' -p71 -sg12 -g13 -(g14 -g15 -NtRp72 -(dp73 -g18 -I1 -sg19 -I0 -sg20 -I69 -sg21 -I2 -sg22 -I0 -sg23 -I69 -sg24 -I0 -sbssg25 -S'9^hs\x8b2\xdc\xff)\x8a\xde!Wv\xd0w' -p74 -ssS'cogapp_cogapp' -p75 -(dp76 -g6 -(dp77 -g8 -S'cogapp_cogapp.html' -p78 -sg10 -S'cogapp/cogapp' -p79 -sg12 -g13 -(g14 -g15 -NtRp80 -(dp81 -g18 -I1 -sg19 -I158 -sg20 -I403 -sg21 -I3 -sg22 -I26 -sg23 -I180 -sg24 -I104 -sbssg25 -S'\xbbX\x05\x95\xff\xe5\xebOd\x9d\xc2\x8c\x98\xe16\xc3' -p82 -ssS'cogapp___init__' -p83 -(dp84 -g6 -(dp85 -g8 -S'cogapp___init__.html' -p86 -sg10 -S'cogapp/__init__' -p87 -sg12 -g13 -(g14 -g15 -NtRp88 -(dp89 -g18 -I1 -sg19 -I0 -sg20 -I2 -sg21 -I0 -sg22 -I0 -sg23 -I0 -sg24 -I0 -sbssg25 -S'\x99*\x0e\\\x10\x11O\x06WG/gJ\x83\xdd\x99' -p90 -sssS'version' -p91 -S'3.7.1' -p92 -sS'settings' -p93 -S'\x98\xa8x\xfe"r\xb5K\x98\xb1N\\\x99\x9e\xf3\xe5' -p94 -sS'format' -p95 -I1 -s.
\ No newline at end of file diff --git a/doc/sample_html/status.json b/doc/sample_html/status.json new file mode 100644 index 00000000..3419a956 --- /dev/null +++ b/doc/sample_html/status.json @@ -0,0 +1 @@ +{"files": {"cogapp_test_whiteutils_py": {"index": {"relative_filename": "cogapp/test_whiteutils.py", "html_filename": "cogapp_test_whiteutils_py.html", "nums": [1, 69, 0, 69, 0, 0, 0]}, "hash": "f7a3c04788858b652fcfb29825e1e8d4"}, "cogapp_test_makefiles_py": {"index": {"relative_filename": "cogapp/test_makefiles.py", "html_filename": "cogapp_test_makefiles_py.html", "nums": [1, 55, 0, 55, 6, 0, 6]}, "hash": "ff1f44c04d08ae202f5164e1ba75818e"}, "cogapp_cogapp_py": {"index": {"relative_filename": "cogapp/cogapp.py", "html_filename": "cogapp_cogapp_py.html", "nums": [1, 423, 4, 194, 168, 26, 114]}, "hash": "0cddc268270941a93a88a5a06a86629e"}, "cogapp___init___py": {"index": {"relative_filename": "cogapp/__init__.py", "html_filename": "cogapp___init___py.html", "nums": [1, 2, 0, 0, 0, 0, 0]}, "hash": "e8e5f4601febeb4f8cfaedc27cda7ff2"}, "cogapp_backward_py": {"index": {"relative_filename": "cogapp/backward.py", "html_filename": "cogapp_backward_py.html", "nums": [1, 19, 0, 8, 2, 1, 1]}, "hash": "02fc7e84b678eb8cd2df594ecd21792d"}, "cogapp_test_cogapp_py": {"index": {"relative_filename": "cogapp/test_cogapp.py", "html_filename": "cogapp_test_cogapp_py.html", "nums": [1, 704, 6, 486, 6, 0, 4]}, "hash": "8693bbecf0b8fc5ef9ad177e4d156edb"}, "cogapp_makefiles_py": {"index": {"relative_filename": "cogapp/makefiles.py", "html_filename": "cogapp_makefiles_py.html", "nums": [1, 28, 3, 20, 14, 0, 14]}, "hash": "a744227abe2381eefae57f20e5f3d79e"}, "cogapp_whiteutils_py": {"index": {"relative_filename": "cogapp/whiteutils.py", "html_filename": "cogapp_whiteutils_py.html", "nums": [1, 45, 0, 3, 32, 3, 3]}, "hash": "b898c54cd626b6265d68d6e536ad78cf"}, "cogapp___main___py": {"index": {"relative_filename": "cogapp/__main__.py", "html_filename": "cogapp___main___py.html", "nums": [1, 3, 0, 3, 0, 0, 0]}, "hash": "c846304fff9f9b5f7510a86b60c3c3c6"}}, "version": "4.0.3", "settings": "7d07facd0b8027d5d394bf363d405670", "format": 1}
\ No newline at end of file diff --git a/doc/sample_html/style.css b/doc/sample_html/style.css index 811c6401..15b08904 100644 --- a/doc/sample_html/style.css +++ b/doc/sample_html/style.css @@ -1,6 +1,9 @@ -/* CSS styles for Coverage. */ +/* Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 */ +/* For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt */ + +/* CSS styles for coverage.py. */ /* Page-wide styles */ -html, body, h1, h2, h3, p, td, th { +html, body, h1, h2, h3, p, table, td, th { margin: 0; padding: 0; border: 0; @@ -31,6 +34,17 @@ p { table { border-collapse: collapse; } +td { + vertical-align: top; +} +table tr.hidden { + display: none !important; + } + +p#no_rows { + display: none; + font-size: 1.2em; + } a.nav { text-decoration: none; @@ -53,11 +67,11 @@ a.nav:hover { font-family: "courier new", monospace; } -#indexfile #footer { +.indexfile #footer { margin: 1em 3em; } -#pyfile #footer { +.pyfile #footer { margin: 1em 1em; } @@ -80,6 +94,16 @@ a.nav:hover { h1 { font-size: 1.25em; + display: inline-block; +} + +#filter_container { + display: inline-block; + float: right; + margin: 0 2em 0 0; +} +#filter_container input { + width: 10em; } h2.stats { @@ -130,6 +154,7 @@ h2.stats { /* Help panel */ #keyboard_icon { float: right; + margin: 5px; cursor: pointer; } @@ -141,11 +166,11 @@ h2.stats { display: none; } -#indexfile .help_panel { +.indexfile .help_panel { width: 20em; height: 4em; } -#pyfile .help_panel { +.pyfile .help_panel { width: 16em; height: 8em; } @@ -227,7 +252,6 @@ td.text { .text span.annotate { font-family: georgia; - font-style: italic; color: #666; float: right; padding-right: .5em; @@ -288,9 +312,11 @@ td.text { text-decoration: underline; color: #000; } -#index tr.total { +#index tr.total, +#index tr.total_dynamic { } -#index tr.total td { +#index tr.total td, +#index tr.total_dynamic td { font-weight: bold; border-top: 1px solid #ccc; border-bottom: none; diff --git a/doc/source.rst b/doc/source.rst index 42fd3382..fb75a6e9 100644 --- a/doc/source.rst +++ b/doc/source.rst @@ -1,3 +1,6 @@ +.. Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +.. For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + .. _source: ======================= @@ -37,14 +40,14 @@ considered, and files with unusual punctuation in their names will be skipped You can further fine-tune coverage.py's attention with the ``--include`` and ``--omit`` switches (or ``[run] include`` and ``[run] omit`` configuration -values). ``--include`` is a list of filename patterns. If specified, only files -matching those patterns will be measured. ``--omit`` is also a list of filename -patterns, specifying files not to measure. If both ``include`` and ``omit`` -are specified, first the set of files is reduced to only those that match the -include patterns, then any files that match the omit pattern are removed from -the set. - -The ``include`` and ``omit`` filename patterns follow typical shell syntax: +values). ``--include`` is a list of file name patterns. If specified, only +files matching those patterns will be measured. ``--omit`` is also a list of +file name patterns, specifying files not to measure. If both ``include`` and +``omit`` are specified, first the set of files is reduced to only those that +match the include patterns, then any files that match the omit pattern are +removed from the set. + +The ``include`` and ``omit`` file name patterns follow typical shell syntax: ``*`` matches any number of characters and ``?`` matches a single character. Patterns that start with a wildcard character are used as-is, other patterns are interpreted relative to the current directory. @@ -66,7 +69,7 @@ parts. The report commands (``report``, ``html``, ``annotate``, and ``xml``) all take optional ``modules`` arguments, and ``--include`` and ``--omit`` switches. The ``modules`` arguments specify particular modules to report on. The ``include`` -and ``omit`` values are lists of filename patterns, just as with the ``run`` +and ``omit`` values are lists of file name patterns, just as with the ``run`` command. Remember that the reporting commands can only report on the data that has been diff --git a/doc/subprocess.rst b/doc/subprocess.rst index cce2c0bf..b9527c84 100644 --- a/doc/subprocess.rst +++ b/doc/subprocess.rst @@ -1,3 +1,6 @@ +.. Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +.. For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + .. _subprocess: ======================= @@ -30,7 +33,7 @@ Measuring coverage in sub-processes is a little tricky. When you spawn a sub-process, you are invoking Python to run your program. Usually, to get coverage measurement, you have to use coverage.py to run your program. Your sub-process won't be using coverage.py, so we have to convince Python to use -coverage even when not explicitly invoked. +coverage.py even when not explicitly invoked. To do that, we'll configure Python to run a little coverage.py code when it starts. That code will look for an environment variable that tells it to start @@ -71,3 +74,20 @@ Note that if you use one of these techniques, you must undo them if you uninstall coverage.py, since you will be trying to import it during Python start-up. Be sure to remove the change when you uninstall coverage.py, or use a more defensive approach to importing it. + + +Signal handlers and atexit +-------------------------- + +.. hmm, this isn't specifically about subprocesses, is there a better place + where we could talk about this? + +To successfully write a coverage data file, the Python sub-process under +analysis must shut down cleanly and have a chance for coverage.py to run the +``atexit`` handler it registers. + +For example if you send SIGTERM to end the sub-process, but your sub-process +has never registered any SIGTERM handler, then a coverage file won't be +written. See the `atexit`_ docs for details of when the handler isn't run. + +.. _atexit: https://docs.python.org/2/library/atexit.html diff --git a/doc/trouble.rst b/doc/trouble.rst index c54ab68b..b7011988 100644 --- a/doc/trouble.rst +++ b/doc/trouble.rst @@ -1,3 +1,6 @@ +.. Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +.. For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + .. _trouble: ========================= @@ -8,8 +11,8 @@ Things that cause trouble .. :history: 20150124T160800, remove obsolete stuff. -Coverage works well, and I want it to properly measure any Python program, but -there are some situations it can't cope with. This page details some known +Coverage.py works well, and I want it to properly measure any Python program, +but there are some situations it can't cope with. This page details some known problems, with possible courses of action, and links to coverage.py bug reports with more information. @@ -1,31 +1,35 @@ * Release checklist -- Test on: - - Windows - - Ubuntu - - Mac - - Pythons 2.6, 2.7, 3.3, 3.4 - Version number in coverage/version.py - - 3.1a1, 3.1b1, 3.1c1, 3.1 -- Copyright date in coverage/__init__.py -- Update CHANGES.txt, including release date. -- Update docstring in setup.py, including "New in x.y:" + version_info = (4, 0, 2, 'alpha', 1) + version_info = (4, 0, 2, 'beta', 1) + version_info = (4, 0, 2, 'candidate', 1) + version_info = (4, 0, 2, 'final', 0) +- Python version number in classifiers in setup.py +- Copyright date in NOTICE.txt +- Update CHANGES.rst, including release date. +- Update README.rst, 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 - Don't forget the man page: doc/python-coverage.1.txt + - Done with changes to source files, check them in. - Generate new sample_html to get the latest, incl footer version number: pip install -e . cd ~/cog/trunk rm -rf htmlcov - TODO: this isn't right with the new cog - coverage run --branch --source=cogapp -m cogapp.test_cogapp CogTestsInMemory + coverage run --branch --source=cogapp -m nose cogapp/test_cogapp.py:CogTestsInMemory + coverage combine coverage html - IF BETA: + rm -f ~/coverage/trunk/doc/sample_html_beta/*.* cp -r htmlcov/ ~/coverage/trunk/doc/sample_html_beta/ - ELSE: + rm -f ~/coverage/trunk/doc/sample_html/*.* cp -r htmlcov/ ~/coverage/trunk/doc/sample_html/ + cd ~/coverage/trunk + check in the new sample html - IF BETA: - Build and publish docs: $ make publishbeta @@ -34,41 +38,40 @@ $ make publish - Kits: - Source kit: - - $ make kit - - Windows .exe for each Python - - $ tox -c tox_winkits.ini + - $ make clean kit + - Wheels + - $ make wheel + - Windows kits + - $ hg push + - wait about an hour for Appveyor to build kits. + - $ make download_appveyor + - examine the dist directory, and remove anything that looks malformed. - Update PyPi: - $ make pypi - - upload the kits: - - SWITCH TO TWINE: https://pypi.python.org/pypi/twine + - upload kits: - $ make kit_upload - - $ tox -c tox_winkits.ini 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" 3.0.1 + - hg tag -m "Coverage 3.0.1" coverage-3.0.1 - Update nedbatchelder.com - - Edit webfaction.htaccess to make sure the proper versions are mapped to /beta - Blog post? - Update readthedocs - - Coverage / versions + - visit https://readthedocs.org/projects/coverage/versions/ - find the latest tag in the inactive list, edit it, make it active. + - IF NOT BETA: + - visit https://readthedocs.org/dashboard/coverage/advanced/ + - change the default version to the new version - 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. -- Update github: - - hg bookmark -r default master -f && hg push github - Announce on coveragepy-announce@googlegroups.com . - Announce on TIP. -- Ask Christophe Zwerschke (cito@online.de) to build win64 kits. * Building -- Install fixtar on any Windows Python used to make source kits: http://bitbucket.org/ned/fixtar - Create PythonXX\Lib\distutils\distutils.cfg:: [build] compiler = mingw32 @@ -76,27 +79,21 @@ * Testing - Testing of Python code is handled by tox. - - Create a virtualenv - - install tox into it - - activate the virtualenv + - Create and activate a virtualenv + - pip install -r requirements/dev.pip - $ tox - For complete coverage testing: $ make metacov - This will run coverage under its own measurement. You can do this in - different environments (Linux vs. Windows, for example), then copy the - data files (.coverage.meta.*) to one machine for combination and - reporting. To combine and report: + This will run coverage.py under its own measurement. You can do this in + different environments (Linux vs. Windows, for example), then copy the data + files (.metacov.*) to one machine for combination and reporting. To + combine and report: $ make metahtml -- For testing on Python <= 2.4: - - - Set up the Python as your current python, probably with a virtualenv. - - $ . ./test_old.sh - - To run the Javascript tests: open tests/js/index.html in variety of browsers. @@ -1,4 +1,7 @@ # coding: utf-8 +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Helper for building, testing, and linting coverage.py. To get portability, all these operations are written in Python here instead @@ -6,25 +9,42 @@ of in shell scripts, batch files, or Makefiles. """ +import contextlib import fnmatch import glob import inspect import os import platform -import socket import sys import textwrap import warnings import zipfile +# We want to see all warnings while we are running tests. But we also need to +# disable warnings for some of the more complex setting up of tests. warnings.simplefilter("default") +@contextlib.contextmanager +def ignore_warnings(): + """Context manager to ignore warning within the with statement.""" + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + yield + + # Functions named do_* are executable from the command line: do_blah is run # by "python igor.py blah". +def do_show_env(): + """Show the environment variables.""" + print("Environment:") + for env in sorted(os.environ): + print(" %s = %r" % (env, os.environ[env])) + + def do_remove_extension(): """Remove the compiled C extension, no matter what its name.""" @@ -32,6 +52,7 @@ def do_remove_extension(): tracer.so tracer.*.so tracer.pyd + tracer.*.pyd """.split() for pattern in so_patterns: @@ -43,32 +64,53 @@ def do_remove_extension(): pass -def run_tests(tracer, *nose_args): - """The actual running of tests.""" - import nose.core +def label_for_tracer(tracer): + """Get the label for these tests.""" if tracer == "py": label = "with Python tracer" - skipper = os.environ.get("COVERAGE_NO_PYTRACER") else: label = "with C tracer" - skipper = os.environ.get("COVERAGE_NO_EXTENSION") + + return label + + +def should_skip(tracer): + """Is there a reason to skip these tests?""" + if tracer == "py": + skipper = os.environ.get("COVERAGE_NO_PYTRACER") + else: + skipper = ( + os.environ.get("COVERAGE_NO_EXTENSION") or + os.environ.get("COVERAGE_NO_CTRACER") + ) if skipper: - msg = "Skipping tests " + label + msg = "Skipping tests " + label_for_tracer(tracer) if len(skipper) > 1: msg += ": " + skipper - print(msg) - return + else: + msg = "" + + return msg + - print_banner(label) +def run_tests(tracer, *nose_args): + """The actual running of tests.""" + with ignore_warnings(): + import nose.core + + if 'COVERAGE_TESTING' not in os.environ: + os.environ['COVERAGE_TESTING'] = "True" + print_banner(label_for_tracer(tracer)) nose_args = ["nosetests"] + list(nose_args) nose.core.main(argv=nose_args) def run_tests_with_coverage(tracer, *nose_args): """Run tests, but with coverage.""" - import coverage + # Need to define this early enough that the first import of env.py sees it. + os.environ['COVERAGE_TESTING'] = "True" os.environ['COVERAGE_PROCESS_START'] = os.path.abspath('metacov.ini') os.environ['COVERAGE_HOME'] = os.getcwd() @@ -81,16 +123,22 @@ def run_tests_with_coverage(tracer, *nose_args): with open(pth_path, "w") as pth_file: pth_file.write("import coverage; coverage.process_startup()\n") + # Make names for the data files that keep all the test runs distinct. + impl = platform.python_implementation().lower() version = "%s%s" % sys.version_info[:2] - suffix = "%s_%s_%s" % (version, tracer, socket.gethostname()) + if '__pypy__' in sys.builtin_module_names: + version += "_%s%s" % sys.pypy_version_info[:2] + suffix = "%s%s_%s_%s" % (impl, version, tracer, platform.platform()) - cov = coverage.coverage(config_file="metacov.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. + os.environ['COVERAGE_METAFILE'] = os.path.abspath(".metacov."+suffix) + + import coverage + cov = coverage.Coverage(config_file="metacov.ini", data_suffix=False) + # Cheap trick: the coverage.py 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._warn_unimported_source = False - cov.erase() cov.start() try: @@ -119,22 +167,31 @@ def run_tests_with_coverage(tracer, *nose_args): cov.stop() os.remove(pth_path) + cov.combine() cov.save() def do_combine_html(): - """Combine data from a meta-coverage run, and make the HTML report.""" + """Combine data from a meta-coverage run, and make the HTML and XML reports.""" import coverage os.environ['COVERAGE_HOME'] = os.getcwd() - cov = coverage.coverage(config_file="metacov.ini") + os.environ['COVERAGE_METAFILE'] = os.path.abspath(".metacov") + cov = coverage.Coverage(config_file="metacov.ini") cov.load() cov.combine() cov.save() cov.html_report() + cov.xml_report() def do_test_with_tracer(tracer, *noseargs): """Run nosetests with a particular tracer.""" + # If we should skip these tests, skip them. + skip_msg = should_skip(tracer) + if skip_msg: + print(skip_msg) + return + os.environ["COVERAGE_TEST_TRACER"] = tracer if os.environ.get("COVERAGE_COVERAGE", ""): return run_tests_with_coverage(tracer, *noseargs) @@ -157,11 +214,13 @@ def do_zip_mods(): assert [ord(c) for c in text] == ords print(u"All OK with {encoding}") """) + # These encodings should match the list in tests/test_python.py details = [ (u'utf8', u'ⓗⓔⓛⓛⓞ, ⓦⓞⓡⓛⓓ'), (u'gb2312', u'你好,世界'), (u'hebrew', u'שלום, עולם'), (u'shift_jis', u'こんにちは世界'), + (u'cp1252', u'“hi”'), ] for encoding, text in details: filename = 'encoded_{0}.py'.format(encoding) @@ -176,13 +235,14 @@ def do_install_egg(): """Install the egg1 egg for tests.""" # I am pretty certain there are easier ways to install eggs... # pylint: disable=import-error,no-name-in-module - import distutils.core cur_dir = os.getcwd() os.chdir("tests/eggsrc") - distutils.core.run_setup("setup.py", ["--quiet", "bdist_egg"]) - egg = glob.glob("dist/*.egg")[0] - distutils.core.run_setup( - "setup.py", ["--quiet", "easy_install", "--no-deps", "--zip-ok", egg] + with ignore_warnings(): + import distutils.core + distutils.core.run_setup("setup.py", ["--quiet", "bdist_egg"]) + egg = glob.glob("dist/*.egg")[0] + distutils.core.run_setup( + "setup.py", ["--quiet", "easy_install", "--no-deps", "--zip-ok", egg] ) os.chdir(cur_dir) @@ -195,8 +255,8 @@ def do_check_eol(): '.tox*', '*.egg-info', '_build', - ] - checked = set([]) + ] + checked = set() def check_file(fname, crlf=True, trail_white=True): """Check a single file for whitespace abuse.""" @@ -240,7 +300,8 @@ def do_check_eol(): for dir_name in ignored: dirs.remove(dir_name) - check_files("coverage", ["*.py", "*.c"]) + check_files("coverage", ["*.py"]) + check_files("coverage/ctracer", ["*.c", "*.h"]) check_files("coverage/htmlfiles", ["*.html", "*.css", "*.js"]) check_file("tests/farm/html/src/bom.py", crlf=False) check_files("tests", ["*.py"]) @@ -251,8 +312,8 @@ def do_check_eol(): check_file("Makefile") check_file(".hgignore") check_file(".travis.yml") - check_files("doc", ["*.rst"]) - check_files(".", ["*.txt"]) + check_files(".", ["*.rst", "*.txt"]) + check_files(".", ["*.pip"]) def print_banner(label): @@ -265,11 +326,11 @@ def print_banner(label): version = platform.python_version() if '__pypy__' in sys.builtin_module_names: - pypy_version = sys.pypy_version_info - version += " (pypy %s)" % ".".join(str(v) for v in pypy_version) + version += " (pypy %s)" % ".".join(str(v) for v in sys.pypy_version_info) which_python = os.path.relpath(sys.executable) print('=== %s %s %s (%s) ===' % (impl, version, label, which_python)) + sys.stdout.flush() def do_help(): @@ -281,6 +342,22 @@ def do_help(): print("%-20s%s" % (name[3:], value.__doc__)) +def analyze_args(function): + """What kind of args does `function` expect? + + Returns: + star, num_pos: + star(boolean): Does `function` accept *args? + num_args(int): How many positional arguments does `function` have? + """ + try: + getargspec = inspect.getfullargspec + except AttributeError: + getargspec = inspect.getargspec + argspec = getargspec(function) + return bool(argspec[1]), len(argspec[0]) + + def main(args): """Main command-line execution for igor. @@ -294,14 +371,13 @@ def main(args): if handler is None: print("*** No handler for %r" % verb) return 1 - argspec = inspect.getargspec(handler) - if argspec[1]: + star, num_args = analyze_args(handler) + if star: # Handler has *args, give it all the rest of the command line. handler_args = args args = [] else: # Handler has specific arguments, give it only what it needs. - num_args = len(argspec[0]) handler_args = args[:num_args] args = args[num_args:] ret = handler(*handler_args) @@ -309,5 +385,6 @@ def main(args): if ret: return ret + if __name__ == '__main__': sys.exit(main(sys.argv[1:])) diff --git a/lab/branches.py b/lab/branches.py index fbba87eb..275eef4a 100644 --- a/lab/branches.py +++ b/lab/branches.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + # Demonstrate some issues with coverage.py branch testing. def my_function(x): diff --git a/lab/bug397.py b/lab/bug397.py new file mode 100644 index 00000000..4d72e908 --- /dev/null +++ b/lab/bug397.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python +""" +Run this file two ways under coverage and see that the times are the same: + + $ coverage run lab/bug397.py slow + Runtime per example: 130.96 +/- 3.70 us + $ coverage run lab/bug397.py fast + Runtime per example: 131.34 +/- 4.48 us + +Written by David MacIver as part of +https://bitbucket.org/ned/coveragepy/issues/397/stopping-and-resuming-coverage-with + +""" +from __future__ import print_function + +import sys +import random +import time +import math + +if sys.argv[1] == "slow": + sys.settrace(sys.gettrace()) + +random.seed(1) + + +def hash_str(s): + h = 0 + for c in s: + h = (h * 31 + ord(c)) & (2 ** 64 - 1) + return h + +data = [ + hex(random.getrandbits(1024)) for _ in range(500) +] + +N_SAMPLES = 100 + + +def mean(xs): + xs = list(xs) + return sum(xs) / len(xs) + + +def sd(xs): + return math.sqrt(mean(x ** 2 for x in xs) - mean(xs) ** 2) + + +if __name__ == '__main__': + timing = [] + for _ in range(N_SAMPLES): + start = time.time() + for d in data: + hash_str(d) + timing.append(1000000 * (time.time() - start) / len(data)) + print("Runtime per example:", "%.2f +/- %.2f us" % (mean(timing), sd(timing))) diff --git a/lab/cover-plugin.txt b/lab/cover-plugin.txt deleted file mode 100644 index 927fff81..00000000 --- a/lab/cover-plugin.txt +++ /dev/null @@ -1,54 +0,0 @@ -== nose cover plugin flow == - -- configure: - set self.coverPackages: list of names of packages - -- begin: - self.skipModules = sys.modules.keys()[:] - set coverage.exclude (why?) - coverage.start - - -- report: - coverage.stop() - modules = [ module - for name, module in sys.modules.items() - if self.wantModuleCoverage(name, module) ] - coverage.report(modules) - -- wantModuleCoverage(name, module): - if self.coverPackages: - for package in self.coverPackages: - want_it = False - if name.startswith(package): - if self.coverTests: - want_it = True - else: - want_it = not self.conf.testMatch.search(name) - if want_it: - return True - if name in self.skipModules: - return False - - if self.conf.testMatch.search(name) and not self.coverTests: - return False - - return not self.coverPackages - -- wantFile: - - - - -source, include, omit: - - # self.source is a list of canonical directories for the packages. - # canon_dir is the canonical directory containing the source file. - - if self.source: - for s in self.source: - if is_contained(s, canon_dir): - break - else: - # This file wasn't in any source. - return False diff --git a/lab/dataflow.txt b/lab/dataflow.txt deleted file mode 100644 index 1f628f15..00000000 --- a/lab/dataflow.txt +++ /dev/null @@ -1,36 +0,0 @@ -PyTracer.data: - { filename: { lineno: None, .. }, ... } - OR: { filename: { (l1, l2): None, .. }, ... } - -CoverageData.lines: - { filename: { lineno: None, ...}, ... } - -Collector.get_line_data(): - PyTracer.data --> { filename: { lineno: None, .. }, ... } - returns { filename: { lineno: None, .. }, ... } - - called by: - coverage._harvest_data, passed into CoverageData.add_line_data() - -CoverageData.add_line_data( { filename: { lineno: None, .. }, ... } ) - --> data.lines - -CoverageData.measured_files(): - returns [filename, ...] - called by: - Reporter.find_file_reporters() - tests - -CoverageData.executed_lines(): - returns { lineno: None, ... } - called by: - coverage._analyze() - -CoverageData.summary(): - returns { filename: count(lineno), ... } - called by: - cmdline (for "debug data") - tests - -.coverage - {'lines': { filename: [lineno, ...], ... }} diff --git a/lab/hack_pyc.py b/lab/hack_pyc.py index 1cdc4765..0ebd9948 100644 --- a/lab/hack_pyc.py +++ b/lab/hack_pyc.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """ Wicked hack to get .pyc files to do bytecode tracing instead of line tracing. """ diff --git a/lab/lnotab.py b/lab/lnotab.py deleted file mode 100644 index 230e42bb..00000000 --- a/lab/lnotab.py +++ /dev/null @@ -1,122 +0,0 @@ -# Comment copied from Python/compile.c: -# -# All about a_lnotab. -# -# c_lnotab is an array of unsigned bytes disguised as a Python string. -# It is used to map bytecode offsets to source code line #s (when needed -# for tracebacks). -# -# The array is conceptually a list of -# (bytecode offset increment, line number increment) -# pairs. The details are important and delicate, best illustrated by example: -# -# byte code offset source code line number -# 0 1 -# 6 2 -# 50 7 -# 350 307 -# 361 308 -# -# The first trick is that these numbers aren't stored, only the increments -# from one row to the next (this doesn't really work, but it's a start): -# -# 0, 1, 6, 1, 44, 5, 300, 300, 11, 1 -# -# The second trick is that an unsigned byte can't hold negative values, or -# values larger than 255, so (a) there's a deep assumption that byte code -# offsets and their corresponding line #s both increase monotonically, and (b) -# if at least one column jumps by more than 255 from one row to the next, more -# than one pair is written to the table. In case #b, there's no way to know -# from looking at the table later how many were written. That's the delicate -# part. A user of c_lnotab desiring to find the source line number -# corresponding to a bytecode address A should do something like this -# -# lineno = addr = 0 -# for addr_incr, line_incr in c_lnotab: -# addr += addr_incr -# if addr > A: -# return lineno -# lineno += line_incr -# -# In order for this to work, when the addr field increments by more than 255, -# the line # increment in each pair generated must be 0 until the remaining addr -# increment is < 256. So, in the example above, assemble_lnotab (it used -# to be called com_set_lineno) should not (as was actually done until 2.2) -# expand 300, 300 to 255, 255, 45, 45, -# but to 255, 0, 45, 255, 0, 45. -# - -def lnotab(pairs, first_lineno=0): - """Yields byte integers representing the pairs of integers passed in.""" - assert first_lineno <= pairs[0][1] - cur_byte, cur_line = 0, first_lineno - for byte_off, line_off in pairs: - byte_delta = byte_off - cur_byte - line_delta = line_off - cur_line - assert byte_delta >= 0 - assert line_delta >= 0 - while byte_delta > 255: - yield 255 # byte - yield 0 # line - byte_delta -= 255 - yield byte_delta - while line_delta > 255: - yield 255 # line - yield 0 # byte - line_delta -= 255 - yield line_delta - cur_byte, cur_line = byte_off, line_off - -def lnotab_string(pairs, first_lineno=0): - return "".join(chr(b) for b in lnotab(pairs, first_lineno)) - -def byte_pairs(lnotab): - """Yield pairs of integers from a string.""" - for i in range(0, len(lnotab), 2): - yield ord(lnotab[i]), ord(lnotab[i+1]) - -def lnotab_numbers(lnotab, first_lineno=0): - """Yields the byte, line offset pairs from a packed lnotab string.""" - - last_line = None - cur_byte, cur_line = 0, first_lineno - for byte_delta, line_delta in byte_pairs(lnotab): - if byte_delta: - if cur_line != last_line: - yield cur_byte, cur_line - last_line = cur_line - cur_byte += byte_delta - cur_line += line_delta - if cur_line != last_line: - yield cur_byte, cur_line - - -## Tests - -def same_list(a, b): - a = list(a) - assert a == b - -def test_simple(): - same_list(lnotab([(0,1)]), [0, 1]) - same_list(lnotab([(0,1), (6, 2)]), [0, 1, 6, 1]) - -def test_starting_above_one(): - same_list(lnotab([(0,100), (6,101)]), [0, 100, 6, 1]) - same_list(lnotab([(0,100), (6,101)], 50), [0, 50, 6, 1]) - -def test_large_gaps(): - same_list(lnotab([(0,1), (300, 300)]), [0, 1, 255, 0, 45, 255, 0, 44]) - same_list(lnotab([(0,1), (255, 300)]), [0, 1, 255, 255, 0, 44]) - same_list(lnotab([(0,1), (255, 256)]), [0, 1, 255, 255]) - -def test_strings(): - assert lnotab_string([(0,1), (6, 2)]) == "\x00\x01\x06\x01" - assert lnotab_string([(0,1), (300, 300)]) == "\x00\x01\xff\x00\x2d\xff\x00\x2c" - -def test_numbers(): - same_list(lnotab_numbers("\x00\x01\x06\x01"), [(0,1), (6,2)]) - same_list(lnotab_numbers("\x00\x01\xff\x00\x2d\xff\x00\x2c"), [(0,1), (300, 300)]) - -def test_numbers_firstlineno(): - same_list(lnotab_numbers("\x00\x01\xff\x00\x2d\xff\x00\x2c", 10), [(0,11), (300, 310)]) diff --git a/lab/new-data.js b/lab/new-data.js new file mode 100644 index 00000000..973aa116 --- /dev/null +++ b/lab/new-data.js @@ -0,0 +1,74 @@ +{ + "run" { + "collector": "coverage.py 4.0", + "config": { + "branch": true, + "source": ".", + }, + "collected": "20150711T090600", + }, + + // As of now: + "lines": { + "a/b/c.py": [1, 2, 3, 4, 5], + "a/b/d.py": [4, 5, 6, 7, 8], + }, + "arcs": { + "a/b/c.py: [[1, 2], [2, 3], [4, 5]], + }, + "plugins: { + "a/b/c.py": "fooey.plugin", + }, + + // Maybe in the future? + "files": { + "a/b/c.py": { + "lines": [1, 2, 3, 4, 5], + "arcs": [ + [1, 2], [3, 4], [5, -1], + ], + + "plugin": "django.coverage", + + "lines": { + "1": { + "tests": [ + "foo/bar/test.py:TheTest.test_it", + "asdasdasd", + ], + "tests": [17, 34, 23, 12389], + }, + "2": { + "count": 23, + }, + "3": {}, + "4": {}, + "17": {}, + }, + + "arcs": { + "1.2": {}, + "2.3": {}, + "3.-1": {}, + }, + }, + }, + + "tests": [ + { + "file": "a/b/c.py", + "test": "test_it", + }, + { + "file": "a/b/d.py", + "test": "TheTest.test_it", + }, + ], + + "runs": [ + { + // info about each run? + }, + { ... }, + ], +} diff --git a/lab/parser.py b/lab/parser.py index 662183a7..1a679e8c 100644 --- a/lab/parser.py +++ b/lab/parser.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Parser.py: a main for invoking code in coverage/parser.py""" from __future__ import division @@ -14,6 +17,7 @@ from coverage.python import get_python_source opcode_counts = collections.Counter() + class ParserMain(object): """A main for code parsing experiments.""" @@ -62,10 +66,9 @@ class ParserMain(object): if options.histogram: total = sum(opcode_counts.values()) - print("{} total opcodes".format(total)) + print("{0} total opcodes".format(total)) for opcode, number in opcode_counts.most_common(): - print("{:20s} {:6d} {:.1%}".format(opcode, number, number/total)) - + print("{0:20s} {1:6d} {2:.1%}".format(opcode, number, number/total)) def one_file(self, options, filename): """Process just one file.""" @@ -82,7 +85,7 @@ class ParserMain(object): self.disassemble(bp, histogram=options.histogram) arcs = bp._all_arcs() - if options.chunks:# and not options.dis: + if options.chunks: chunks = bp._all_chunks() if options.recursive: print("%6d: %s" % (len(chunks), filename)) @@ -93,33 +96,35 @@ class ParserMain(object): if options.source or options.tokens: cp = PythonParser(filename=filename, exclude=r"no\s*cover") cp.show_tokens = options.tokens - cp._raw_parse() + cp.parse_source() if options.source: + arc_width = 0 + arc_chars = {} if options.chunks: - arc_width, arc_chars = self.arc_ascii_art(arcs) - else: - arc_width, arc_chars = 0, {} + arc_chars = self.arc_ascii_art(arcs) + if arc_chars: + arc_width = max(len(a) for a in arc_chars.values()) exit_counts = cp.exit_counts() for lineno, ltext in enumerate(cp.lines, start=1): m0 = m1 = m2 = m3 = a = ' ' - if lineno in cp.statement_starts: + if lineno in cp.statements: + m0 = '=' + elif lineno in cp.raw_statements: m0 = '-' exits = exit_counts.get(lineno, 0) if exits > 1: m1 = str(exits) - if lineno in cp.docstrings: + if lineno in cp.raw_docstrings: m2 = '"' - if lineno in cp.classdefs: + if lineno in cp.raw_classdefs: m2 = 'C' - if lineno in cp.excluded: + if lineno in cp.raw_excluded: m3 = 'x' a = arc_chars[lineno].ljust(arc_width) - print("%4d %s%s%s%s%s %s" % - (lineno, m0, m1, m2, m3, a, ltext) - ) + print("%4d %s%s%s%s%s %s" % (lineno, m0, m1, m2, m3, a, ltext)) def disassemble(self, byte_parser, histogram=False): """Disassemble code, for ad-hoc experimenting.""" @@ -158,10 +163,11 @@ class ParserMain(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. + Returns a dictionary mapping line numbers to ascii strings to draw for + that line. """ + arc_chars = collections.defaultdict(str) for lfrom, lto in sorted(arcs): if lfrom < 0: @@ -176,7 +182,8 @@ class ParserMain(object): l1, l2 = lfrom, lto else: l1, l2 = lto, lfrom - w = max(len(arc_chars[l]) for l in range(l1, l2+1)) + #w = max(len(arc_chars[l]) for l in range(l1, l2+1)) + w = first_all_blanks(arc_chars[l] for l in range(l1, l2+1)) for l in range(l1, l2+1): if l == lfrom: ch = '<' @@ -184,16 +191,33 @@ class ParserMain(object): ch = '>' else: ch = '|' - arc_chars[l] = arc_chars[l].ljust(w) + ch - arc_width = 0 + arc_chars[l] = set_char(arc_chars[l], w, ch) - if arc_chars: - arc_width = max(len(a) for a in arc_chars.values()) - else: - arc_width = 0 + return arc_chars + + +def set_char(s, n, c): + """Set the nth char of s to be c, extending s if needed.""" + s = s.ljust(n) + return s[:n] + c + s[n+1:] + + +def blanks(s): + """Return the set of positions where s is blank.""" + return set(i for i, c in enumerate(s) if c == " ") + + +def first_all_blanks(ss): + """Find the first position that is all blank in the strings ss.""" + ss = list(ss) + blankss = blanks(ss[0]) + for s in ss[1:]: + blankss &= blanks(s) + if blankss: + return min(blankss) + else: + return max(len(s) for s in ss) - return arc_width, arc_chars if __name__ == '__main__': ParserMain().main(sys.argv[1:]) - diff --git a/lab/platform_info.py b/lab/platform_info.py new file mode 100644 index 00000000..8caea50f --- /dev/null +++ b/lab/platform_info.py @@ -0,0 +1,26 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +"""Dump information so we can get a quick look at what's available.""" + +import platform +import sys + + +def whatever(f): + try: + return f() + except: + return f + + +def dump_module(mod): + print("\n### {0} ---------------------------".format(mod.__name__)) + for name in dir(mod): + if name.startswith("_"): + continue + print("{0:30s}: {1!r:.100}".format(name, whatever(getattr(mod, name)))) + + +for mod in [platform, sys]: + dump_module(mod) diff --git a/lab/run_trace.py b/lab/run_trace.py index 3822a804..ea0a6cb7 100644 --- a/lab/run_trace.py +++ b/lab/run_trace.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Run a simple trace function on a file of Python code.""" import os, sys diff --git a/lab/show_platform.py b/lab/show_platform.py new file mode 100644 index 00000000..76122d58 --- /dev/null +++ b/lab/show_platform.py @@ -0,0 +1,16 @@ +import platform +import types + +for n in dir(platform): + if n.startswith("_"): + continue + v = getattr(platform, n) + if isinstance(v, types.ModuleType): + continue + if callable(v): + try: + v = v() + n += "()" + except: + continue + print "%30s: %r" % (n, v) diff --git a/lab/show_pyc.py b/lab/show_pyc.py index d6bbd921..4eaa5131 100644 --- a/lab/show_pyc.py +++ b/lab/show_pyc.py @@ -1,12 +1,22 @@ -import dis, marshal, struct, sys, time, types +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +import binascii +import dis +import marshal +import struct +import sys +import time +import types + def show_pyc_file(fname): f = open(fname, "rb") magic = f.read(4) moddate = f.read(4) modtime = time.asctime(time.localtime(struct.unpack('<L', moddate)[0])) - print "magic %s" % (magic.encode('hex')) - print "moddate %s (%s)" % (moddate.encode('hex'), modtime) + print("magic %s" % (binascii.hexlify(magic))) + print("moddate %s (%s)" % (binascii.hexlify(moddate), modtime)) code = marshal.load(f) show_code(code) @@ -18,38 +28,68 @@ def show_py_text(text, fname="<string>"): code = compile(text, fname, "exec") show_code(code) -def show_code(code, indent=''): - print "%scode" % indent +CO_FLAGS = [ + ('CO_OPTIMIZED', 0x00001), + ('CO_NEWLOCALS', 0x00002), + ('CO_VARARGS', 0x00004), + ('CO_VARKEYWORDS', 0x00008), + ('CO_NESTED', 0x00010), + ('CO_GENERATOR', 0x00020), + ('CO_NOFREE', 0x00040), + ('CO_COROUTINE', 0x00080), + ('CO_ITERABLE_COROUTINE', 0x00100), + ('CO_GENERATOR_ALLOWED', 0x01000), + ('CO_FUTURE_DIVISION', 0x02000), + ('CO_FUTURE_ABSOLUTE_IMPORT', 0x04000), + ('CO_FUTURE_WITH_STATEMENT', 0x08000), + ('CO_FUTURE_PRINT_FUNCTION', 0x10000), + ('CO_FUTURE_UNICODE_LITERALS', 0x20000), + ('CO_FUTURE_BARRY_AS_BDFL', 0x40000), + ('CO_FUTURE_GENERATOR_STOP', 0x80000), +] + +def show_code(code, indent='', number=None): + label = "" + if number is not None: + label = "%d: " % number + print("%s%scode" % (indent, label)) indent += ' ' - print "%sargcount %d" % (indent, code.co_argcount) - print "%snlocals %d" % (indent, code.co_nlocals) - print "%sstacksize %d" % (indent, code.co_stacksize) - print "%sflags %04x" % (indent, code.co_flags) + print("%sname %r" % (indent, code.co_name)) + print("%sargcount %d" % (indent, code.co_argcount)) + print("%snlocals %d" % (indent, code.co_nlocals)) + print("%sstacksize %d" % (indent, code.co_stacksize)) + print("%sflags %04x: %s" % (indent, code.co_flags, flag_words(code.co_flags, CO_FLAGS))) show_hex("code", code.co_code, indent=indent) dis.disassemble(code) - print "%sconsts" % indent - for const in code.co_consts: + print("%sconsts" % indent) + for i, const in enumerate(code.co_consts): if type(const) == types.CodeType: - show_code(const, indent+' ') + show_code(const, indent+' ', number=i) else: - print " %s%r" % (indent, const) - print "%snames %r" % (indent, code.co_names) - print "%svarnames %r" % (indent, code.co_varnames) - print "%sfreevars %r" % (indent, code.co_freevars) - print "%scellvars %r" % (indent, code.co_cellvars) - print "%sfilename %r" % (indent, code.co_filename) - print "%sname %r" % (indent, code.co_name) - print "%sfirstlineno %d" % (indent, code.co_firstlineno) + print(" %s%d: %r" % (indent, i, const)) + print("%snames %r" % (indent, code.co_names)) + print("%svarnames %r" % (indent, code.co_varnames)) + print("%sfreevars %r" % (indent, code.co_freevars)) + print("%scellvars %r" % (indent, code.co_cellvars)) + print("%sfilename %r" % (indent, code.co_filename)) + print("%sfirstlineno %d" % (indent, code.co_firstlineno)) show_hex("lnotab", code.co_lnotab, indent=indent) def show_hex(label, h, indent): - h = h.encode('hex') + h = binascii.hexlify(h) if len(h) < 60: - print "%s%s %s" % (indent, label, h) + print("%s%s %s" % (indent, label, h.decode('ascii'))) else: - print "%s%s" % (indent, label) + print("%s%s" % (indent, label)) for i in range(0, len(h), 60): - print "%s %s" % (indent, h[i:i+60]) + print("%s %s" % (indent, h[i:i+60].decode('ascii'))) + +def flag_words(flags, flag_defs): + words = [] + for word, flag in flag_defs: + if flag & flags: + words.append(word) + return ", ".join(words) def show_file(fname): if fname.endswith('pyc'): @@ -57,7 +97,7 @@ def show_file(fname): elif fname.endswith('py'): show_py_file(fname) else: - print "Odd file:", fname + print("Odd file:", fname) def main(args): if args[0] == '-c': diff --git a/metacov.ini b/metacov.ini index 3bce01e2..a356cb7e 100644 --- a/metacov.ini +++ b/metacov.ini @@ -1,7 +1,10 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + # Settings to use when using coverage.py to measure itself. [run] branch = true -data_file = $COVERAGE_HOME/.metacov +data_file = $COVERAGE_METAFILE parallel = true source = $COVERAGE_HOME/coverage @@ -13,15 +16,14 @@ exclude_lines = # pragma: not covered # pragma: nested def __repr__ - if __name__ == .__main__.: raise AssertionError # pragma: debugging # pragma: only failure partial_branches = # pragma: part covered + if env.TESTING: -omit = mock.py ignore_errors = true precision = 1 @@ -30,3 +32,4 @@ source = . *\coverage\trunk */coverage/trunk + *\coveragepy @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + # lint Python modules using external checkers. # # This is the main checker controling the other ones and the reports @@ -76,7 +79,9 @@ disable= # Messages that are noisy for now, eventually maybe we'll turn them on: # C0103:256:coverage.morf_filename: Invalid name "f" (should match [a-z_][a-z0-9_]{2,30}$) # W0212: 86:Reporter.report_files: Access to a protected member _analyze of a client class - C0103,W0212 + C0103,W0212, + duplicate-code, + cyclic-import msg-template={path}:{line}: {msg} ({symbol}) @@ -294,7 +299,7 @@ int-import-graph= [FORMAT] # Maximum number of characters on a single line. -max-line-length=80 +max-line-length=100 # Maximum number of lines in a module max-module-lines=10000 diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index ab84656b..00000000 --- a/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -# PyPI requirements for running tests for coverage.py -nose -mock -pylint -tox >= 1.9 diff --git a/requirements/dev.pip b/requirements/dev.pip new file mode 100644 index 00000000..703bfc7e --- /dev/null +++ b/requirements/dev.pip @@ -0,0 +1,20 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +# Requirements for doing local development work on coverage.py. +# https://requires.io/github/nedbat/coveragepy/requirements/ + +# PyPI requirements for running tests. +nose==1.3.7 +-r tox.pip + +# for linting. +greenlet==0.4.9 +mock==1.3.0 +PyContracts==1.7.9 +pyenchant==1.6.6 +pylint==1.4.4 + +# for kitting. +requests==2.8.1 +twine==1.6.4 diff --git a/requirements/tox.pip b/requirements/tox.pip new file mode 100644 index 00000000..0bfd695f --- /dev/null +++ b/requirements/tox.pip @@ -0,0 +1,2 @@ +# The version of tox used by coverage.py +tox==2.2.1 diff --git a/requirements/wheel.pip b/requirements/wheel.pip new file mode 100644 index 00000000..268fe23f --- /dev/null +++ b/requirements/wheel.pip @@ -0,0 +1,3 @@ +# Things needed to make wheels for coverage.py +setuptools==18.6.1 +wheel==0.26.0 @@ -1,115 +1,99 @@ -# setup.py for coverage.py +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt -"""Code coverage measurement for Python +"""Code coverage measurement 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. - -Coverage.py runs on CPython 2.6, 2.7, 3.3, 3.4 or 3.5, PyPy 2.4, and PyPy3 2.4. - -Documentation is at `nedbatchelder.com <%s>`_. Code repository and issue -tracker are on `Bitbucket <http://bitbucket.org/ned/coveragepy>`_, with a -mirrored repo on `GitHub <https://github.com/nedbat/coveragepy>`_. - -New in 4.0 alpha: ``--concurrency``, dropped support for older Pythons, -setup.cfg support, plugins for other file variants, --skip-covered, HTML -filtering. - -New in 3.7: ``--debug``, and 12 bugs closed. - -New in 3.6: ``--fail-under``, and >20 bugs closed. - -New in 3.5: Branch coverage exclusions, keyboard shortcuts in HTML report. - -New in 3.4: Better control over source to measure, and unexecuted files -can be reported. +# Distutils setup for coverage.py +# This file is used unchanged under all versions of Python, 2.x and 3.x. -New in 3.3: .coveragerc files. +import os +import sys -New in 3.2: Branch coverage! -""" +from setuptools import setup +from distutils.core import Extension # pylint: disable=no-name-in-module, import-error +from distutils.command.build_ext import build_ext # pylint: disable=no-name-in-module, import-error +from distutils import errors # pylint: disable=no-name-in-module -# This file is used unchanged under all versions of Python, 2.x and 3.x. +# Get or massage our metadata. We exec coverage/version.py so we can avoid +# importing the product code into setup.py. classifiers = """\ Environment :: Console Intended Audience :: Developers -License :: OSI Approved :: BSD License +License :: OSI Approved :: Apache Software License Operating System :: OS Independent -Programming Language :: Python :: 2 -Programming Language :: Python :: 3 +Programming Language :: Python :: 2.6 +Programming Language :: Python :: 2.7 +Programming Language :: Python :: 3.3 +Programming Language :: Python :: 3.4 +Programming Language :: Python :: 3.5 +Programming Language :: Python :: Implementation :: CPython +Programming Language :: Python :: Implementation :: PyPy Topic :: Software Development :: Quality Assurance Topic :: Software Development :: Testing """ -# Pull in the tools we need. -import os, sys - -from setuptools import setup -from distutils.core import Extension # pylint: disable=no-name-in-module,import-error -from distutils.command.build_ext import build_ext # pylint: disable=no-name-in-module, import-error -from distutils import errors # pylint: disable=no-name-in-module - -# Get or massage our metadata. We exec coverage/version.py so we can avoid -# importing the product code into setup.py. - -doc = __doc__ # __doc__ will be overwritten by version.py. -__version__ = __url__ = "" # Keep pylint happy. - cov_ver_py = os.path.join(os.path.split(__file__)[0], "coverage/version.py") with open(cov_ver_py) as version_file: + # __doc__ will be overwritten by version.py. + doc = __doc__ + # Keep pylint happy. + __version__ = __url__ = version_info = "" + # Execute the code in version.py. exec(compile(version_file.read(), cov_ver_py, 'exec')) -doclines = (doc % __url__).splitlines() +with open("README.rst") as readme: + long_description = readme.read().replace("http://coverage.readthedocs.org", __url__) + classifier_list = classifiers.splitlines() -if 'a' in __version__: +if version_info[3] == 'alpha': devstat = "3 - Alpha" -elif 'b' in __version__: +elif version_info[3] in ['beta', 'candidate']: devstat = "4 - Beta" else: + assert version_info[3] == 'final' devstat = "5 - Production/Stable" classifier_list.append("Development Status :: " + devstat) -# Install a script as "coverage", and as "coverage[23]", and as -# "coverage-2.7" (or whatever). -scripts = [ - 'coverage = coverage:main', - 'coverage%d = coverage:main' % sys.version_info[:1], - 'coverage-%d.%d = coverage:main' % sys.version_info[:2], - ] - # Create the keyword arguments for setup() setup_args = dict( - name = 'coverage', - version = __version__, + name='coverage', + version=__version__, - packages = [ + packages=[ 'coverage', - ], + ], - package_data = { + package_data={ 'coverage': [ 'htmlfiles/*.*', - ] - }, - - entry_points = {'console_scripts': scripts}, - - # 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:]), - keywords = 'code coverage testing', - license = 'BSD', - classifiers = classifier_list, - url = __url__, - ) + ] + }, + + entry_points={ + # Install a script as "coverage", and as "coverage[23]", and as + # "coverage-2.7" (or whatever). + 'console_scripts': [ + 'coverage = coverage.cmdline:main', + 'coverage%d = coverage.cmdline:main' % sys.version_info[:1], + 'coverage-%d.%d = coverage.cmdline:main' % sys.version_info[:2], + ], + }, + + # We need to get HTML assets from our htmlfiles directory. + zip_safe=False, + + author='Ned Batchelder and others', + author_email='ned@nedbatchelder.com', + description=doc, + long_description=long_description, + keywords='code coverage testing', + license='Apache 2.0', + classifiers=classifier_list, + url=__url__, +) # A replacement for the build_ext command which raises a single exception # if the build fails, so we can fallback nicely. @@ -124,11 +108,13 @@ if sys.platform == 'win32': # find the compiler ext_errors += (IOError,) + class BuildFailed(Exception): """Raise this to indicate the C extension wouldn't build.""" def __init__(self): Exception.__init__(self) - self.cause = sys.exc_info()[1] # work around py 2/3 different syntax + self.cause = sys.exc_info()[1] # work around py 2/3 different syntax + class ve_build_ext(build_ext): """Build C extensions, but fail with a straightforward exception.""" @@ -143,14 +129,14 @@ class ve_build_ext(build_ext): def build_extension(self, ext): """Wrap `build_extension` with `BuildFailed`.""" try: - # Uncomment to test compile failures: + # Uncomment to test compile failure handling: # raise errors.CCompilerError("OOPS") build_ext.build_extension(self, ext) except ext_errors: raise BuildFailed() except ValueError as err: # this can happen on Windows 64 bit, see Python issue 7511 - if "'path'" in str(err): # works with both py 2/3 + if "'path'" in str(err): # works with both py 2/3 raise BuildFailed() raise @@ -169,20 +155,29 @@ if '__pypy__' in sys.builtin_module_names: if compile_extension: setup_args.update(dict( - ext_modules = [ - Extension("coverage.tracer", sources=["coverage/tracer.c"]) - ], - cmdclass = { + ext_modules=[ + Extension( + "coverage.tracer", + sources=[ + "coverage/ctracer/datastack.c", + "coverage/ctracer/filedisp.c", + "coverage/ctracer/module.c", + "coverage/ctracer/tracer.c", + ], + ), + ], + cmdclass={ 'build_ext': ve_build_ext, - }, - )) + }, + )) # Py3.x-specific details. if sys.version_info >= (3, 0): setup_args.update(dict( - use_2to3 = False, - )) + use_2to3=False, + )) + def main(): """Actually invoke setup() with the arguments we built above.""" diff --git a/test_old.sh b/test_old.sh deleted file mode 100644 index 72c3b35c..00000000 --- a/test_old.sh +++ /dev/null @@ -1,8 +0,0 @@ -# Steps to prepare and run coverage.py tests, for Pythons < 2.5 -# This should do the same steps as tox.ini -easy_install nose==1.2.1 mock==0.6.0 -python setup.py --quiet clean develop -python igor.py zip_mods install_egg remove_extension -python igor.py test_with_tracer py -python setup.py --quiet build_ext --inplace -python igor.py test_with_tracer c diff --git a/tests/backtest.py b/tests/backtest.py index 50834721..827e891f 100644 --- a/tests/backtest.py +++ b/tests/backtest.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Add things to old Pythons so I can pretend they are newer, for tests.""" # pylint: disable=redefined-builtin diff --git a/tests/coveragetest.py b/tests/coveragetest.py index 1623ef99..3468b794 100644 --- a/tests/coveragetest.py +++ b/tests/coveragetest.py @@ -1,5 +1,9 @@ -"""Base test case class for coverage testing.""" +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt +"""Base test case class for coverage.py testing.""" + +import contextlib import datetime import glob import os @@ -11,8 +15,9 @@ import sys import coverage from coverage.backunittest import TestCase -from coverage.backward import StringIO, import_local_file, string_class -from coverage.control import _TEST_NAME_FILE +from coverage.backward import StringIO, import_local_file, string_class, shlex_quote +from coverage.cmdline import CoverageScript +from coverage.debug import _TEST_NAME_FILE, DebugControl from coverage.test_helpers import ( EnvironmentAwareMixin, StdStreamCapturingMixin, TempDirMixin, ) @@ -32,7 +37,7 @@ class CoverageTest( TempDirMixin, TestCase ): - """A base class for Coverage test cases.""" + """A base class for coverage.py test cases.""" # Standard unittest setting: show me diffs even if they are very long. maxDiff = None @@ -43,6 +48,11 @@ class CoverageTest( def setUp(self): super(CoverageTest, self).setUp() + # Attributes for getting info about what happened. + self.last_command_status = None + self.last_command_output = None + self.last_module_name = None + if _TEST_NAME_FILE: # pragma: debugging with open(_TEST_NAME_FILE, "w") as f: f.write("%s_%s" % ( @@ -71,20 +81,22 @@ class CoverageTest( if os.path.exists("__pycache__"): shutil.rmtree("__pycache__") - def import_local_file(self, modname): + def import_local_file(self, modname, modfile=None): """Import a local file as a module. Opens a file in the current directory named `modname`.py, imports it - as `modname`, and returns the module object. + as `modname`, and returns the module object. `modfile` is the file to + import if it isn't in the current directory. """ - return import_local_file(modname) + return import_local_file(modname, modfile) - def start_import_stop(self, cov, modname): + def start_import_stop(self, cov, modname, modfile=None): """Start coverage, import a file, then stop coverage. `cov` is started and stopped, with an `import_local_file` of - `modname` in the middle. + `modname` in the middle. `modfile` is the file to import as `modname` + if it isn't in the current directory. The imported module is returned. @@ -92,21 +104,22 @@ class CoverageTest( cov.start() try: # pragma: nested # Import the Python file, executing it. - mod = self.import_local_file(modname) + mod = self.import_local_file(modname, modfile) finally: # pragma: nested - # Stop Coverage. + # Stop coverage.py. cov.stop() return mod def get_module_name(self): - """Return the module name to use for this test run.""" - return 'coverage_test_' + str(random.random())[2:] + """Return a random module name to use for this test run.""" + self.last_module_name = 'coverage_test_' + str(random.random())[2:] + return self.last_module_name # 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, ord(c) - ord('0')) for c in '123456789')) _arcz_map.update(dict( - (c, 10+ord(c)-ord('A')) for c in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + (c, 10 + ord(c) - ord('A')) for c in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' )) def arcz_to_arcs(self, arcz): @@ -137,7 +150,7 @@ class CoverageTest( assert pair[1] == '-' a, _, b = pair bsgn = -1 - arcs.append((asgn*self._arcz_map[a], bsgn*self._arcz_map[b])) + arcs.append((asgn * self._arcz_map[a], bsgn * self._arcz_map[b])) return sorted(arcs) def assert_equal_args(self, a1, a2, msg=None): @@ -171,10 +184,10 @@ class CoverageTest( """ # We write the code into a file so that we can import it. - # Coverage wants to deal with things as modules with file names. + # Coverage.py wants to deal with things as modules with file names. modname = self.get_module_name() - self.make_file(modname+".py", text) + self.make_file(modname + ".py", text) if arcs is None and arcz is not None: arcs = self.arcz_to_arcs(arcz) @@ -182,9 +195,10 @@ class CoverageTest( arcs_missing = self.arcz_to_arcs(arcz_missing) if arcs_unpredicted is None and arcz_unpredicted is not None: arcs_unpredicted = self.arcz_to_arcs(arcz_unpredicted) + branch = any(x is not None for x in [arcs, arcs_missing, arcs_unpredicted]) - # Start up Coverage. - cov = coverage.coverage(branch=(arcs_missing is not None)) + # Start up coverage.py. + cov = coverage.Coverage(branch=branch) cov.erase() for exc in excludes or []: cov.exclude(exc) @@ -211,9 +225,7 @@ class CoverageTest( if statements == line_list: break else: - self.fail( - "None of the lines choices matched %r" % statements - ) + self.fail("None of the lines choices matched %r" % statements) missing_formatted = analysis.missing_formatted() if isinstance(missing, string_class): @@ -223,27 +235,22 @@ class CoverageTest( if missing_formatted == missing_list: break else: - self.fail( - "None of the missing choices matched %r" % - missing_formatted - ) + self.fail("None of the missing choices matched %r" % missing_formatted) if arcs is not None: - self.assert_equal_args( - analysis.arc_possibilities(), arcs, "Possible arcs differ" - ) + self.assert_equal_args(analysis.arc_possibilities(), arcs, "Possible arcs differ") if arcs_missing is not None: self.assert_equal_args( analysis.arcs_missing(), arcs_missing, "Missing arcs differ" - ) + ) if arcs_unpredicted is not None: self.assert_equal_args( analysis.arcs_unpredicted(), arcs_unpredicted, "Unpredicted arcs differ" - ) + ) if report: frep = StringIO() @@ -253,8 +260,32 @@ class CoverageTest( return cov + @contextlib.contextmanager + def assert_warnings(self, cov, warnings): + """A context manager to check that particular warnings happened in `cov`.""" + saved_warnings = [] + def capture_warning(msg): + """A fake implementation of Coverage._warn, to capture warnings.""" + saved_warnings.append(msg) + + original_warn = cov._warn + cov._warn = capture_warning + + try: + yield + except: + raise + else: + for warning_regex in warnings: + for saved in saved_warnings: + if re.search(warning_regex, saved): + break + else: + self.fail("Didn't find warning %r in %r" % (warning_regex, saved_warnings)) + cov._warn = original_warn + def nice_file(self, *fparts): - """Canonicalize the filename composed of the parts in `fparts`.""" + """Canonicalize the file name composed of the parts in `fparts`.""" fname = os.path.join(*fparts) return os.path.normcase(os.path.abspath(os.path.realpath(fname))) @@ -299,29 +330,52 @@ class CoverageTest( Returns None. """ - script = coverage.CoverageScript(_covpkg=_covpkg) + script = CoverageScript(_covpkg=_covpkg) ret_actual = script.command_line(shlex.split(args)) self.assertEqual(ret_actual, ret) + coverage_command = "coverage" + def run_command(self, cmd): - """Run the command-line `cmd` in a sub-process, and print its output. + """Run the command-line `cmd` in a sub-process. + + `cmd` is the command line to invoke in a sub-process. Returns the + combined content of `stdout` and `stderr` output streams from the + sub-process. Use this when you need to test the process behavior of coverage. Compare with `command_line`. - Returns the process' stdout text. + Handles the following command name specially: + + * "python" is replaced with the command name of the current + Python interpreter. + + * "coverage" is replaced with the command name for the main + Coverage.py program. """ - # Running Python sub-processes can be tricky. Use the real name of our - # own executable. So "python foo.py" might get executed as - # "python3.3 foo.py". This is important because Python 3.x doesn't - # install as "python", so you might get a Python 2 executable instead - # if you don't use the executable's basename. - if cmd.startswith("python "): - cmd = os.path.basename(sys.executable) + cmd[6:] - - _, output = self.run_command_status(cmd) + split_commandline = cmd.split(" ", 1) + command_name = split_commandline[0] + command_args = split_commandline[1:] + + if command_name == "python": + # Running a Python interpreter in a sub-processes can be tricky. + # Use the real name of our own executable. So "python foo.py" might + # get executed as "python3.3 foo.py". This is important because + # Python 3.x doesn't install as "python", so you might get a Python + # 2 executable instead if you don't use the executable's basename. + command_name = os.path.basename(sys.executable) + + if command_name == "coverage": + # The invocation requests the Coverage.py program. Substitute the + # actual Coverage.py main command name. + command_name = self.coverage_command + + full_commandline = " ".join([shlex_quote(command_name)] + command_args) + + _, output = self.run_command_status(full_commandline) return output def run_command_status(self, cmd): @@ -331,7 +385,8 @@ class CoverageTest( Compare with `command_line`. - Returns a pair: the process' exit status and stdout text. + Returns a pair: the process' exit status and stdout text, which are + also stored as self.last_command_status and self.last_command_output. """ # Add our test modules directory to PYTHONPATH. I'm sure there's too @@ -345,9 +400,9 @@ class CoverageTest( pypath += testmods + os.pathsep + zipfile self.set_environ('PYTHONPATH', pypath) - status, output = run_command(cmd) - print(output) - return status, output + self.last_command_status, self.last_command_output = run_command(cmd) + print(self.last_command_output) + return self.last_command_status, self.last_command_output def report_from_command(self, cmd): """Return the report from the `cmd`, with some convenience added.""" @@ -373,3 +428,13 @@ class CoverageTest( def last_line_squeezed(self, report): """Return the last line of `report` with the spaces squeezed down.""" return self.squeezed_lines(report)[-1] + + +class DebugControlString(DebugControl): + """A `DebugControl` that writes to a StringIO, for testing.""" + def __init__(self, options): + super(DebugControlString, self).__init__(options, StringIO()) + + def get_output(self): + """Get the output text from the `DebugControl`.""" + return self.output.getvalue() diff --git a/tests/covmodzip1.py b/tests/covmodzip1.py index 3ec4cdc4..6f135dd6 100644 --- a/tests/covmodzip1.py +++ b/tests/covmodzip1.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """covmodzip.py: for putting into a zip file.""" j = 1 j += 1 diff --git a/tests/eggsrc/egg1/egg1.py b/tests/eggsrc/egg1/egg1.py index 3fadde33..72600808 100644 --- a/tests/eggsrc/egg1/egg1.py +++ b/tests/eggsrc/egg1/egg1.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + # My egg file! walrus = "Eggman" diff --git a/tests/eggsrc/setup.py b/tests/eggsrc/setup.py index f9b8b9d0..c935798d 100644 --- a/tests/eggsrc/setup.py +++ b/tests/eggsrc/setup.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + from setuptools import setup setup( diff --git a/tests/farm/annotate/annotate_dir.py b/tests/farm/annotate/annotate_dir.py index 86c18cab..3bb2dbe7 100644 --- a/tests/farm/annotate/annotate_dir.py +++ b/tests/farm/annotate/annotate_dir.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + copy("src", "run") run(""" coverage run multi.py diff --git a/tests/farm/annotate/gold/white.py,cover b/tests/farm/annotate/gold/white.py,cover index 36b0b993..fc163226 100644 --- a/tests/farm/annotate/gold/white.py,cover +++ b/tests/farm/annotate/gold/white.py,cover @@ -1,3 +1,6 @@ + # Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 + # For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + # A test case sent to me by Steve White > def f(self): diff --git a/tests/farm/annotate/gold_anno_dir/a_a.py,cover b/tests/farm/annotate/gold_anno_dir/a_a.py,cover index d0ff3c0c..4729cfbb 100644 --- a/tests/farm/annotate/gold_anno_dir/a_a.py,cover +++ b/tests/farm/annotate/gold_anno_dir/a_a.py,cover @@ -1,3 +1,6 @@ + # Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 + # For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + > def a(x): > if x == 1: > print("x is 1") diff --git a/tests/farm/annotate/gold_anno_dir/b_b.py,cover b/tests/farm/annotate/gold_anno_dir/b_b.py,cover index 90d076f1..228715f0 100644 --- a/tests/farm/annotate/gold_anno_dir/b_b.py,cover +++ b/tests/farm/annotate/gold_anno_dir/b_b.py,cover @@ -1,3 +1,6 @@ + # Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 + # For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + > def b(x): > msg = "x is %s" % x > print(msg) diff --git a/tests/farm/annotate/gold_anno_dir/multi.py,cover b/tests/farm/annotate/gold_anno_dir/multi.py,cover index 2a5c59ce..90a13c91 100644 --- a/tests/farm/annotate/gold_anno_dir/multi.py,cover +++ b/tests/farm/annotate/gold_anno_dir/multi.py,cover @@ -1,3 +1,6 @@ + # Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 + # For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + > import a.a > import b.b diff --git a/tests/farm/annotate/gold_encodings/utf8.py,cover b/tests/farm/annotate/gold_encodings/utf8.py,cover index 6dbf7e0d..3ef31e0f 100644 --- a/tests/farm/annotate/gold_encodings/utf8.py,cover +++ b/tests/farm/annotate/gold_encodings/utf8.py,cover @@ -1,4 +1,7 @@ # -*- coding: utf-8 -*- + # Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 + # For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + # This comment has an accent: é > print("spam eggs") diff --git a/tests/farm/annotate/gold_multi/a/a.py,cover b/tests/farm/annotate/gold_multi/a/a.py,cover index fb3f5435..e5e97226 100644 --- a/tests/farm/annotate/gold_multi/a/a.py,cover +++ b/tests/farm/annotate/gold_multi/a/a.py,cover @@ -1,3 +1,6 @@ + # Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 + # For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + > def a(x): > if x == 1: > print "x is 1" diff --git a/tests/farm/annotate/gold_multi/b/b.py,cover b/tests/farm/annotate/gold_multi/b/b.py,cover index a3f5daec..26b25548 100644 --- a/tests/farm/annotate/gold_multi/b/b.py,cover +++ b/tests/farm/annotate/gold_multi/b/b.py,cover @@ -1,2 +1,5 @@ + # Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 + # For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + > def b(x): > print "x is %s" % x diff --git a/tests/farm/annotate/gold_multi/multi.py,cover b/tests/farm/annotate/gold_multi/multi.py,cover index 2a5c59ce..90a13c91 100644 --- a/tests/farm/annotate/gold_multi/multi.py,cover +++ b/tests/farm/annotate/gold_multi/multi.py,cover @@ -1,3 +1,6 @@ + # Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 + # For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + > import a.a > import b.b diff --git a/tests/farm/annotate/gold_v24/white.py,cover b/tests/farm/annotate/gold_v24/white.py,cover deleted file mode 100644 index bbd8d428..00000000 --- a/tests/farm/annotate/gold_v24/white.py,cover +++ /dev/null @@ -1,33 +0,0 @@ - # A test case sent to me by Steve White - -> def f(self): -! if self==1: -! pass -! elif self.m('fred'): -! pass -! elif (g==1) and (b==2): -! pass -! elif self.m('fred')==True: -! pass -! elif ((g==1) and (b==2))==True: -! pass -> else: -! pass - -> def g(x): -> if x == 1: -> a = 1 -! else: -! a = 2 - -> g(1) - -> def h(x): -- if 0: #pragma: no cover -- pass -> if x == 1: -! a = 1 -> else: -> a = 2 - -> h(2) diff --git a/tests/farm/annotate/run.py b/tests/farm/annotate/run.py index 236f401f..33e5f671 100644 --- a/tests/farm/annotate/run.py +++ b/tests/farm/annotate/run.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + copy("src", "out") run(""" coverage run white.py diff --git a/tests/farm/annotate/run_encodings.py b/tests/farm/annotate/run_encodings.py index eb1a3a9a..527cd88f 100644 --- a/tests/farm/annotate/run_encodings.py +++ b/tests/farm/annotate/run_encodings.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + copy("src", "out") run(""" coverage run utf8.py diff --git a/tests/farm/annotate/run_multi.py b/tests/farm/annotate/run_multi.py index ef1e8238..4646293e 100644 --- a/tests/farm/annotate/run_multi.py +++ b/tests/farm/annotate/run_multi.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + copy("src", "out_multi") run(""" coverage run multi.py diff --git a/tests/farm/annotate/src/a/a.py b/tests/farm/annotate/src/a/a.py index c2583d1e..e3e6631d 100644 --- a/tests/farm/annotate/src/a/a.py +++ b/tests/farm/annotate/src/a/a.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + def a(x): if x == 1: print("x is 1") diff --git a/tests/farm/annotate/src/b/b.py b/tests/farm/annotate/src/b/b.py index 625a5490..b31d8c95 100644 --- a/tests/farm/annotate/src/b/b.py +++ b/tests/farm/annotate/src/b/b.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + def b(x): msg = "x is %s" % x print(msg) diff --git a/tests/farm/annotate/src/multi.py b/tests/farm/annotate/src/multi.py index 19a6200c..bf8cfd5f 100644 --- a/tests/farm/annotate/src/multi.py +++ b/tests/farm/annotate/src/multi.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + import a.a import b.b diff --git a/tests/farm/annotate/src/utf8.py b/tests/farm/annotate/src/utf8.py index 27342d87..fd43b2ab 100644 --- a/tests/farm/annotate/src/utf8.py +++ b/tests/farm/annotate/src/utf8.py @@ -1,4 +1,7 @@ # -*- coding: utf-8 -*- +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + # This comment has an accent: é print("spam eggs") diff --git a/tests/farm/annotate/src/white.py b/tests/farm/annotate/src/white.py index ecbbd25a..21e8a627 100644 --- a/tests/farm/annotate/src/white.py +++ b/tests/farm/annotate/src/white.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + # A test case sent to me by Steve White def f(self): diff --git a/tests/farm/html/gold_a/a_py.html b/tests/farm/html/gold_a/a_py.html index 03c1fc95..e52b303e 100644 --- a/tests/farm/html/gold_a/a_py.html +++ b/tests/farm/html/gold_a/a_py.html @@ -1,96 +1,106 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <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'> + <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" /> + <title>Coverage for a.py: 67%</title> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.pyfile_ready); </script> </head> -<body class='pyfile'> +<body class="pyfile"> -<div id='header'> - <div class='content'> - <h1>Coverage for <b>a</b> : - <span class='pc_cov'>67%</span> +<div id="header"> + <div class="content"> + <h1>Coverage for <b>a.py</b> : + <span class="pc_cov">67%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> - <h2 class='stats'> + <h2 class="stats"> 3 statements - <span class='run hide_run shortkey_r button_toggle_run'>2 run</span> - <span class='mis shortkey_m button_toggle_mis'>1 missing</span> - <span class='exc shortkey_x button_toggle_exc'>0 excluded</span> + <span class="run hide_run shortkey_r button_toggle_run">2 run</span> + <span class="mis shortkey_m button_toggle_mis">1 missing</span> + <span class="exc shortkey_x button_toggle_exc">0 excluded</span> </h2> </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> -<p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk </p> </div> </div> -<div id='source'> +<div id="source"> <table> <tr> - <td class='linenos'> -<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 class="linenos"> +<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="pln"><a href="#n4">4</a></p> +<p id="n5" class="pln"><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="pln"><a href="#n9">9</a></p> +<p id="n10" class="stm mis"><a href="#n10">10</a></p> </td> - <td class='text'> -<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 class="text"> +<p id="t1" class="pln"><span class="com"># Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0</span><span class="strut"> </span></p> +<p id="t2" class="pln"><span class="com"># For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt</span><span class="strut"> </span></p> +<p id="t3" class="pln"><span class="strut"> </span></p> +<p id="t4" class="pln"><span class="com"># A test file for HTML reporting by coverage.py.</span><span class="strut"> </span></p> +<p id="t5" class="pln"><span class="strut"> </span></p> +<p id="t6" 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="t7" class="pln"> <span class="com"># Needed a < to look at HTML entities.</span><span class="strut"> </span></p> +<p id="t8" 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="t9" class="pln"><span class="key">else</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t10" 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'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="index.html">« index</a> <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:04 </p> </div> </div> diff --git a/tests/farm/html/gold_a/index.html b/tests/farm/html/gold_a/index.html index 4a79fc57..4f462fe7 100644 --- a/tests/farm/html/gold_a/index.html +++ b/tests/farm/html/gold_a/index.html @@ -1,28 +1,31 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Coverage report</title> - <link rel='stylesheet' href='style.css' type='text/css'> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.debounce.min.js'></script> - <script type='text/javascript' src='jquery.tablesorter.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.debounce.min.js"></script> + <script type="text/javascript" src="jquery.tablesorter.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.index_ready); </script> </head> -<body class='indexfile'> +<body class="indexfile"> -<div id='header'> - <div class='content'> +<div id="header"> + <div class="content"> <h1>Coverage report: - <span class='pc_cov'>67%</span> + <span class="pc_cov">67%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> <form id="filter_container"> <input id="filter" type="text" value="" placeholder="filter..." /> @@ -30,54 +33,54 @@ </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> - <p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> + <p class="legend">Hot-keys on this page</p> <div> - <p class='keyhelp'> - <span class='key'>n</span> - <span class='key'>s</span> - <span class='key'>m</span> - <span class='key'>x</span> + <p class="keyhelp"> + <span class="key">n</span> + <span class="key">s</span> + <span class="key">m</span> + <span class="key">x</span> - <span class='key'>c</span> change column sorting + <span class="key">c</span> change column sorting </p> </div> </div> -<div id='index'> - <table class='index'> +<div id="index"> + <table class="index"> <thead> - <tr class='tablehead' title='Click to sort'> - <th class='name left headerSortDown shortkey_n'>Module</th> - <th class='shortkey_s'>statements</th> - <th class='shortkey_m'>missing</th> - <th class='shortkey_x'>excluded</th> + <tr class="tablehead" title="Click to sort"> + <th class="name left headerSortDown shortkey_n">Module</th> + <th class="shortkey_s">statements</th> + <th class="shortkey_m">missing</th> + <th class="shortkey_x">excluded</th> - <th class='right shortkey_c'>coverage</th> + <th class="right shortkey_c">coverage</th> </tr> </thead> <tfoot> - <tr class='total'> - <td class='name left'>Total</td> + <tr class="total"> + <td class="name left">Total</td> <td>3</td> <td>1</td> <td>0</td> - <td class='right' data-ratio='2 3'>67%</td> + <td class="right" data-ratio="2 3">67%</td> </tr> </tfoot> <tbody> - <tr class='file'> - <td class='name left'><a href='a.html'>a</a></td> + <tr class="file"> + <td class="name left"><a href="a_py.html">a.py</a></td> <td>3</td> <td>1</td> <td>0</td> - <td class='right' data-ratio='2 3'>67%</td> + <td class="right" data-ratio="2 3">67%</td> </tr> </tbody> @@ -88,10 +91,11 @@ </p> </div> -<div id='footer'> - <div class='content'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:31 </p> </div> </div> diff --git a/tests/farm/html/gold_b_branch/b_py.html b/tests/farm/html/gold_b_branch/b_py.html index 15b06661..4ee9e1c4 100644 --- a/tests/farm/html/gold_b_branch/b_py.html +++ b/tests/farm/html/gold_b_branch/b_py.html @@ -1,142 +1,152 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> - <meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' /> - <title>Coverage for b: 70%</title> - <link rel='stylesheet' href='style.css' type='text/css'> + <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" /> + <title>Coverage for b.py: 70%</title> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.pyfile_ready); </script> </head> -<body class='pyfile'> +<body class="pyfile"> -<div id='header'> - <div class='content'> - <h1>Coverage for <b>b</b> : - <span class='pc_cov'>70%</span> +<div id="header"> + <div class="content"> + <h1>Coverage for <b>b.py</b> : + <span class="pc_cov">70%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> - <h2 class='stats'> + <h2 class="stats"> 17 statements - <span class='run hide_run shortkey_r button_toggle_run'>14 run</span> - <span class='mis shortkey_m button_toggle_mis'>3 missing</span> - <span class='exc shortkey_x button_toggle_exc'>0 excluded</span> + <span class="run hide_run shortkey_r button_toggle_run">14 run</span> + <span class="mis shortkey_m button_toggle_mis">3 missing</span> + <span class="exc shortkey_x button_toggle_exc">0 excluded</span> - <span class='par run hide_run shortkey_p button_toggle_par'>4 partial</span> + <span class="par run hide_run shortkey_p button_toggle_par">4 partial</span> </h2> </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> -<p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk </p> </div> </div> -<div id='source'> +<div id="source"> <table> <tr> - <td class='linenos'> -<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='stm run hide_run'><a href='#n20'>20</a></p> -<p id='n21' class='pln'><a href='#n21'>21</a></p> -<p id='n22' class='stm par run hide_run'><a href='#n22'>22</a></p> -<p id='n23' class='stm mis'><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='stm run hide_run'><a href='#n27'>27</a></p> -<p id='n28' class='pln'><a href='#n28'>28</a></p> -<p id='n29' class='stm run hide_run'><a href='#n29'>29</a></p> + <td class="linenos"> +<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="pln"><a href="#n4">4</a></p> +<p id="n5" class="pln"><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 par 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="pln"><a href="#n10">10</a></p> +<p id="n11" class="stm mis"><a href="#n11">11</a></p> +<p id="n12" class="pln"><a href="#n12">12</a></p> +<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p> +<p id="n14" class="pln"><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 par run hide_run"><a href="#n17">17</a></p> +<p id="n18" class="stm run hide_run"><a href="#n18">18</a></p> +<p id="n19" class="pln"><a href="#n19">19</a></p> +<p id="n20" class="stm run hide_run"><a href="#n20">20</a></p> +<p id="n21" class="pln"><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 par run hide_run"><a href="#n25">25</a></p> +<p id="n26" class="stm mis"><a href="#n26">26</a></p> +<p id="n27" class="pln"><a href="#n27">27</a></p> +<p id="n28" class="stm mis"><a href="#n28">28</a></p> +<p id="n29" class="stm run hide_run"><a href="#n29">29</a></p> +<p id="n30" class="stm run hide_run"><a href="#n30">30</a></p> +<p id="n31" class="pln"><a href="#n31">31</a></p> +<p id="n32" class="stm run hide_run"><a href="#n32">32</a></p> </td> - <td class='text'> -<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</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t20' class='stm run hide_run'> <span class='key'>try</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t21' class='pln'> <span class='com'># This if has two branches, *neither* one taken.</span><span class='strut'> </span></p> -<p id='t22' class='stm par run hide_run'><span class='annotate' title='no jumps to these line numbers'>23 25</span> <span class='key'>if</span> <span class='nam'>name_error_this_variable_doesnt_exist</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t23' class='stm mis'> <span class='nam'>a</span> <span class='op'>=</span> <span class='num'>1</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='nam'>a</span> <span class='op'>=</span> <span class='num'>2</span><span class='strut'> </span></p> -<p id='t26' class='stm run hide_run'> <span class='key'>except</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t27' class='stm run hide_run'> <span class='key'>pass</span><span class='strut'> </span></p> -<p id='t28' class='pln'><span class='strut'> </span></p> -<p id='t29' class='stm run hide_run'><span class='nam'>three</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p> + <td class="text"> +<p id="t1" class="pln"><span class="com"># Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0</span><span class="strut"> </span></p> +<p id="t2" class="pln"><span class="com"># For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt</span><span class="strut"> </span></p> +<p id="t3" class="pln"><span class="strut"> </span></p> +<p id="t4" class="pln"><span class="com"># A test file for HTML reporting by coverage.py.</span><span class="strut"> </span></p> +<p id="t5" class="pln"><span class="strut"> </span></p> +<p id="t6" 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="t7" class="pln"> <span class="com"># This will be a branch that misses the else.</span><span class="strut"> </span></p> +<p id="t8" class="stm par run hide_run"><span class="annotate" title="no jump to this line number">11</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="t9" 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="t10" class="pln"> <span class="key">else</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t11" class="stm mis"> <span class="nam">a</span> <span class="op">=</span> <span class="num">4</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="nam">one</span><span class="op">(</span><span class="num">1</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t14" class="pln"><span class="strut"> </span></p> +<p id="t15" 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="t16" class="pln"> <span class="com"># A missed else that branches to "exit"</span><span class="strut"> </span></p> +<p id="t17" 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="t18" 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="t19" class="pln"><span class="strut"> </span></p> +<p id="t20" 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="t21" class="pln"><span class="strut"> </span></p> +<p id="t22" class="stm run hide_run"><span class="key">def</span> <span class="nam">three</span><span class="op">(</span><span class="op">)</span><span class="op">:</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="pln"> <span class="com"># This if has two branches, *neither* one taken.</span><span class="strut"> </span></p> +<p id="t25" class="stm par run hide_run"><span class="annotate" title="no jumps to these line numbers">26 28</span> <span class="key">if</span> <span class="nam">name_error_this_variable_doesnt_exist</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t26" class="stm mis"> <span class="nam">a</span> <span class="op">=</span> <span class="num">1</span><span class="strut"> </span></p> +<p id="t27" class="pln"> <span class="key">else</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t28" class="stm mis"> <span class="nam">a</span> <span class="op">=</span> <span class="num">2</span><span class="strut"> </span></p> +<p id="t29" class="stm run hide_run"> <span class="key">except</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t30" class="stm run hide_run"> <span class="key">pass</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="nam">three</span><span class="op">(</span><span class="op">)</span><span class="strut"> </span></p> </td> </tr> </table> </div> -<div id='footer'> - <div class='content'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="index.html">« index</a> <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:04 </p> </div> </div> diff --git a/tests/farm/html/gold_b_branch/index.html b/tests/farm/html/gold_b_branch/index.html index be4adc89..ebc3a106 100644 --- a/tests/farm/html/gold_b_branch/index.html +++ b/tests/farm/html/gold_b_branch/index.html @@ -1,28 +1,28 @@ <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Coverage report</title> - <link rel='stylesheet' href='style.css' type='text/css'> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.debounce.min.js'></script> - <script type='text/javascript' src='jquery.tablesorter.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.debounce.min.js"></script> + <script type="text/javascript" src="jquery.tablesorter.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.index_ready); </script> </head> -<body class='indexfile'> +<body class="indexfile"> -<div id='header'> - <div class='content'> +<div id="header"> + <div class="content"> <h1>Coverage report: - <span class='pc_cov'>70%</span> + <span class="pc_cov">70%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> <form id="filter_container"> <input id="filter" type="text" value="" placeholder="filter..." /> @@ -30,44 +30,44 @@ </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> - <p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> + <p class="legend">Hot-keys on this page</p> <div> - <p class='keyhelp'> - <span class='key'>n</span> - <span class='key'>s</span> - <span class='key'>m</span> - <span class='key'>x</span> + <p class="keyhelp"> + <span class="key">n</span> + <span class="key">s</span> + <span class="key">m</span> + <span class="key">x</span> - <span class='key'>b</span> - <span class='key'>p</span> + <span class="key">b</span> + <span class="key">p</span> - <span class='key'>c</span> change column sorting + <span class="key">c</span> change column sorting </p> </div> </div> -<div id='index'> - <table class='index'> +<div id="index"> + <table class="index"> <thead> - <tr class='tablehead' title='Click to sort'> - <th class='name left headerSortDown shortkey_n'>Module</th> - <th class='shortkey_s'>statements</th> - <th class='shortkey_m'>missing</th> - <th class='shortkey_x'>excluded</th> + <tr class="tablehead" title="Click to sort"> + <th class="name left headerSortDown shortkey_n">Module</th> + <th class="shortkey_s">statements</th> + <th class="shortkey_m">missing</th> + <th class="shortkey_x">excluded</th> - <th class='shortkey_b'>branches</th> - <th class='shortkey_p'>partial</th> + <th class="shortkey_b">branches</th> + <th class="shortkey_p">partial</th> - <th class='right shortkey_c'>coverage</th> + <th class="right shortkey_c">coverage</th> </tr> </thead> <tfoot> - <tr class='total'> - <td class='name left'>Total</td> + <tr class="total"> + <td class="name left">Total</td> <td>17</td> <td>3</td> <td>0</td> @@ -75,13 +75,13 @@ <td>6</td> <td>4</td> - <td class='right' data-ratio='16 23'>70%</td> + <td class="right" data-ratio="16 23">70%</td> </tr> </tfoot> <tbody> - <tr class='file'> - <td class='name left'><a href='b.html'>b</a></td> + <tr class="file"> + <td class="name left"><a href="b.html">b</a></td> <td>17</td> <td>3</td> <td>0</td> @@ -89,7 +89,7 @@ <td>6</td> <td>4</td> - <td class='right' data-ratio='16 23'>70%</td> + <td class="right" data-ratio="16 23">70%</td> </tr> </tbody> @@ -100,10 +100,10 @@ </p> </div> -<div id='footer'> - <div class='content'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="http://nedbatchelder.com/code/coverage/4.0a1">coverage.py v4.0a1</a> </p> </div> </div> diff --git a/tests/farm/html/gold_bom/bom_py.html b/tests/farm/html/gold_bom/bom_py.html index 40c64bdb..127f2f45 100644 --- a/tests/farm/html/gold_bom/bom_py.html +++ b/tests/farm/html/gold_bom/bom_py.html @@ -1,104 +1,104 @@ <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> - <meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' /> + <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" /> <title>Coverage for bom: 71%</title> - <link rel='stylesheet' href='style.css' type='text/css'> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.pyfile_ready); </script> </head> -<body class='pyfile'> +<body class="pyfile"> -<div id='header'> - <div class='content'> +<div id="header"> + <div class="content"> <h1>Coverage for <b>bom</b> : - <span class='pc_cov'>71%</span> + <span class="pc_cov">71%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> - <h2 class='stats'> + <h2 class="stats"> 7 statements - <span class='run hide_run shortkey_r button_toggle_run'>5 run</span> - <span class='mis shortkey_m button_toggle_mis'>2 missing</span> - <span class='exc shortkey_x button_toggle_exc'>0 excluded</span> + <span class="run hide_run shortkey_r button_toggle_run">5 run</span> + <span class="mis shortkey_m button_toggle_mis">2 missing</span> + <span class="exc shortkey_x button_toggle_exc">0 excluded</span> </h2> </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> -<p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk </p> </div> </div> -<div id='source'> +<div id="source"> <table> <tr> - <td class='linenos'> -<p id='n1' class='pln'><a href='#n1'>1</a></p> -<p id='n2' class='stm run hide_run'><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> -<p id='n5' class='pln'><a href='#n5'>5</a></p> -<p id='n6' class='stm run hide_run'><a href='#n6'>6</a></p> -<p id='n7' class='stm mis'><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='stm run hide_run'><a href='#n11'>11</a></p> + <td class="linenos"> +<p id="n1" class="pln"><a href="#n1">1</a></p> +<p id="n2" class="stm run hide_run"><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> +<p id="n5" class="pln"><a href="#n5">5</a></p> +<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p> +<p id="n7" class="stm mis"><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="stm run hide_run"><a href="#n11">11</a></p> </td> - <td class='text'> -<p id='t1' class='pln'><span class='err'>�</span><span class='err'>�</span><span class='err'>�</span><span class='com'># A python source file in utf-8, with BOM</span><span class='strut'> </span></p> -<p id='t2' class='stm run hide_run'><span class='nam'>math</span> <span class='op'>=</span> <span class='str'>"3×4 = 12, ÷2 = 6±0"</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'>import</span> <span class='nam'>sys</span><span class='strut'> </span></p> -<p id='t5' class='pln'><span class='strut'> </span></p> -<p id='t6' class='stm run hide_run'><span class='key'>if</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>version_info</span> <span class='op'>>=</span> <span class='op'>(</span><span class='num'>3</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='t7' class='stm mis'> <span class='key'>assert</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>math</span><span class='op'>)</span> <span class='op'>==</span> <span class='num'>18</span><span class='strut'> </span></p> -<p id='t8' class='stm mis'> <span class='key'>assert</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>math</span><span class='op'>.</span><span class='nam'>encode</span><span class='op'>(</span><span class='str'>'utf-8'</span><span class='op'>)</span><span class='op'>)</span> <span class='op'>==</span> <span class='num'>21</span><span class='strut'> </span></p> -<p id='t9' class='pln'><span class='key'>else</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t10' class='stm run hide_run'> <span class='key'>assert</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>math</span><span class='op'>)</span> <span class='op'>==</span> <span class='num'>21</span><span class='strut'> </span></p> -<p id='t11' class='stm run hide_run'> <span class='key'>assert</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>math</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>'utf-8'</span><span class='op'>)</span><span class='op'>)</span> <span class='op'>==</span> <span class='num'>18</span><span class='strut'> </span></p> + <td class="text"> +<p id="t1" class="pln"><span class="err">�</span><span class="err">�</span><span class="err">�</span><span class="com"># A python source file in utf-8, with BOM</span><span class="strut"> </span></p> +<p id="t2" class="stm run hide_run"><span class="nam">math</span> <span class="op">=</span> <span class="str">"3×4 = 12, ÷2 = 6±0"</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">import</span> <span class="nam">sys</span><span class="strut"> </span></p> +<p id="t5" class="pln"><span class="strut"> </span></p> +<p id="t6" class="stm run hide_run"><span class="key">if</span> <span class="nam">sys</span><span class="op">.</span><span class="nam">version_info</span> <span class="op">>=</span> <span class="op">(</span><span class="num">3</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="t7" class="stm mis"> <span class="key">assert</span> <span class="nam">len</span><span class="op">(</span><span class="nam">math</span><span class="op">)</span> <span class="op">==</span> <span class="num">18</span><span class="strut"> </span></p> +<p id="t8" class="stm mis"> <span class="key">assert</span> <span class="nam">len</span><span class="op">(</span><span class="nam">math</span><span class="op">.</span><span class="nam">encode</span><span class="op">(</span><span class="str">'utf-8'</span><span class="op">)</span><span class="op">)</span> <span class="op">==</span> <span class="num">21</span><span class="strut"> </span></p> +<p id="t9" class="pln"><span class="key">else</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t10" class="stm run hide_run"> <span class="key">assert</span> <span class="nam">len</span><span class="op">(</span><span class="nam">math</span><span class="op">)</span> <span class="op">==</span> <span class="num">21</span><span class="strut"> </span></p> +<p id="t11" class="stm run hide_run"> <span class="key">assert</span> <span class="nam">len</span><span class="op">(</span><span class="nam">math</span><span class="op">.</span><span class="nam">decode</span><span class="op">(</span><span class="str">'utf-8'</span><span class="op">)</span><span class="op">)</span> <span class="op">==</span> <span class="num">18</span><span class="strut"> </span></p> </td> </tr> </table> </div> -<div id='footer'> - <div class='content'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="index.html">« index</a> <a class="nav" href="http://nedbatchelder.com/code/coverage/4.0a1">coverage.py v4.0a1</a> </p> </div> </div> diff --git a/tests/farm/html/gold_bom/index.html b/tests/farm/html/gold_bom/index.html index 525e7778..77696727 100644 --- a/tests/farm/html/gold_bom/index.html +++ b/tests/farm/html/gold_bom/index.html @@ -1,28 +1,28 @@ <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Coverage report</title> - <link rel='stylesheet' href='style.css' type='text/css'> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.debounce.min.js'></script> - <script type='text/javascript' src='jquery.tablesorter.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.debounce.min.js"></script> + <script type="text/javascript" src="jquery.tablesorter.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.index_ready); </script> </head> -<body class='indexfile'> +<body class="indexfile"> -<div id='header'> - <div class='content'> +<div id="header"> + <div class="content"> <h1>Coverage report: - <span class='pc_cov'>71%</span> + <span class="pc_cov">71%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> <form id="filter_container"> <input id="filter" type="text" value="" placeholder="filter..." /> @@ -30,54 +30,54 @@ </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> - <p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> + <p class="legend">Hot-keys on this page</p> <div> - <p class='keyhelp'> - <span class='key'>n</span> - <span class='key'>s</span> - <span class='key'>m</span> - <span class='key'>x</span> + <p class="keyhelp"> + <span class="key">n</span> + <span class="key">s</span> + <span class="key">m</span> + <span class="key">x</span> - <span class='key'>c</span> change column sorting + <span class="key">c</span> change column sorting </p> </div> </div> -<div id='index'> - <table class='index'> +<div id="index"> + <table class="index"> <thead> - <tr class='tablehead' title='Click to sort'> - <th class='name left headerSortDown shortkey_n'>Module</th> - <th class='shortkey_s'>statements</th> - <th class='shortkey_m'>missing</th> - <th class='shortkey_x'>excluded</th> + <tr class="tablehead" title="Click to sort"> + <th class="name left headerSortDown shortkey_n">Module</th> + <th class="shortkey_s">statements</th> + <th class="shortkey_m">missing</th> + <th class="shortkey_x">excluded</th> - <th class='right shortkey_c'>coverage</th> + <th class="right shortkey_c">coverage</th> </tr> </thead> <tfoot> - <tr class='total'> - <td class='name left'>Total</td> + <tr class="total"> + <td class="name left">Total</td> <td>7</td> <td>2</td> <td>0</td> - <td class='right' data-ratio='5 7'>71%</td> + <td class="right" data-ratio="5 7">71%</td> </tr> </tfoot> <tbody> - <tr class='file'> - <td class='name left'><a href='bom.html'>bom</a></td> + <tr class="file"> + <td class="name left"><a href="bom.html">bom</a></td> <td>7</td> <td>2</td> <td>0</td> - <td class='right' data-ratio='5 7'>71%</td> + <td class="right" data-ratio="5 7">71%</td> </tr> </tbody> @@ -88,10 +88,10 @@ </p> </div> -<div id='footer'> - <div class='content'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="http://nedbatchelder.com/code/coverage/4.0a1">coverage.py v4.0a1</a> </p> </div> </div> diff --git a/tests/farm/html/gold_isolatin1/index.html b/tests/farm/html/gold_isolatin1/index.html index b111b86f..ff4d26f9 100644 --- a/tests/farm/html/gold_isolatin1/index.html +++ b/tests/farm/html/gold_isolatin1/index.html @@ -1,28 +1,31 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Coverage report</title> - <link rel='stylesheet' href='style.css' type='text/css'> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.debounce.min.js'></script> - <script type='text/javascript' src='jquery.tablesorter.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.debounce.min.js"></script> + <script type="text/javascript" src="jquery.tablesorter.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.index_ready); </script> </head> -<body class='indexfile'> +<body class="indexfile"> -<div id='header'> - <div class='content'> +<div id="header"> + <div class="content"> <h1>Coverage report: - <span class='pc_cov'>100%</span> + <span class="pc_cov">100%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> <form id="filter_container"> <input id="filter" type="text" value="" placeholder="filter..." /> @@ -30,54 +33,54 @@ </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> - <p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> + <p class="legend">Hot-keys on this page</p> <div> - <p class='keyhelp'> - <span class='key'>n</span> - <span class='key'>s</span> - <span class='key'>m</span> - <span class='key'>x</span> + <p class="keyhelp"> + <span class="key">n</span> + <span class="key">s</span> + <span class="key">m</span> + <span class="key">x</span> - <span class='key'>c</span> change column sorting + <span class="key">c</span> change column sorting </p> </div> </div> -<div id='index'> - <table class='index'> +<div id="index"> + <table class="index"> <thead> - <tr class='tablehead' title='Click to sort'> - <th class='name left headerSortDown shortkey_n'>Module</th> - <th class='shortkey_s'>statements</th> - <th class='shortkey_m'>missing</th> - <th class='shortkey_x'>excluded</th> + <tr class="tablehead" title="Click to sort"> + <th class="name left headerSortDown shortkey_n">Module</th> + <th class="shortkey_s">statements</th> + <th class="shortkey_m">missing</th> + <th class="shortkey_x">excluded</th> - <th class='right shortkey_c'>coverage</th> + <th class="right shortkey_c">coverage</th> </tr> </thead> <tfoot> - <tr class='total'> - <td class='name left'>Total</td> + <tr class="total"> + <td class="name left">Total</td> <td>2</td> <td>0</td> <td>0</td> - <td class='right' data-ratio='2 2'>100%</td> + <td class="right" data-ratio="2 2">100%</td> </tr> </tfoot> <tbody> - <tr class='file'> - <td class='name left'><a href='isolatin1.html'>isolatin1</a></td> + <tr class="file"> + <td class="name left"><a href="isolatin1_py.html">isolatin1.py</a></td> <td>2</td> <td>0</td> <td>0</td> - <td class='right' data-ratio='2 2'>100%</td> + <td class="right" data-ratio="2 2">100%</td> </tr> </tbody> @@ -88,10 +91,11 @@ </p> </div> -<div id='footer'> - <div class='content'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:31 </p> </div> </div> diff --git a/tests/farm/html/gold_isolatin1/isolatin1_py.html b/tests/farm/html/gold_isolatin1/isolatin1_py.html index 0e4ac95a..3c9af361 100644 --- a/tests/farm/html/gold_isolatin1/isolatin1_py.html +++ b/tests/farm/html/gold_isolatin1/isolatin1_py.html @@ -1,92 +1,102 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> - <meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' /> - <title>Coverage for isolatin1: 100%</title> - <link rel='stylesheet' href='style.css' type='text/css'> + <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" /> + <title>Coverage for isolatin1.py: 100%</title> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.pyfile_ready); </script> </head> -<body class='pyfile'> +<body class="pyfile"> -<div id='header'> - <div class='content'> - <h1>Coverage for <b>isolatin1</b> : - <span class='pc_cov'>100%</span> +<div id="header"> + <div class="content"> + <h1>Coverage for <b>isolatin1.py</b> : + <span class="pc_cov">100%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> - <h2 class='stats'> + <h2 class="stats"> 2 statements - <span class='run hide_run shortkey_r button_toggle_run'>2 run</span> - <span class='mis shortkey_m button_toggle_mis'>0 missing</span> - <span class='exc shortkey_x button_toggle_exc'>0 excluded</span> + <span class="run hide_run shortkey_r button_toggle_run">2 run</span> + <span class="mis shortkey_m button_toggle_mis">0 missing</span> + <span class="exc shortkey_x button_toggle_exc">0 excluded</span> </h2> </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> -<p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk </p> </div> </div> -<div id='source'> +<div id="source"> <table> <tr> - <td class='linenos'> -<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> -<p id='n5' class='stm run hide_run'><a href='#n5'>5</a></p> + <td class="linenos"> +<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="pln"><a href="#n4">4</a></p> +<p id="n5" class="pln"><a href="#n5">5</a></p> +<p id="n6" class="pln"><a href="#n6">6</a></p> +<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p> +<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p> </td> - <td class='text'> -<p id='t1' class='pln'><span class='com'># A python source file in another encoding.</span><span class='strut'> </span></p> -<p id='t2' class='pln'><span class='com'># -*- coding: iso8859-1 -*-</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='nam'>math</span> <span class='op'>=</span> <span class='str'>"3×4 = 12, ÷2 = 6±0"</span><span class='strut'> </span></p> -<p id='t5' class='stm run hide_run'><span class='key'>assert</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>math</span><span class='op'>)</span> <span class='op'>==</span> <span class='num'>18</span><span class='strut'> </span></p> + <td class="text"> +<p id="t1" class="pln"><span class="com"># -*- coding: iso8859-1 -*-</span><span class="strut"> </span></p> +<p id="t2" class="pln"><span class="com"># Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0</span><span class="strut"> </span></p> +<p id="t3" class="pln"><span class="com"># For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt</span><span class="strut"> </span></p> +<p id="t4" class="pln"><span class="strut"> </span></p> +<p id="t5" class="pln"><span class="com"># A Python source file in another encoding.</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="nam">math</span> <span class="op">=</span> <span class="str">"3×4 = 12, ÷2 = 6±0"</span><span class="strut"> </span></p> +<p id="t8" class="stm run hide_run"><span class="key">assert</span> <span class="nam">len</span><span class="op">(</span><span class="nam">math</span><span class="op">)</span> <span class="op">==</span> <span class="num">18</span><span class="strut"> </span></p> </td> </tr> </table> </div> -<div id='footer'> - <div class='content'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="index.html">« index</a> <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:04 </p> </div> </div> diff --git a/tests/farm/html/gold_omit_1/index.html b/tests/farm/html/gold_omit_1/index.html index 7cacebbd..95ec804f 100644 --- a/tests/farm/html/gold_omit_1/index.html +++ b/tests/farm/html/gold_omit_1/index.html @@ -1,28 +1,31 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Coverage report</title> - <link rel='stylesheet' href='style.css' type='text/css'> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.debounce.min.js'></script> - <script type='text/javascript' src='jquery.tablesorter.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.debounce.min.js"></script> + <script type="text/javascript" src="jquery.tablesorter.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.index_ready); </script> </head> -<body class='indexfile'> +<body class="indexfile"> -<div id='header'> - <div class='content'> +<div id="header"> + <div class="content"> <h1>Coverage report: - <span class='pc_cov'>100%</span> + <span class="pc_cov">100%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> <form id="filter_container"> <input id="filter" type="text" value="" placeholder="filter..." /> @@ -30,81 +33,81 @@ </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> - <p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> + <p class="legend">Hot-keys on this page</p> <div> - <p class='keyhelp'> - <span class='key'>n</span> - <span class='key'>s</span> - <span class='key'>m</span> - <span class='key'>x</span> + <p class="keyhelp"> + <span class="key">n</span> + <span class="key">s</span> + <span class="key">m</span> + <span class="key">x</span> - <span class='key'>c</span> change column sorting + <span class="key">c</span> change column sorting </p> </div> </div> -<div id='index'> - <table class='index'> +<div id="index"> + <table class="index"> <thead> - <tr class='tablehead' title='Click to sort'> - <th class='name left headerSortDown shortkey_n'>Module</th> - <th class='shortkey_s'>statements</th> - <th class='shortkey_m'>missing</th> - <th class='shortkey_x'>excluded</th> + <tr class="tablehead" title="Click to sort"> + <th class="name left headerSortDown shortkey_n">Module</th> + <th class="shortkey_s">statements</th> + <th class="shortkey_m">missing</th> + <th class="shortkey_x">excluded</th> - <th class='right shortkey_c'>coverage</th> + <th class="right shortkey_c">coverage</th> </tr> </thead> <tfoot> - <tr class='total'> - <td class='name left'>Total</td> + <tr class="total"> + <td class="name left">Total</td> <td>14</td> <td>0</td> <td>0</td> - <td class='right' data-ratio='14 14'>100%</td> + <td class="right" data-ratio="14 14">100%</td> </tr> </tfoot> <tbody> - <tr class='file'> - <td class='name left'><a href='m1.html'>m1</a></td> + <tr class="file"> + <td class="name left"><a href="m1_py.html">m1.py</a></td> <td>2</td> <td>0</td> <td>0</td> - <td class='right' data-ratio='2 2'>100%</td> + <td class="right" data-ratio="2 2">100%</td> </tr> - <tr class='file'> - <td class='name left'><a href='m2.html'>m2</a></td> + <tr class="file"> + <td class="name left"><a href="m2_py.html">m2.py</a></td> <td>2</td> <td>0</td> <td>0</td> - <td class='right' data-ratio='2 2'>100%</td> + <td class="right" data-ratio="2 2">100%</td> </tr> - <tr class='file'> - <td class='name left'><a href='m3.html'>m3</a></td> + <tr class="file"> + <td class="name left"><a href="m3_py.html">m3.py</a></td> <td>2</td> <td>0</td> <td>0</td> - <td class='right' data-ratio='2 2'>100%</td> + <td class="right" data-ratio="2 2">100%</td> </tr> - <tr class='file'> - <td class='name left'><a href='main.html'>main</a></td> + <tr class="file"> + <td class="name left"><a href="main_py.html">main.py</a></td> <td>8</td> <td>0</td> <td>0</td> - <td class='right' data-ratio='8 8'>100%</td> + <td class="right" data-ratio="8 8">100%</td> </tr> </tbody> @@ -115,10 +118,11 @@ </p> </div> -<div id='footer'> - <div class='content'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:31 </p> </div> </div> diff --git a/tests/farm/html/gold_omit_1/m1_py.html b/tests/farm/html/gold_omit_1/m1_py.html index de44f789..8df0bf51 100644 --- a/tests/farm/html/gold_omit_1/m1_py.html +++ b/tests/farm/html/gold_omit_1/m1_py.html @@ -1,86 +1,96 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <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'> + <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" /> + <title>Coverage for m1.py: 100%</title> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.pyfile_ready); </script> </head> -<body class='pyfile'> +<body class="pyfile"> -<div id='header'> - <div class='content'> - <h1>Coverage for <b>m1</b> : - <span class='pc_cov'>100%</span> +<div id="header"> + <div class="content"> + <h1>Coverage for <b>m1.py</b> : + <span class="pc_cov">100%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> - <h2 class='stats'> + <h2 class="stats"> 2 statements - <span class='run hide_run shortkey_r button_toggle_run'>2 run</span> - <span class='mis shortkey_m button_toggle_mis'>0 missing</span> - <span class='exc shortkey_x button_toggle_exc'>0 excluded</span> + <span class="run hide_run shortkey_r button_toggle_run">2 run</span> + <span class="mis shortkey_m button_toggle_mis">0 missing</span> + <span class="exc shortkey_x button_toggle_exc">0 excluded</span> </h2> </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> -<p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk </p> </div> </div> -<div id='source'> +<div id="source"> <table> <tr> - <td class='linenos'> -<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 class="linenos"> +<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> +<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p> </td> - <td class='text'> -<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 class="text"> +<p id="t1" class="pln"><span class="com"># Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0</span><span class="strut"> </span></p> +<p id="t2" class="pln"><span class="com"># For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt</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="nam">m1a</span> <span class="op">=</span> <span class="num">1</span><span class="strut"> </span></p> +<p id="t5" 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'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="index.html">« index</a> <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:04 </p> </div> </div> diff --git a/tests/farm/html/gold_omit_1/m2_py.html b/tests/farm/html/gold_omit_1/m2_py.html index c775e6bb..2a7f13f0 100644 --- a/tests/farm/html/gold_omit_1/m2_py.html +++ b/tests/farm/html/gold_omit_1/m2_py.html @@ -1,86 +1,96 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <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'> + <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" /> + <title>Coverage for m2.py: 100%</title> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.pyfile_ready); </script> </head> -<body class='pyfile'> +<body class="pyfile"> -<div id='header'> - <div class='content'> - <h1>Coverage for <b>m2</b> : - <span class='pc_cov'>100%</span> +<div id="header"> + <div class="content"> + <h1>Coverage for <b>m2.py</b> : + <span class="pc_cov">100%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> - <h2 class='stats'> + <h2 class="stats"> 2 statements - <span class='run hide_run shortkey_r button_toggle_run'>2 run</span> - <span class='mis shortkey_m button_toggle_mis'>0 missing</span> - <span class='exc shortkey_x button_toggle_exc'>0 excluded</span> + <span class="run hide_run shortkey_r button_toggle_run">2 run</span> + <span class="mis shortkey_m button_toggle_mis">0 missing</span> + <span class="exc shortkey_x button_toggle_exc">0 excluded</span> </h2> </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> -<p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk </p> </div> </div> -<div id='source'> +<div id="source"> <table> <tr> - <td class='linenos'> -<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 class="linenos"> +<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> +<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p> </td> - <td class='text'> -<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 class="text"> +<p id="t1" class="pln"><span class="com"># Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0</span><span class="strut"> </span></p> +<p id="t2" class="pln"><span class="com"># For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt</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="nam">m2a</span> <span class="op">=</span> <span class="num">1</span><span class="strut"> </span></p> +<p id="t5" 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'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="index.html">« index</a> <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:04 </p> </div> </div> diff --git a/tests/farm/html/gold_omit_1/m3_py.html b/tests/farm/html/gold_omit_1/m3_py.html index 67354c48..b372a96e 100644 --- a/tests/farm/html/gold_omit_1/m3_py.html +++ b/tests/farm/html/gold_omit_1/m3_py.html @@ -1,86 +1,96 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <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'> + <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" /> + <title>Coverage for m3.py: 100%</title> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.pyfile_ready); </script> </head> -<body class='pyfile'> +<body class="pyfile"> -<div id='header'> - <div class='content'> - <h1>Coverage for <b>m3</b> : - <span class='pc_cov'>100%</span> +<div id="header"> + <div class="content"> + <h1>Coverage for <b>m3.py</b> : + <span class="pc_cov">100%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> - <h2 class='stats'> + <h2 class="stats"> 2 statements - <span class='run hide_run shortkey_r button_toggle_run'>2 run</span> - <span class='mis shortkey_m button_toggle_mis'>0 missing</span> - <span class='exc shortkey_x button_toggle_exc'>0 excluded</span> + <span class="run hide_run shortkey_r button_toggle_run">2 run</span> + <span class="mis shortkey_m button_toggle_mis">0 missing</span> + <span class="exc shortkey_x button_toggle_exc">0 excluded</span> </h2> </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> -<p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk </p> </div> </div> -<div id='source'> +<div id="source"> <table> <tr> - <td class='linenos'> -<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 class="linenos"> +<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> +<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p> </td> - <td class='text'> -<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 class="text"> +<p id="t1" class="pln"><span class="com"># Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0</span><span class="strut"> </span></p> +<p id="t2" class="pln"><span class="com"># For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt</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="nam">m3a</span> <span class="op">=</span> <span class="num">1</span><span class="strut"> </span></p> +<p id="t5" 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'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="index.html">« index</a> <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:04 </p> </div> </div> diff --git a/tests/farm/html/gold_omit_1/main_py.html b/tests/farm/html/gold_omit_1/main_py.html index a71b10e4..ba6e9680 100644 --- a/tests/farm/html/gold_omit_1/main_py.html +++ b/tests/farm/html/gold_omit_1/main_py.html @@ -1,102 +1,112 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <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'> + <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" /> + <title>Coverage for main.py: 100%</title> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.pyfile_ready); </script> </head> -<body class='pyfile'> +<body class="pyfile"> -<div id='header'> - <div class='content'> - <h1>Coverage for <b>main</b> : - <span class='pc_cov'>100%</span> +<div id="header"> + <div class="content"> + <h1>Coverage for <b>main.py</b> : + <span class="pc_cov">100%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> - <h2 class='stats'> + <h2 class="stats"> 8 statements - <span class='run hide_run shortkey_r button_toggle_run'>8 run</span> - <span class='mis shortkey_m button_toggle_mis'>0 missing</span> - <span class='exc shortkey_x button_toggle_exc'>0 excluded</span> + <span class="run hide_run shortkey_r button_toggle_run">8 run</span> + <span class="mis shortkey_m button_toggle_mis">0 missing</span> + <span class="exc shortkey_x button_toggle_exc">0 excluded</span> </h2> </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> -<p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk </p> </div> </div> -<div id='source'> +<div id="source"> <table> <tr> - <td class='linenos'> -<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 class="linenos"> +<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> +<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="pln"><a href="#n10">10</a></p> +<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p> +<p id="n12" class="stm run hide_run"><a href="#n12">12</a></p> +<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p> </td> - <td class='text'> -<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 class="text"> +<p id="t1" class="pln"><span class="com"># Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0</span><span class="strut"> </span></p> +<p id="t2" class="pln"><span class="com"># For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt</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">import</span> <span class="nam">m1</span><span class="strut"> </span></p> +<p id="t5" class="stm run hide_run"><span class="key">import</span> <span class="nam">m2</span><span class="strut"> </span></p> +<p id="t6" class="stm run hide_run"><span class="key">import</span> <span class="nam">m3</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="nam">a</span> <span class="op">=</span> <span class="num">5</span><span class="strut"> </span></p> +<p id="t9" 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="t10" class="pln"><span class="strut"> </span></p> +<p id="t11" 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="t12" 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="t13" 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'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="index.html">« index</a> <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:04 </p> </div> </div> diff --git a/tests/farm/html/gold_omit_2/index.html b/tests/farm/html/gold_omit_2/index.html index b6d495c8..fc781120 100644 --- a/tests/farm/html/gold_omit_2/index.html +++ b/tests/farm/html/gold_omit_2/index.html @@ -1,28 +1,31 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Coverage report</title> - <link rel='stylesheet' href='style.css' type='text/css'> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.debounce.min.js'></script> - <script type='text/javascript' src='jquery.tablesorter.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.debounce.min.js"></script> + <script type="text/javascript" src="jquery.tablesorter.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.index_ready); </script> </head> -<body class='indexfile'> +<body class="indexfile"> -<div id='header'> - <div class='content'> +<div id="header"> + <div class="content"> <h1>Coverage report: - <span class='pc_cov'>100%</span> + <span class="pc_cov">100%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> <form id="filter_container"> <input id="filter" type="text" value="" placeholder="filter..." /> @@ -30,72 +33,72 @@ </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> - <p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> + <p class="legend">Hot-keys on this page</p> <div> - <p class='keyhelp'> - <span class='key'>n</span> - <span class='key'>s</span> - <span class='key'>m</span> - <span class='key'>x</span> + <p class="keyhelp"> + <span class="key">n</span> + <span class="key">s</span> + <span class="key">m</span> + <span class="key">x</span> - <span class='key'>c</span> change column sorting + <span class="key">c</span> change column sorting </p> </div> </div> -<div id='index'> - <table class='index'> +<div id="index"> + <table class="index"> <thead> - <tr class='tablehead' title='Click to sort'> - <th class='name left headerSortDown shortkey_n'>Module</th> - <th class='shortkey_s'>statements</th> - <th class='shortkey_m'>missing</th> - <th class='shortkey_x'>excluded</th> + <tr class="tablehead" title="Click to sort"> + <th class="name left headerSortDown shortkey_n">Module</th> + <th class="shortkey_s">statements</th> + <th class="shortkey_m">missing</th> + <th class="shortkey_x">excluded</th> - <th class='right shortkey_c'>coverage</th> + <th class="right shortkey_c">coverage</th> </tr> </thead> <tfoot> - <tr class='total'> - <td class='name left'>Total</td> + <tr class="total"> + <td class="name left">Total</td> <td>12</td> <td>0</td> <td>0</td> - <td class='right' data-ratio='12 12'>100%</td> + <td class="right" data-ratio="12 12">100%</td> </tr> </tfoot> <tbody> - <tr class='file'> - <td class='name left'><a href='m2.html'>m2</a></td> + <tr class="file"> + <td class="name left"><a href="m2_py.html">m2.py</a></td> <td>2</td> <td>0</td> <td>0</td> - <td class='right' data-ratio='2 2'>100%</td> + <td class="right" data-ratio="2 2">100%</td> </tr> - <tr class='file'> - <td class='name left'><a href='m3.html'>m3</a></td> + <tr class="file"> + <td class="name left"><a href="m3_py.html">m3.py</a></td> <td>2</td> <td>0</td> <td>0</td> - <td class='right' data-ratio='2 2'>100%</td> + <td class="right" data-ratio="2 2">100%</td> </tr> - <tr class='file'> - <td class='name left'><a href='main.html'>main</a></td> + <tr class="file"> + <td class="name left"><a href="main_py.html">main.py</a></td> <td>8</td> <td>0</td> <td>0</td> - <td class='right' data-ratio='8 8'>100%</td> + <td class="right" data-ratio="8 8">100%</td> </tr> </tbody> @@ -106,10 +109,11 @@ </p> </div> -<div id='footer'> - <div class='content'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:31 </p> </div> </div> diff --git a/tests/farm/html/gold_omit_2/m2_py.html b/tests/farm/html/gold_omit_2/m2_py.html index c775e6bb..2a7f13f0 100644 --- a/tests/farm/html/gold_omit_2/m2_py.html +++ b/tests/farm/html/gold_omit_2/m2_py.html @@ -1,86 +1,96 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <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'> + <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" /> + <title>Coverage for m2.py: 100%</title> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.pyfile_ready); </script> </head> -<body class='pyfile'> +<body class="pyfile"> -<div id='header'> - <div class='content'> - <h1>Coverage for <b>m2</b> : - <span class='pc_cov'>100%</span> +<div id="header"> + <div class="content"> + <h1>Coverage for <b>m2.py</b> : + <span class="pc_cov">100%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> - <h2 class='stats'> + <h2 class="stats"> 2 statements - <span class='run hide_run shortkey_r button_toggle_run'>2 run</span> - <span class='mis shortkey_m button_toggle_mis'>0 missing</span> - <span class='exc shortkey_x button_toggle_exc'>0 excluded</span> + <span class="run hide_run shortkey_r button_toggle_run">2 run</span> + <span class="mis shortkey_m button_toggle_mis">0 missing</span> + <span class="exc shortkey_x button_toggle_exc">0 excluded</span> </h2> </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> -<p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk </p> </div> </div> -<div id='source'> +<div id="source"> <table> <tr> - <td class='linenos'> -<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 class="linenos"> +<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> +<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p> </td> - <td class='text'> -<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 class="text"> +<p id="t1" class="pln"><span class="com"># Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0</span><span class="strut"> </span></p> +<p id="t2" class="pln"><span class="com"># For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt</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="nam">m2a</span> <span class="op">=</span> <span class="num">1</span><span class="strut"> </span></p> +<p id="t5" 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'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="index.html">« index</a> <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:04 </p> </div> </div> diff --git a/tests/farm/html/gold_omit_2/m3_py.html b/tests/farm/html/gold_omit_2/m3_py.html index 67354c48..b372a96e 100644 --- a/tests/farm/html/gold_omit_2/m3_py.html +++ b/tests/farm/html/gold_omit_2/m3_py.html @@ -1,86 +1,96 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <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'> + <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" /> + <title>Coverage for m3.py: 100%</title> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.pyfile_ready); </script> </head> -<body class='pyfile'> +<body class="pyfile"> -<div id='header'> - <div class='content'> - <h1>Coverage for <b>m3</b> : - <span class='pc_cov'>100%</span> +<div id="header"> + <div class="content"> + <h1>Coverage for <b>m3.py</b> : + <span class="pc_cov">100%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> - <h2 class='stats'> + <h2 class="stats"> 2 statements - <span class='run hide_run shortkey_r button_toggle_run'>2 run</span> - <span class='mis shortkey_m button_toggle_mis'>0 missing</span> - <span class='exc shortkey_x button_toggle_exc'>0 excluded</span> + <span class="run hide_run shortkey_r button_toggle_run">2 run</span> + <span class="mis shortkey_m button_toggle_mis">0 missing</span> + <span class="exc shortkey_x button_toggle_exc">0 excluded</span> </h2> </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> -<p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk </p> </div> </div> -<div id='source'> +<div id="source"> <table> <tr> - <td class='linenos'> -<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 class="linenos"> +<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> +<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p> </td> - <td class='text'> -<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 class="text"> +<p id="t1" class="pln"><span class="com"># Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0</span><span class="strut"> </span></p> +<p id="t2" class="pln"><span class="com"># For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt</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="nam">m3a</span> <span class="op">=</span> <span class="num">1</span><span class="strut"> </span></p> +<p id="t5" 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'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="index.html">« index</a> <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:04 </p> </div> </div> diff --git a/tests/farm/html/gold_omit_2/main_py.html b/tests/farm/html/gold_omit_2/main_py.html index a71b10e4..ba6e9680 100644 --- a/tests/farm/html/gold_omit_2/main_py.html +++ b/tests/farm/html/gold_omit_2/main_py.html @@ -1,102 +1,112 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <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'> + <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" /> + <title>Coverage for main.py: 100%</title> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.pyfile_ready); </script> </head> -<body class='pyfile'> +<body class="pyfile"> -<div id='header'> - <div class='content'> - <h1>Coverage for <b>main</b> : - <span class='pc_cov'>100%</span> +<div id="header"> + <div class="content"> + <h1>Coverage for <b>main.py</b> : + <span class="pc_cov">100%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> - <h2 class='stats'> + <h2 class="stats"> 8 statements - <span class='run hide_run shortkey_r button_toggle_run'>8 run</span> - <span class='mis shortkey_m button_toggle_mis'>0 missing</span> - <span class='exc shortkey_x button_toggle_exc'>0 excluded</span> + <span class="run hide_run shortkey_r button_toggle_run">8 run</span> + <span class="mis shortkey_m button_toggle_mis">0 missing</span> + <span class="exc shortkey_x button_toggle_exc">0 excluded</span> </h2> </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> -<p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk </p> </div> </div> -<div id='source'> +<div id="source"> <table> <tr> - <td class='linenos'> -<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 class="linenos"> +<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> +<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="pln"><a href="#n10">10</a></p> +<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p> +<p id="n12" class="stm run hide_run"><a href="#n12">12</a></p> +<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p> </td> - <td class='text'> -<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 class="text"> +<p id="t1" class="pln"><span class="com"># Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0</span><span class="strut"> </span></p> +<p id="t2" class="pln"><span class="com"># For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt</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">import</span> <span class="nam">m1</span><span class="strut"> </span></p> +<p id="t5" class="stm run hide_run"><span class="key">import</span> <span class="nam">m2</span><span class="strut"> </span></p> +<p id="t6" class="stm run hide_run"><span class="key">import</span> <span class="nam">m3</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="nam">a</span> <span class="op">=</span> <span class="num">5</span><span class="strut"> </span></p> +<p id="t9" 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="t10" class="pln"><span class="strut"> </span></p> +<p id="t11" 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="t12" 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="t13" 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'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="index.html">« index</a> <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:04 </p> </div> </div> diff --git a/tests/farm/html/gold_omit_3/index.html b/tests/farm/html/gold_omit_3/index.html index db0ad581..cc9e9ea5 100644 --- a/tests/farm/html/gold_omit_3/index.html +++ b/tests/farm/html/gold_omit_3/index.html @@ -1,28 +1,31 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Coverage report</title> - <link rel='stylesheet' href='style.css' type='text/css'> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.debounce.min.js'></script> - <script type='text/javascript' src='jquery.tablesorter.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.debounce.min.js"></script> + <script type="text/javascript" src="jquery.tablesorter.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.index_ready); </script> </head> -<body class='indexfile'> +<body class="indexfile"> -<div id='header'> - <div class='content'> +<div id="header"> + <div class="content"> <h1>Coverage report: - <span class='pc_cov'>100%</span> + <span class="pc_cov">100%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> <form id="filter_container"> <input id="filter" type="text" value="" placeholder="filter..." /> @@ -30,63 +33,63 @@ </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> - <p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> + <p class="legend">Hot-keys on this page</p> <div> - <p class='keyhelp'> - <span class='key'>n</span> - <span class='key'>s</span> - <span class='key'>m</span> - <span class='key'>x</span> + <p class="keyhelp"> + <span class="key">n</span> + <span class="key">s</span> + <span class="key">m</span> + <span class="key">x</span> - <span class='key'>c</span> change column sorting + <span class="key">c</span> change column sorting </p> </div> </div> -<div id='index'> - <table class='index'> +<div id="index"> + <table class="index"> <thead> - <tr class='tablehead' title='Click to sort'> - <th class='name left headerSortDown shortkey_n'>Module</th> - <th class='shortkey_s'>statements</th> - <th class='shortkey_m'>missing</th> - <th class='shortkey_x'>excluded</th> + <tr class="tablehead" title="Click to sort"> + <th class="name left headerSortDown shortkey_n">Module</th> + <th class="shortkey_s">statements</th> + <th class="shortkey_m">missing</th> + <th class="shortkey_x">excluded</th> - <th class='right shortkey_c'>coverage</th> + <th class="right shortkey_c">coverage</th> </tr> </thead> <tfoot> - <tr class='total'> - <td class='name left'>Total</td> + <tr class="total"> + <td class="name left">Total</td> <td>10</td> <td>0</td> <td>0</td> - <td class='right' data-ratio='10 10'>100%</td> + <td class="right" data-ratio="10 10">100%</td> </tr> </tfoot> <tbody> - <tr class='file'> - <td class='name left'><a href='m3.html'>m3</a></td> + <tr class="file"> + <td class="name left"><a href="m3_py.html">m3.py</a></td> <td>2</td> <td>0</td> <td>0</td> - <td class='right' data-ratio='2 2'>100%</td> + <td class="right" data-ratio="2 2">100%</td> </tr> - <tr class='file'> - <td class='name left'><a href='main.html'>main</a></td> + <tr class="file"> + <td class="name left"><a href="main_py.html">main.py</a></td> <td>8</td> <td>0</td> <td>0</td> - <td class='right' data-ratio='8 8'>100%</td> + <td class="right" data-ratio="8 8">100%</td> </tr> </tbody> @@ -97,10 +100,11 @@ </p> </div> -<div id='footer'> - <div class='content'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:31 </p> </div> </div> diff --git a/tests/farm/html/gold_omit_3/m3_py.html b/tests/farm/html/gold_omit_3/m3_py.html index 67354c48..b372a96e 100644 --- a/tests/farm/html/gold_omit_3/m3_py.html +++ b/tests/farm/html/gold_omit_3/m3_py.html @@ -1,86 +1,96 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <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'> + <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" /> + <title>Coverage for m3.py: 100%</title> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.pyfile_ready); </script> </head> -<body class='pyfile'> +<body class="pyfile"> -<div id='header'> - <div class='content'> - <h1>Coverage for <b>m3</b> : - <span class='pc_cov'>100%</span> +<div id="header"> + <div class="content"> + <h1>Coverage for <b>m3.py</b> : + <span class="pc_cov">100%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> - <h2 class='stats'> + <h2 class="stats"> 2 statements - <span class='run hide_run shortkey_r button_toggle_run'>2 run</span> - <span class='mis shortkey_m button_toggle_mis'>0 missing</span> - <span class='exc shortkey_x button_toggle_exc'>0 excluded</span> + <span class="run hide_run shortkey_r button_toggle_run">2 run</span> + <span class="mis shortkey_m button_toggle_mis">0 missing</span> + <span class="exc shortkey_x button_toggle_exc">0 excluded</span> </h2> </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> -<p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk </p> </div> </div> -<div id='source'> +<div id="source"> <table> <tr> - <td class='linenos'> -<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 class="linenos"> +<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> +<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p> </td> - <td class='text'> -<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 class="text"> +<p id="t1" class="pln"><span class="com"># Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0</span><span class="strut"> </span></p> +<p id="t2" class="pln"><span class="com"># For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt</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="nam">m3a</span> <span class="op">=</span> <span class="num">1</span><span class="strut"> </span></p> +<p id="t5" 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'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="index.html">« index</a> <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:04 </p> </div> </div> diff --git a/tests/farm/html/gold_omit_3/main_py.html b/tests/farm/html/gold_omit_3/main_py.html index a71b10e4..ba6e9680 100644 --- a/tests/farm/html/gold_omit_3/main_py.html +++ b/tests/farm/html/gold_omit_3/main_py.html @@ -1,102 +1,112 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <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'> + <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" /> + <title>Coverage for main.py: 100%</title> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.pyfile_ready); </script> </head> -<body class='pyfile'> +<body class="pyfile"> -<div id='header'> - <div class='content'> - <h1>Coverage for <b>main</b> : - <span class='pc_cov'>100%</span> +<div id="header"> + <div class="content"> + <h1>Coverage for <b>main.py</b> : + <span class="pc_cov">100%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> - <h2 class='stats'> + <h2 class="stats"> 8 statements - <span class='run hide_run shortkey_r button_toggle_run'>8 run</span> - <span class='mis shortkey_m button_toggle_mis'>0 missing</span> - <span class='exc shortkey_x button_toggle_exc'>0 excluded</span> + <span class="run hide_run shortkey_r button_toggle_run">8 run</span> + <span class="mis shortkey_m button_toggle_mis">0 missing</span> + <span class="exc shortkey_x button_toggle_exc">0 excluded</span> </h2> </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> -<p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk </p> </div> </div> -<div id='source'> +<div id="source"> <table> <tr> - <td class='linenos'> -<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 class="linenos"> +<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> +<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="pln"><a href="#n10">10</a></p> +<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p> +<p id="n12" class="stm run hide_run"><a href="#n12">12</a></p> +<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p> </td> - <td class='text'> -<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 class="text"> +<p id="t1" class="pln"><span class="com"># Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0</span><span class="strut"> </span></p> +<p id="t2" class="pln"><span class="com"># For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt</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">import</span> <span class="nam">m1</span><span class="strut"> </span></p> +<p id="t5" class="stm run hide_run"><span class="key">import</span> <span class="nam">m2</span><span class="strut"> </span></p> +<p id="t6" class="stm run hide_run"><span class="key">import</span> <span class="nam">m3</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="nam">a</span> <span class="op">=</span> <span class="num">5</span><span class="strut"> </span></p> +<p id="t9" 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="t10" class="pln"><span class="strut"> </span></p> +<p id="t11" 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="t12" 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="t13" 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'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="index.html">« index</a> <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:04 </p> </div> </div> diff --git a/tests/farm/html/gold_omit_4/index.html b/tests/farm/html/gold_omit_4/index.html index 130e2993..c0289fd5 100644 --- a/tests/farm/html/gold_omit_4/index.html +++ b/tests/farm/html/gold_omit_4/index.html @@ -1,28 +1,31 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Coverage report</title> - <link rel='stylesheet' href='style.css' type='text/css'> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.debounce.min.js'></script> - <script type='text/javascript' src='jquery.tablesorter.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.debounce.min.js"></script> + <script type="text/javascript" src="jquery.tablesorter.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.index_ready); </script> </head> -<body class='indexfile'> +<body class="indexfile"> -<div id='header'> - <div class='content'> +<div id="header"> + <div class="content"> <h1>Coverage report: - <span class='pc_cov'>100%</span> + <span class="pc_cov">100%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> <form id="filter_container"> <input id="filter" type="text" value="" placeholder="filter..." /> @@ -30,72 +33,72 @@ </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> - <p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> + <p class="legend">Hot-keys on this page</p> <div> - <p class='keyhelp'> - <span class='key'>n</span> - <span class='key'>s</span> - <span class='key'>m</span> - <span class='key'>x</span> + <p class="keyhelp"> + <span class="key">n</span> + <span class="key">s</span> + <span class="key">m</span> + <span class="key">x</span> - <span class='key'>c</span> change column sorting + <span class="key">c</span> change column sorting </p> </div> </div> -<div id='index'> - <table class='index'> +<div id="index"> + <table class="index"> <thead> - <tr class='tablehead' title='Click to sort'> - <th class='name left headerSortDown shortkey_n'>Module</th> - <th class='shortkey_s'>statements</th> - <th class='shortkey_m'>missing</th> - <th class='shortkey_x'>excluded</th> + <tr class="tablehead" title="Click to sort"> + <th class="name left headerSortDown shortkey_n">Module</th> + <th class="shortkey_s">statements</th> + <th class="shortkey_m">missing</th> + <th class="shortkey_x">excluded</th> - <th class='right shortkey_c'>coverage</th> + <th class="right shortkey_c">coverage</th> </tr> </thead> <tfoot> - <tr class='total'> - <td class='name left'>Total</td> + <tr class="total"> + <td class="name left">Total</td> <td>12</td> <td>0</td> <td>0</td> - <td class='right' data-ratio='12 12'>100%</td> + <td class="right" data-ratio="12 12">100%</td> </tr> </tfoot> <tbody> - <tr class='file'> - <td class='name left'><a href='m1.html'>m1</a></td> + <tr class="file"> + <td class="name left"><a href="m1_py.html">m1.py</a></td> <td>2</td> <td>0</td> <td>0</td> - <td class='right' data-ratio='2 2'>100%</td> + <td class="right" data-ratio="2 2">100%</td> </tr> - <tr class='file'> - <td class='name left'><a href='m3.html'>m3</a></td> + <tr class="file"> + <td class="name left"><a href="m3_py.html">m3.py</a></td> <td>2</td> <td>0</td> <td>0</td> - <td class='right' data-ratio='2 2'>100%</td> + <td class="right" data-ratio="2 2">100%</td> </tr> - <tr class='file'> - <td class='name left'><a href='main.html'>main</a></td> + <tr class="file"> + <td class="name left"><a href="main_py.html">main.py</a></td> <td>8</td> <td>0</td> <td>0</td> - <td class='right' data-ratio='8 8'>100%</td> + <td class="right" data-ratio="8 8">100%</td> </tr> </tbody> @@ -106,10 +109,11 @@ </p> </div> -<div id='footer'> - <div class='content'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:31 </p> </div> </div> diff --git a/tests/farm/html/gold_omit_4/m1_py.html b/tests/farm/html/gold_omit_4/m1_py.html index de44f789..8df0bf51 100644 --- a/tests/farm/html/gold_omit_4/m1_py.html +++ b/tests/farm/html/gold_omit_4/m1_py.html @@ -1,86 +1,96 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <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'> + <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" /> + <title>Coverage for m1.py: 100%</title> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.pyfile_ready); </script> </head> -<body class='pyfile'> +<body class="pyfile"> -<div id='header'> - <div class='content'> - <h1>Coverage for <b>m1</b> : - <span class='pc_cov'>100%</span> +<div id="header"> + <div class="content"> + <h1>Coverage for <b>m1.py</b> : + <span class="pc_cov">100%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> - <h2 class='stats'> + <h2 class="stats"> 2 statements - <span class='run hide_run shortkey_r button_toggle_run'>2 run</span> - <span class='mis shortkey_m button_toggle_mis'>0 missing</span> - <span class='exc shortkey_x button_toggle_exc'>0 excluded</span> + <span class="run hide_run shortkey_r button_toggle_run">2 run</span> + <span class="mis shortkey_m button_toggle_mis">0 missing</span> + <span class="exc shortkey_x button_toggle_exc">0 excluded</span> </h2> </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> -<p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk </p> </div> </div> -<div id='source'> +<div id="source"> <table> <tr> - <td class='linenos'> -<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 class="linenos"> +<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> +<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p> </td> - <td class='text'> -<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 class="text"> +<p id="t1" class="pln"><span class="com"># Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0</span><span class="strut"> </span></p> +<p id="t2" class="pln"><span class="com"># For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt</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="nam">m1a</span> <span class="op">=</span> <span class="num">1</span><span class="strut"> </span></p> +<p id="t5" 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'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="index.html">« index</a> <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:04 </p> </div> </div> diff --git a/tests/farm/html/gold_omit_4/m3_py.html b/tests/farm/html/gold_omit_4/m3_py.html index 67354c48..b372a96e 100644 --- a/tests/farm/html/gold_omit_4/m3_py.html +++ b/tests/farm/html/gold_omit_4/m3_py.html @@ -1,86 +1,96 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <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'> + <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" /> + <title>Coverage for m3.py: 100%</title> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.pyfile_ready); </script> </head> -<body class='pyfile'> +<body class="pyfile"> -<div id='header'> - <div class='content'> - <h1>Coverage for <b>m3</b> : - <span class='pc_cov'>100%</span> +<div id="header"> + <div class="content"> + <h1>Coverage for <b>m3.py</b> : + <span class="pc_cov">100%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> - <h2 class='stats'> + <h2 class="stats"> 2 statements - <span class='run hide_run shortkey_r button_toggle_run'>2 run</span> - <span class='mis shortkey_m button_toggle_mis'>0 missing</span> - <span class='exc shortkey_x button_toggle_exc'>0 excluded</span> + <span class="run hide_run shortkey_r button_toggle_run">2 run</span> + <span class="mis shortkey_m button_toggle_mis">0 missing</span> + <span class="exc shortkey_x button_toggle_exc">0 excluded</span> </h2> </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> -<p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk </p> </div> </div> -<div id='source'> +<div id="source"> <table> <tr> - <td class='linenos'> -<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 class="linenos"> +<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> +<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p> </td> - <td class='text'> -<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 class="text"> +<p id="t1" class="pln"><span class="com"># Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0</span><span class="strut"> </span></p> +<p id="t2" class="pln"><span class="com"># For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt</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="nam">m3a</span> <span class="op">=</span> <span class="num">1</span><span class="strut"> </span></p> +<p id="t5" 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'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="index.html">« index</a> <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:04 </p> </div> </div> diff --git a/tests/farm/html/gold_omit_4/main_py.html b/tests/farm/html/gold_omit_4/main_py.html index a71b10e4..ba6e9680 100644 --- a/tests/farm/html/gold_omit_4/main_py.html +++ b/tests/farm/html/gold_omit_4/main_py.html @@ -1,102 +1,112 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <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'> + <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" /> + <title>Coverage for main.py: 100%</title> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.pyfile_ready); </script> </head> -<body class='pyfile'> +<body class="pyfile"> -<div id='header'> - <div class='content'> - <h1>Coverage for <b>main</b> : - <span class='pc_cov'>100%</span> +<div id="header"> + <div class="content"> + <h1>Coverage for <b>main.py</b> : + <span class="pc_cov">100%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> - <h2 class='stats'> + <h2 class="stats"> 8 statements - <span class='run hide_run shortkey_r button_toggle_run'>8 run</span> - <span class='mis shortkey_m button_toggle_mis'>0 missing</span> - <span class='exc shortkey_x button_toggle_exc'>0 excluded</span> + <span class="run hide_run shortkey_r button_toggle_run">8 run</span> + <span class="mis shortkey_m button_toggle_mis">0 missing</span> + <span class="exc shortkey_x button_toggle_exc">0 excluded</span> </h2> </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> -<p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk </p> </div> </div> -<div id='source'> +<div id="source"> <table> <tr> - <td class='linenos'> -<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 class="linenos"> +<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> +<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="pln"><a href="#n10">10</a></p> +<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p> +<p id="n12" class="stm run hide_run"><a href="#n12">12</a></p> +<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p> </td> - <td class='text'> -<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 class="text"> +<p id="t1" class="pln"><span class="com"># Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0</span><span class="strut"> </span></p> +<p id="t2" class="pln"><span class="com"># For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt</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">import</span> <span class="nam">m1</span><span class="strut"> </span></p> +<p id="t5" class="stm run hide_run"><span class="key">import</span> <span class="nam">m2</span><span class="strut"> </span></p> +<p id="t6" class="stm run hide_run"><span class="key">import</span> <span class="nam">m3</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="nam">a</span> <span class="op">=</span> <span class="num">5</span><span class="strut"> </span></p> +<p id="t9" 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="t10" class="pln"><span class="strut"> </span></p> +<p id="t11" 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="t12" 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="t13" 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'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="index.html">« index</a> <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:04 </p> </div> </div> diff --git a/tests/farm/html/gold_omit_5/index.html b/tests/farm/html/gold_omit_5/index.html index 66306a29..5e9a2413 100644 --- a/tests/farm/html/gold_omit_5/index.html +++ b/tests/farm/html/gold_omit_5/index.html @@ -1,28 +1,31 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Coverage report</title> - <link rel='stylesheet' href='style.css' type='text/css'> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.debounce.min.js'></script> - <script type='text/javascript' src='jquery.tablesorter.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.debounce.min.js"></script> + <script type="text/javascript" src="jquery.tablesorter.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.index_ready); </script> </head> -<body class='indexfile'> +<body class="indexfile"> -<div id='header'> - <div class='content'> +<div id="header"> + <div class="content"> <h1>Coverage report: - <span class='pc_cov'>100%</span> + <span class="pc_cov">100%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> <form id="filter_container"> <input id="filter" type="text" value="" placeholder="filter..." /> @@ -30,63 +33,63 @@ </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> - <p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> + <p class="legend">Hot-keys on this page</p> <div> - <p class='keyhelp'> - <span class='key'>n</span> - <span class='key'>s</span> - <span class='key'>m</span> - <span class='key'>x</span> + <p class="keyhelp"> + <span class="key">n</span> + <span class="key">s</span> + <span class="key">m</span> + <span class="key">x</span> - <span class='key'>c</span> change column sorting + <span class="key">c</span> change column sorting </p> </div> </div> -<div id='index'> - <table class='index'> +<div id="index"> + <table class="index"> <thead> - <tr class='tablehead' title='Click to sort'> - <th class='name left headerSortDown shortkey_n'>Module</th> - <th class='shortkey_s'>statements</th> - <th class='shortkey_m'>missing</th> - <th class='shortkey_x'>excluded</th> + <tr class="tablehead" title="Click to sort"> + <th class="name left headerSortDown shortkey_n">Module</th> + <th class="shortkey_s">statements</th> + <th class="shortkey_m">missing</th> + <th class="shortkey_x">excluded</th> - <th class='right shortkey_c'>coverage</th> + <th class="right shortkey_c">coverage</th> </tr> </thead> <tfoot> - <tr class='total'> - <td class='name left'>Total</td> + <tr class="total"> + <td class="name left">Total</td> <td>10</td> <td>0</td> <td>0</td> - <td class='right' data-ratio='10 10'>100%</td> + <td class="right" data-ratio="10 10">100%</td> </tr> </tfoot> <tbody> - <tr class='file'> - <td class='name left'><a href='m1.html'>m1</a></td> + <tr class="file"> + <td class="name left"><a href="m1_py.html">m1.py</a></td> <td>2</td> <td>0</td> <td>0</td> - <td class='right' data-ratio='2 2'>100%</td> + <td class="right" data-ratio="2 2">100%</td> </tr> - <tr class='file'> - <td class='name left'><a href='main.html'>main</a></td> + <tr class="file"> + <td class="name left"><a href="main_py.html">main.py</a></td> <td>8</td> <td>0</td> <td>0</td> - <td class='right' data-ratio='8 8'>100%</td> + <td class="right" data-ratio="8 8">100%</td> </tr> </tbody> @@ -97,10 +100,11 @@ </p> </div> -<div id='footer'> - <div class='content'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:31 </p> </div> </div> diff --git a/tests/farm/html/gold_omit_5/m1_py.html b/tests/farm/html/gold_omit_5/m1_py.html index de44f789..8df0bf51 100644 --- a/tests/farm/html/gold_omit_5/m1_py.html +++ b/tests/farm/html/gold_omit_5/m1_py.html @@ -1,86 +1,96 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <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'> + <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" /> + <title>Coverage for m1.py: 100%</title> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.pyfile_ready); </script> </head> -<body class='pyfile'> +<body class="pyfile"> -<div id='header'> - <div class='content'> - <h1>Coverage for <b>m1</b> : - <span class='pc_cov'>100%</span> +<div id="header"> + <div class="content"> + <h1>Coverage for <b>m1.py</b> : + <span class="pc_cov">100%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> - <h2 class='stats'> + <h2 class="stats"> 2 statements - <span class='run hide_run shortkey_r button_toggle_run'>2 run</span> - <span class='mis shortkey_m button_toggle_mis'>0 missing</span> - <span class='exc shortkey_x button_toggle_exc'>0 excluded</span> + <span class="run hide_run shortkey_r button_toggle_run">2 run</span> + <span class="mis shortkey_m button_toggle_mis">0 missing</span> + <span class="exc shortkey_x button_toggle_exc">0 excluded</span> </h2> </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> -<p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk </p> </div> </div> -<div id='source'> +<div id="source"> <table> <tr> - <td class='linenos'> -<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 class="linenos"> +<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> +<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p> </td> - <td class='text'> -<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 class="text"> +<p id="t1" class="pln"><span class="com"># Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0</span><span class="strut"> </span></p> +<p id="t2" class="pln"><span class="com"># For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt</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="nam">m1a</span> <span class="op">=</span> <span class="num">1</span><span class="strut"> </span></p> +<p id="t5" 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'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="index.html">« index</a> <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:04 </p> </div> </div> diff --git a/tests/farm/html/gold_omit_5/main_py.html b/tests/farm/html/gold_omit_5/main_py.html index a71b10e4..ba6e9680 100644 --- a/tests/farm/html/gold_omit_5/main_py.html +++ b/tests/farm/html/gold_omit_5/main_py.html @@ -1,102 +1,112 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <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'> + <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" /> + <title>Coverage for main.py: 100%</title> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.pyfile_ready); </script> </head> -<body class='pyfile'> +<body class="pyfile"> -<div id='header'> - <div class='content'> - <h1>Coverage for <b>main</b> : - <span class='pc_cov'>100%</span> +<div id="header"> + <div class="content"> + <h1>Coverage for <b>main.py</b> : + <span class="pc_cov">100%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> - <h2 class='stats'> + <h2 class="stats"> 8 statements - <span class='run hide_run shortkey_r button_toggle_run'>8 run</span> - <span class='mis shortkey_m button_toggle_mis'>0 missing</span> - <span class='exc shortkey_x button_toggle_exc'>0 excluded</span> + <span class="run hide_run shortkey_r button_toggle_run">8 run</span> + <span class="mis shortkey_m button_toggle_mis">0 missing</span> + <span class="exc shortkey_x button_toggle_exc">0 excluded</span> </h2> </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> -<p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk </p> </div> </div> -<div id='source'> +<div id="source"> <table> <tr> - <td class='linenos'> -<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 class="linenos"> +<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> +<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="pln"><a href="#n10">10</a></p> +<p id="n11" class="stm run hide_run"><a href="#n11">11</a></p> +<p id="n12" class="stm run hide_run"><a href="#n12">12</a></p> +<p id="n13" class="stm run hide_run"><a href="#n13">13</a></p> </td> - <td class='text'> -<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 class="text"> +<p id="t1" class="pln"><span class="com"># Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0</span><span class="strut"> </span></p> +<p id="t2" class="pln"><span class="com"># For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt</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">import</span> <span class="nam">m1</span><span class="strut"> </span></p> +<p id="t5" class="stm run hide_run"><span class="key">import</span> <span class="nam">m2</span><span class="strut"> </span></p> +<p id="t6" class="stm run hide_run"><span class="key">import</span> <span class="nam">m3</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="nam">a</span> <span class="op">=</span> <span class="num">5</span><span class="strut"> </span></p> +<p id="t9" 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="t10" class="pln"><span class="strut"> </span></p> +<p id="t11" 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="t12" 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="t13" 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'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="index.html">« index</a> <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:04 </p> </div> </div> diff --git a/tests/farm/html/gold_other/blah_blah_other_py.html b/tests/farm/html/gold_other/blah_blah_other_py.html index f070f3ef..51b7708e 100644 --- a/tests/farm/html/gold_other/blah_blah_other_py.html +++ b/tests/farm/html/gold_other/blah_blah_other_py.html @@ -1,90 +1,100 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> - <meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' /> - <title>Coverage for /Users/ned/coverage/trunk/tests/farm/html/othersrc/other: 100%</title> - <link rel='stylesheet' href='style.css' type='text/css'> + <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" /> + <title>Coverage for /Users/ned/coverage/trunk/tests/farm/html/othersrc/other.py: 100%</title> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.pyfile_ready); </script> </head> -<body class='pyfile'> +<body class="pyfile"> -<div id='header'> - <div class='content'> - <h1>Coverage for <b>/Users/ned/coverage/trunk/tests/farm/html/othersrc/other</b> : - <span class='pc_cov'>100%</span> +<div id="header"> + <div class="content"> + <h1>Coverage for <b>/Users/ned/coverage/trunk/tests/farm/html/othersrc/other.py</b> : + <span class="pc_cov">100%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> - <h2 class='stats'> + <h2 class="stats"> 1 statements - <span class='run hide_run shortkey_r button_toggle_run'>1 run</span> - <span class='mis shortkey_m button_toggle_mis'>0 missing</span> - <span class='exc shortkey_x button_toggle_exc'>0 excluded</span> + <span class="run hide_run shortkey_r button_toggle_run">1 run</span> + <span class="mis shortkey_m button_toggle_mis">0 missing</span> + <span class="exc shortkey_x button_toggle_exc">0 excluded</span> </h2> </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> -<p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk </p> </div> </div> -<div id='source'> +<div id="source"> <table> <tr> - <td class='linenos'> -<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 class="linenos"> +<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="pln"><a href="#n4">4</a></p> +<p id="n5" class="pln"><a href="#n5">5</a></p> +<p id="n6" class="pln"><a href="#n6">6</a></p> +<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p> </td> - <td class='text'> -<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 class="text"> +<p id="t1" class="pln"><span class="com"># Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0</span><span class="strut"> </span></p> +<p id="t2" class="pln"><span class="com"># For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt</span><span class="strut"> </span></p> +<p id="t3" class="pln"><span class="strut"> </span></p> +<p id="t4" 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="t5" class="pln"><span class="com"># HTML report.</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">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'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="index.html">« index</a> <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:04 </p> </div> </div> diff --git a/tests/farm/html/gold_other/here_py.html b/tests/farm/html/gold_other/here_py.html index e091395a..36310f5b 100644 --- a/tests/farm/html/gold_other/here_py.html +++ b/tests/farm/html/gold_other/here_py.html @@ -1,98 +1,108 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <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'> + <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" /> + <title>Coverage for here.py: 75%</title> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.pyfile_ready); </script> </head> -<body class='pyfile'> +<body class="pyfile"> -<div id='header'> - <div class='content'> - <h1>Coverage for <b>here</b> : - <span class='pc_cov'>75%</span> +<div id="header"> + <div class="content"> + <h1>Coverage for <b>here.py</b> : + <span class="pc_cov">75%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> - <h2 class='stats'> + <h2 class="stats"> 4 statements - <span class='run hide_run shortkey_r button_toggle_run'>3 run</span> - <span class='mis shortkey_m button_toggle_mis'>1 missing</span> - <span class='exc shortkey_x button_toggle_exc'>0 excluded</span> + <span class="run hide_run shortkey_r button_toggle_run">3 run</span> + <span class="mis shortkey_m button_toggle_mis">1 missing</span> + <span class="exc shortkey_x button_toggle_exc">0 excluded</span> </h2> </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> -<p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk </p> </div> </div> -<div id='source'> +<div id="source"> <table> <tr> - <td class='linenos'> -<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 class="linenos"> +<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="pln"><a href="#n4">4</a></p> +<p id="n5" class="pln"><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="pln"><a href="#n10">10</a></p> +<p id="n11" class="stm mis"><a href="#n11">11</a></p> </td> - <td class='text'> -<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 class="text"> +<p id="t1" class="pln"><span class="com"># Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0</span><span class="strut"> </span></p> +<p id="t2" class="pln"><span class="com"># For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt</span><span class="strut"> </span></p> +<p id="t3" class="pln"><span class="strut"> </span></p> +<p id="t4" class="pln"><span class="com"># A test file for HTML reporting by coverage.py.</span><span class="strut"> </span></p> +<p id="t5" class="pln"><span class="strut"> </span></p> +<p id="t6" class="stm run hide_run"><span class="key">import</span> <span class="nam">other</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">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="t9" 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="t10" class="pln"><span class="key">else</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t11" 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'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="index.html">« index</a> <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:04 </p> </div> </div> diff --git a/tests/farm/html/gold_other/index.html b/tests/farm/html/gold_other/index.html index a27295c4..25d437e9 100644 --- a/tests/farm/html/gold_other/index.html +++ b/tests/farm/html/gold_other/index.html @@ -1,28 +1,31 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Coverage report</title> - <link rel='stylesheet' href='style.css' type='text/css'> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.debounce.min.js'></script> - <script type='text/javascript' src='jquery.tablesorter.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.debounce.min.js"></script> + <script type="text/javascript" src="jquery.tablesorter.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.index_ready); </script> </head> -<body class='indexfile'> +<body class="indexfile"> -<div id='header'> - <div class='content'> +<div id="header"> + <div class="content"> <h1>Coverage report: - <span class='pc_cov'>80%</span> + <span class="pc_cov">80%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> <form id="filter_container"> <input id="filter" type="text" value="" placeholder="filter..." /> @@ -30,63 +33,63 @@ </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> - <p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> + <p class="legend">Hot-keys on this page</p> <div> - <p class='keyhelp'> - <span class='key'>n</span> - <span class='key'>s</span> - <span class='key'>m</span> - <span class='key'>x</span> + <p class="keyhelp"> + <span class="key">n</span> + <span class="key">s</span> + <span class="key">m</span> + <span class="key">x</span> - <span class='key'>c</span> change column sorting + <span class="key">c</span> change column sorting </p> </div> </div> -<div id='index'> - <table class='index'> +<div id="index"> + <table class="index"> <thead> - <tr class='tablehead' title='Click to sort'> - <th class='name left headerSortDown shortkey_n'>Module</th> - <th class='shortkey_s'>statements</th> - <th class='shortkey_m'>missing</th> - <th class='shortkey_x'>excluded</th> + <tr class="tablehead" title="Click to sort"> + <th class="name left headerSortDown shortkey_n">Module</th> + <th class="shortkey_s">statements</th> + <th class="shortkey_m">missing</th> + <th class="shortkey_x">excluded</th> - <th class='right shortkey_c'>coverage</th> + <th class="right shortkey_c">coverage</th> </tr> </thead> <tfoot> - <tr class='total'> - <td class='name left'>Total</td> + <tr class="total"> + <td class="name left">Total</td> <td>5</td> <td>1</td> <td>0</td> - <td class='right' data-ratio='4 5'>80%</td> + <td class="right" data-ratio="4 5">80%</td> </tr> </tfoot> <tbody> - <tr class='file'> - <td class='name left'><a href='_Users_ned_coverage_trunk_tests_farm_html_othersrc_other.html'>/Users/ned/coverage/trunk/tests/farm/html/othersrc/other</a></td> + <tr class="file"> + <td class="name left"><a href="_Users_ned_coverage_trunk_tests_farm_html_othersrc_other_py.html">/Users/ned/coverage/trunk/tests/farm/html/othersrc/other.py</a></td> <td>1</td> <td>0</td> <td>0</td> - <td class='right' data-ratio='1 1'>100%</td> + <td class="right" data-ratio="1 1">100%</td> </tr> - <tr class='file'> - <td class='name left'><a href='here.html'>here</a></td> + <tr class="file"> + <td class="name left"><a href="here_py.html">here.py</a></td> <td>4</td> <td>1</td> <td>0</td> - <td class='right' data-ratio='3 4'>75%</td> + <td class="right" data-ratio="3 4">75%</td> </tr> </tbody> @@ -97,10 +100,11 @@ </p> </div> -<div id='footer'> - <div class='content'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:31 </p> </div> </div> diff --git a/tests/farm/html/gold_partial/index.html b/tests/farm/html/gold_partial/index.html index 5445d769..506d80d4 100644 --- a/tests/farm/html/gold_partial/index.html +++ b/tests/farm/html/gold_partial/index.html @@ -1,28 +1,31 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Coverage report</title> - <link rel='stylesheet' href='style.css' type='text/css'> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.debounce.min.js'></script> - <script type='text/javascript' src='jquery.tablesorter.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.debounce.min.js"></script> + <script type="text/javascript" src="jquery.tablesorter.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.index_ready); </script> </head> -<body class='indexfile'> +<body class="indexfile"> -<div id='header'> - <div class='content'> +<div id="header"> + <div class="content"> <h1>Coverage report: - <span class='pc_cov'>100%</span> + <span class="pc_cov">100%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> <form id="filter_container"> <input id="filter" type="text" value="" placeholder="filter..." /> @@ -30,44 +33,44 @@ </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> - <p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> + <p class="legend">Hot-keys on this page</p> <div> - <p class='keyhelp'> - <span class='key'>n</span> - <span class='key'>s</span> - <span class='key'>m</span> - <span class='key'>x</span> + <p class="keyhelp"> + <span class="key">n</span> + <span class="key">s</span> + <span class="key">m</span> + <span class="key">x</span> - <span class='key'>b</span> - <span class='key'>p</span> + <span class="key">b</span> + <span class="key">p</span> - <span class='key'>c</span> change column sorting + <span class="key">c</span> change column sorting </p> </div> </div> -<div id='index'> - <table class='index'> +<div id="index"> + <table class="index"> <thead> - <tr class='tablehead' title='Click to sort'> - <th class='name left headerSortDown shortkey_n'>Module</th> - <th class='shortkey_s'>statements</th> - <th class='shortkey_m'>missing</th> - <th class='shortkey_x'>excluded</th> + <tr class="tablehead" title="Click to sort"> + <th class="name left headerSortDown shortkey_n">Module</th> + <th class="shortkey_s">statements</th> + <th class="shortkey_m">missing</th> + <th class="shortkey_x">excluded</th> - <th class='shortkey_b'>branches</th> - <th class='shortkey_p'>partial</th> + <th class="shortkey_b">branches</th> + <th class="shortkey_p">partial</th> - <th class='right shortkey_c'>coverage</th> + <th class="right shortkey_c">coverage</th> </tr> </thead> <tfoot> - <tr class='total'> - <td class='name left'>Total</td> + <tr class="total"> + <td class="name left">Total</td> <td>8</td> <td>0</td> <td>0</td> @@ -75,13 +78,13 @@ <td>4</td> <td>0</td> - <td class='right' data-ratio='12 12'>100%</td> + <td class="right" data-ratio="12 12">100%</td> </tr> </tfoot> <tbody> - <tr class='file'> - <td class='name left'><a href='partial.html'>partial</a></td> + <tr class="file"> + <td class="name left"><a href="partial_py.html">partial.py</a></td> <td>8</td> <td>0</td> <td>0</td> @@ -89,7 +92,7 @@ <td>4</td> <td>0</td> - <td class='right' data-ratio='12 12'>100%</td> + <td class="right" data-ratio="12 12">100%</td> </tr> </tbody> @@ -100,10 +103,11 @@ </p> </div> -<div id='footer'> - <div class='content'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:31 </p> </div> </div> diff --git a/tests/farm/html/gold_partial/partial_py.html b/tests/farm/html/gold_partial/partial_py.html index 64dfacfa..53997f57 100644 --- a/tests/farm/html/gold_partial/partial_py.html +++ b/tests/farm/html/gold_partial/partial_py.html @@ -1,120 +1,130 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> - <meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' /> - <title>Coverage for partial: 100%</title> - <link rel='stylesheet' href='style.css' type='text/css'> + <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" /> + <title>Coverage for partial.py: 100%</title> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.pyfile_ready); </script> </head> -<body class='pyfile'> +<body class="pyfile"> -<div id='header'> - <div class='content'> - <h1>Coverage for <b>partial</b> : - <span class='pc_cov'>100%</span> +<div id="header"> + <div class="content"> + <h1>Coverage for <b>partial.py</b> : + <span class="pc_cov">100%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> - <h2 class='stats'> + <h2 class="stats"> 8 statements - <span class='run hide_run shortkey_r button_toggle_run'>8 run</span> - <span class='mis shortkey_m button_toggle_mis'>0 missing</span> - <span class='exc shortkey_x button_toggle_exc'>0 excluded</span> + <span class="run hide_run shortkey_r button_toggle_run">8 run</span> + <span class="mis shortkey_m button_toggle_mis">0 missing</span> + <span class="exc shortkey_x button_toggle_exc">0 excluded</span> - <span class='par run hide_run shortkey_p button_toggle_par'>0 partial</span> + <span class="par run hide_run shortkey_p button_toggle_par">0 partial</span> </h2> </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> -<p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk </p> </div> </div> -<div id='source'> +<div id="source"> <table> <tr> - <td class='linenos'> -<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 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='pln'><a href='#n10'>10</a></p> -<p id='n11' class='stm run hide_run'><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='pln'><a href='#n14'>14</a></p> -<p id='n15' class='pln'><a href='#n15'>15</a></p> -<p id='n16' class='pln'><a href='#n16'>16</a></p> -<p id='n17' class='pln'><a href='#n17'>17</a></p> -<p id='n18' class='stm run hide_run'><a href='#n18'>18</a></p> + <td class="linenos"> +<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="pln"><a href="#n4">4</a></p> +<p id="n5" class="pln"><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="pln"><a href="#n10">10</a></p> +<p id="n11" class="stm run hide_run"><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 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="pln"><a href="#n17">17</a></p> +<p id="n18" class="pln"><a href="#n18">18</a></p> +<p id="n19" class="pln"><a href="#n19">19</a></p> +<p id="n20" class="pln"><a href="#n20">20</a></p> +<p id="n21" class="stm run hide_run"><a href="#n21">21</a></p> </td> - <td class='text'> -<p id='t1' class='pln'><span class='com'># partial branches</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='nam'>a</span> <span class='op'>=</span> <span class='num'>3</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'>while</span> <span class='nam'>True</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t6' class='stm run hide_run'> <span class='key'>break</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'>while</span> <span class='num'>1</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t9' class='stm run hide_run'> <span class='key'>break</span><span class='strut'> </span></p> -<p id='t10' class='pln'><span class='strut'> </span></p> -<p id='t11' class='stm run hide_run'><span class='key'>while</span> <span class='nam'>a</span><span class='op'>:</span> <span class='com'># pragma: no branch</span><span class='strut'> </span></p> -<p id='t12' class='stm run hide_run'> <span class='key'>break</span><span class='strut'> </span></p> -<p id='t13' class='pln'><span class='strut'> </span></p> -<p id='t14' class='pln'><span class='key'>if</span> <span class='num'>0</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t15' class='pln'> <span class='nam'>never_happen</span><span class='op'>(</span><span class='op'>)</span><span class='strut'> </span></p> -<p id='t16' class='pln'><span class='strut'> </span></p> -<p id='t17' class='pln'><span class='key'>if</span> <span class='num'>1</span><span class='op'>:</span><span class='strut'> </span></p> -<p id='t18' class='stm run hide_run'> <span class='nam'>a</span> <span class='op'>=</span> <span class='num'>13</span><span class='strut'> </span></p> + <td class="text"> +<p id="t1" class="pln"><span class="com"># Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0</span><span class="strut"> </span></p> +<p id="t2" class="pln"><span class="com"># For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt</span><span class="strut"> </span></p> +<p id="t3" class="pln"><span class="strut"> </span></p> +<p id="t4" class="pln"><span class="com"># partial branches</span><span class="strut"> </span></p> +<p id="t5" class="pln"><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="strut"> </span></p> +<p id="t8" class="stm run hide_run"><span class="key">while</span> <span class="nam">True</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t9" class="stm run hide_run"> <span class="key">break</span><span class="strut"> </span></p> +<p id="t10" class="pln"><span class="strut"> </span></p> +<p id="t11" class="stm run hide_run"><span class="key">while</span> <span class="num">1</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t12" class="stm run hide_run"> <span class="key">break</span><span class="strut"> </span></p> +<p id="t13" class="pln"><span class="strut"> </span></p> +<p id="t14" class="stm run hide_run"><span class="key">while</span> <span class="nam">a</span><span class="op">:</span> <span class="com"># pragma: no branch</span><span class="strut"> </span></p> +<p id="t15" class="stm run hide_run"> <span class="key">break</span><span class="strut"> </span></p> +<p id="t16" class="pln"><span class="strut"> </span></p> +<p id="t17" class="pln"><span class="key">if</span> <span class="num">0</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t18" class="pln"> <span class="nam">never_happen</span><span class="op">(</span><span class="op">)</span><span class="strut"> </span></p> +<p id="t19" class="pln"><span class="strut"> </span></p> +<p id="t20" class="pln"><span class="key">if</span> <span class="num">1</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t21" class="stm run hide_run"> <span class="nam">a</span> <span class="op">=</span> <span class="num">13</span><span class="strut"> </span></p> </td> </tr> </table> </div> -<div id='footer'> - <div class='content'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="index.html">« index</a> <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:04 </p> </div> </div> diff --git a/tests/farm/html/gold_styled/a_py.html b/tests/farm/html/gold_styled/a_py.html index 9fdaee17..890a8268 100644 --- a/tests/farm/html/gold_styled/a_py.html +++ b/tests/farm/html/gold_styled/a_py.html @@ -1,98 +1,108 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <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'> + <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" /> + <title>Coverage for a.py: 67%</title> + <link rel="stylesheet" href="style.css" type="text/css"> - <link rel='stylesheet' href='extra.css' type='text/css'> + <link rel="stylesheet" href="extra.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.pyfile_ready); </script> </head> -<body class='pyfile'> +<body class="pyfile"> -<div id='header'> - <div class='content'> - <h1>Coverage for <b>a</b> : - <span class='pc_cov'>67%</span> +<div id="header"> + <div class="content"> + <h1>Coverage for <b>a.py</b> : + <span class="pc_cov">67%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> - <h2 class='stats'> + <h2 class="stats"> 3 statements - <span class='run hide_run shortkey_r button_toggle_run'>2 run</span> - <span class='mis shortkey_m button_toggle_mis'>1 missing</span> - <span class='exc shortkey_x button_toggle_exc'>0 excluded</span> + <span class="run hide_run shortkey_r button_toggle_run">2 run</span> + <span class="mis shortkey_m button_toggle_mis">1 missing</span> + <span class="exc shortkey_x button_toggle_exc">0 excluded</span> </h2> </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> -<p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk </p> </div> </div> -<div id='source'> +<div id="source"> <table> <tr> - <td class='linenos'> -<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 class="linenos"> +<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="pln"><a href="#n4">4</a></p> +<p id="n5" class="pln"><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="pln"><a href="#n9">9</a></p> +<p id="n10" class="stm mis"><a href="#n10">10</a></p> </td> - <td class='text'> -<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 class="text"> +<p id="t1" class="pln"><span class="com"># Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0</span><span class="strut"> </span></p> +<p id="t2" class="pln"><span class="com"># For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt</span><span class="strut"> </span></p> +<p id="t3" class="pln"><span class="strut"> </span></p> +<p id="t4" class="pln"><span class="com"># A test file for HTML reporting by coverage.py.</span><span class="strut"> </span></p> +<p id="t5" class="pln"><span class="strut"> </span></p> +<p id="t6" 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="t7" class="pln"> <span class="com"># Needed a < to look at HTML entities.</span><span class="strut"> </span></p> +<p id="t8" 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="t9" class="pln"><span class="key">else</span><span class="op">:</span><span class="strut"> </span></p> +<p id="t10" 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'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="index.html">« index</a> <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:04 </p> </div> </div> diff --git a/tests/farm/html/gold_styled/index.html b/tests/farm/html/gold_styled/index.html index 87a8c3db..7209b64a 100644 --- a/tests/farm/html/gold_styled/index.html +++ b/tests/farm/html/gold_styled/index.html @@ -1,30 +1,33 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Coverage report</title> - <link rel='stylesheet' href='style.css' type='text/css'> + <link rel="stylesheet" href="style.css" type="text/css"> - <link rel='stylesheet' href='extra.css' type='text/css'> + <link rel="stylesheet" href="extra.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.debounce.min.js'></script> - <script type='text/javascript' src='jquery.tablesorter.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.debounce.min.js"></script> + <script type="text/javascript" src="jquery.tablesorter.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.index_ready); </script> </head> -<body class='indexfile'> +<body class="indexfile"> -<div id='header'> - <div class='content'> +<div id="header"> + <div class="content"> <h1>Coverage report: - <span class='pc_cov'>67%</span> + <span class="pc_cov">67%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> <form id="filter_container"> <input id="filter" type="text" value="" placeholder="filter..." /> @@ -32,54 +35,54 @@ </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> - <p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> + <p class="legend">Hot-keys on this page</p> <div> - <p class='keyhelp'> - <span class='key'>n</span> - <span class='key'>s</span> - <span class='key'>m</span> - <span class='key'>x</span> + <p class="keyhelp"> + <span class="key">n</span> + <span class="key">s</span> + <span class="key">m</span> + <span class="key">x</span> - <span class='key'>c</span> change column sorting + <span class="key">c</span> change column sorting </p> </div> </div> -<div id='index'> - <table class='index'> +<div id="index"> + <table class="index"> <thead> - <tr class='tablehead' title='Click to sort'> - <th class='name left headerSortDown shortkey_n'>Module</th> - <th class='shortkey_s'>statements</th> - <th class='shortkey_m'>missing</th> - <th class='shortkey_x'>excluded</th> + <tr class="tablehead" title="Click to sort"> + <th class="name left headerSortDown shortkey_n">Module</th> + <th class="shortkey_s">statements</th> + <th class="shortkey_m">missing</th> + <th class="shortkey_x">excluded</th> - <th class='right shortkey_c'>coverage</th> + <th class="right shortkey_c">coverage</th> </tr> </thead> <tfoot> - <tr class='total'> - <td class='name left'>Total</td> + <tr class="total"> + <td class="name left">Total</td> <td>3</td> <td>1</td> <td>0</td> - <td class='right' data-ratio='2 3'>67%</td> + <td class="right" data-ratio="2 3">67%</td> </tr> </tfoot> <tbody> - <tr class='file'> - <td class='name left'><a href='a.html'>a</a></td> + <tr class="file"> + <td class="name left"><a href="a_py.html">a.py</a></td> <td>3</td> <td>1</td> <td>0</td> - <td class='right' data-ratio='2 3'>67%</td> + <td class="right" data-ratio="2 3">67%</td> </tr> </tbody> @@ -90,10 +93,11 @@ </p> </div> -<div id='footer'> - <div class='content'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:31 </p> </div> </div> diff --git a/tests/farm/html/gold_styled/style.css b/tests/farm/html/gold_styled/style.css index 038335c1..2dfb8f65 100644 --- a/tests/farm/html/gold_styled/style.css +++ b/tests/farm/html/gold_styled/style.css @@ -1,4 +1,7 @@ -/* CSS styles for Coverage. */ +/* Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 */ +/* For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt */ + +/* CSS styles for coverage.py. */ /* Page-wide styles */ html, body, h1, h2, h3, p, table, td, th { margin: 0; diff --git a/tests/farm/html/gold_unicode/index.html b/tests/farm/html/gold_unicode/index.html index dae53ea0..58529525 100644 --- a/tests/farm/html/gold_unicode/index.html +++ b/tests/farm/html/gold_unicode/index.html @@ -1,28 +1,31 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Coverage report</title> - <link rel='stylesheet' href='style.css' type='text/css'> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.debounce.min.js'></script> - <script type='text/javascript' src='jquery.tablesorter.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.debounce.min.js"></script> + <script type="text/javascript" src="jquery.tablesorter.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.index_ready); </script> </head> -<body class='indexfile'> +<body class="indexfile"> -<div id='header'> - <div class='content'> +<div id="header"> + <div class="content"> <h1>Coverage report: - <span class='pc_cov'>100%</span> + <span class="pc_cov">100%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> <form id="filter_container"> <input id="filter" type="text" value="" placeholder="filter..." /> @@ -30,54 +33,54 @@ </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> - <p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> + <p class="legend">Hot-keys on this page</p> <div> - <p class='keyhelp'> - <span class='key'>n</span> - <span class='key'>s</span> - <span class='key'>m</span> - <span class='key'>x</span> + <p class="keyhelp"> + <span class="key">n</span> + <span class="key">s</span> + <span class="key">m</span> + <span class="key">x</span> - <span class='key'>c</span> change column sorting + <span class="key">c</span> change column sorting </p> </div> </div> -<div id='index'> - <table class='index'> +<div id="index"> + <table class="index"> <thead> - <tr class='tablehead' title='Click to sort'> - <th class='name left headerSortDown shortkey_n'>Module</th> - <th class='shortkey_s'>statements</th> - <th class='shortkey_m'>missing</th> - <th class='shortkey_x'>excluded</th> + <tr class="tablehead" title="Click to sort"> + <th class="name left headerSortDown shortkey_n">Module</th> + <th class="shortkey_s">statements</th> + <th class="shortkey_m">missing</th> + <th class="shortkey_x">excluded</th> - <th class='right shortkey_c'>coverage</th> + <th class="right shortkey_c">coverage</th> </tr> </thead> <tfoot> - <tr class='total'> - <td class='name left'>Total</td> + <tr class="total"> + <td class="name left">Total</td> <td>2</td> <td>0</td> <td>0</td> - <td class='right' data-ratio='2 2'>100%</td> + <td class="right" data-ratio="2 2">100%</td> </tr> </tfoot> <tbody> - <tr class='file'> - <td class='name left'><a href='unicode.html'>unicode</a></td> + <tr class="file"> + <td class="name left"><a href="unicode_py.html">unicode.py</a></td> <td>2</td> <td>0</td> <td>0</td> - <td class='right' data-ratio='2 2'>100%</td> + <td class="right" data-ratio="2 2">100%</td> </tr> </tbody> @@ -88,10 +91,11 @@ </p> </div> -<div id='footer'> - <div class='content'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:31 </p> </div> </div> diff --git a/tests/farm/html/gold_unicode/unicode_py.html b/tests/farm/html/gold_unicode/unicode_py.html index d67af56d..d0d58afc 100644 --- a/tests/farm/html/gold_unicode/unicode_py.html +++ b/tests/farm/html/gold_unicode/unicode_py.html @@ -1,92 +1,102 @@ + + + <!DOCTYPE html> <html> <head> - <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> - <meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' /> - <title>Coverage for unicode: 100%</title> - <link rel='stylesheet' href='style.css' type='text/css'> + <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" /> + <title>Coverage for unicode.py: 100%</title> + <link rel="stylesheet" href="style.css" type="text/css"> - <script type='text/javascript' src='jquery.min.js'></script> - <script type='text/javascript' src='jquery.hotkeys.js'></script> - <script type='text/javascript' src='jquery.isonscreen.js'></script> - <script type='text/javascript' src='coverage_html.js'></script> - <script type='text/javascript'> + <script type="text/javascript" src="jquery.min.js"></script> + <script type="text/javascript" src="jquery.hotkeys.js"></script> + <script type="text/javascript" src="jquery.isonscreen.js"></script> + <script type="text/javascript" src="coverage_html.js"></script> + <script type="text/javascript"> jQuery(document).ready(coverage.pyfile_ready); </script> </head> -<body class='pyfile'> +<body class="pyfile"> -<div id='header'> - <div class='content'> - <h1>Coverage for <b>unicode</b> : - <span class='pc_cov'>100%</span> +<div id="header"> + <div class="content"> + <h1>Coverage for <b>unicode.py</b> : + <span class="pc_cov">100%</span> </h1> - <img id='keyboard_icon' src='keybd_closed.png' alt='Show keyboard shortcuts' /> + <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" /> - <h2 class='stats'> + <h2 class="stats"> 2 statements - <span class='run hide_run shortkey_r button_toggle_run'>2 run</span> - <span class='mis shortkey_m button_toggle_mis'>0 missing</span> - <span class='exc shortkey_x button_toggle_exc'>0 excluded</span> + <span class="run hide_run shortkey_r button_toggle_run">2 run</span> + <span class="mis shortkey_m button_toggle_mis">0 missing</span> + <span class="exc shortkey_x button_toggle_exc">0 excluded</span> </h2> </div> </div> -<div class='help_panel'> - <img id='panel_icon' src='keybd_open.png' alt='Hide keyboard shortcuts' /> -<p class='legend'>Hot-keys on this page</p> +<div class="help_panel"> + <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" /> +<p class="legend">Hot-keys on this page</p> <div> -<p class='keyhelp'> - <span class='key'>r</span> - <span class='key'>m</span> - <span class='key'>x</span> - <span class='key'>p</span> toggle line displays +<p class="keyhelp"> + <span class="key">r</span> + <span class="key">m</span> + <span class="key">x</span> + <span class="key">p</span> toggle line displays </p> -<p class='keyhelp'> - <span class='key'>j</span> - <span class='key'>k</span> next/prev highlighted chunk +<p class="keyhelp"> + <span class="key">j</span> + <span class="key">k</span> next/prev highlighted chunk </p> -<p class='keyhelp'> - <span class='key'>0</span> (zero) top of page +<p class="keyhelp"> + <span class="key">0</span> (zero) top of page </p> -<p class='keyhelp'> - <span class='key'>1</span> (one) first highlighted chunk +<p class="keyhelp"> + <span class="key">1</span> (one) first highlighted chunk </p> </div> </div> -<div id='source'> +<div id="source"> <table> <tr> - <td class='linenos'> -<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> -<p id='n5' class='stm run hide_run'><a href='#n5'>5</a></p> + <td class="linenos"> +<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="pln"><a href="#n4">4</a></p> +<p id="n5" class="pln"><a href="#n5">5</a></p> +<p id="n6" class="pln"><a href="#n6">6</a></p> +<p id="n7" class="stm run hide_run"><a href="#n7">7</a></p> +<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p> </td> - <td class='text'> -<p id='t1' class='pln'><span class='com'># A python source file with exotic characters</span><span class='strut'> </span></p> -<p id='t2' class='pln'><span class='com'># -*- coding: utf-8 -*-</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='nam'>upside_down</span> <span class='op'>=</span> <span class='str'>"ʎd˙ǝbɐɹǝʌoɔ"</span><span class='strut'> </span></p> -<p id='t5' class='stm run hide_run'><span class='nam'>surrogate</span> <span class='op'>=</span> <span class='str'>"db40,dd00: x󠄀"</span><span class='strut'> </span></p> + <td class="text"> +<p id="t1" class="pln"><span class="com"># -*- coding: utf-8 -*-</span><span class="strut"> </span></p> +<p id="t2" class="pln"><span class="com"># Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0</span><span class="strut"> </span></p> +<p id="t3" class="pln"><span class="com"># For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt</span><span class="strut"> </span></p> +<p id="t4" class="pln"><span class="strut"> </span></p> +<p id="t5" class="pln"><span class="com"># A Python source file with exotic characters.</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="nam">upside_down</span> <span class="op">=</span> <span class="str">"ʎd˙ǝbɐɹǝʌoɔ"</span><span class="strut"> </span></p> +<p id="t8" class="stm run hide_run"><span class="nam">surrogate</span> <span class="op">=</span> <span class="str">"db40,dd00: x󠄀"</span><span class="strut"> </span></p> </td> </tr> </table> </div> -<div id='footer'> - <div class='content'> +<div id="footer"> + <div class="content"> <p> - <a class='nav' href='index.html'>« index</a> <a class='nav' href='http://nedbatchelder.com/code/coverage/4.0a1'>coverage.py v4.0a1</a> + <a class="nav" href="index.html">« index</a> <a class="nav" href="https://coverage.readthedocs.org/en/coverage-4.0a7">coverage.py v4.0a7</a>, + created at 2015-07-24 09:04 </p> </div> </div> diff --git a/tests/farm/html/gold_x_xml/coverage.xml b/tests/farm/html/gold_x_xml/coverage.xml index 1511ae89..487e850d 100644 --- a/tests/farm/html/gold_x_xml/coverage.xml +++ b/tests/farm/html/gold_x_xml/coverage.xml @@ -1,23 +1,22 @@ -<?xml version="1.0" ?>
-<!DOCTYPE coverage
- SYSTEM 'http://cobertura.sourceforge.net/xml/coverage-03.dtd'>
-<coverage branch-rate="0" line-rate="0.6667" timestamp="1253972570431" version="3.1b1">
- <!-- Generated by coverage.py: https://coverage.readthedocs.org/VER -->
- <sources>
- <source></source>
- </sources>
- <packages>
- <package branch-rate="0" complexity="0" line-rate="0.6667" name=".">
- <classes>
- <class branch-rate="0" complexity="0" filename="a.py" line-rate="0.6667" name="a.py">
- <methods/>
- <lines>
- <line hits="1" number="3"/>
- <line hits="1" number="5"/>
- <line hits="0" number="7"/>
- </lines>
- </class>
- </classes>
- </package>
- </packages>
-</coverage>
+<?xml version="1.0" ?> +<coverage branch-rate="0" line-rate="0.6667" timestamp="1437745880639" version="4.0a7"> + <!-- Generated by coverage.py: https://coverage.readthedocs.org/en/coverage-4.0a7 --> + <!-- Based on https://raw.githubusercontent.com/cobertura/web/f0366e5e2cf18f111cbd61fc34ef720a6584ba02/htdocs/xml/coverage-03.dtd --> + <sources> + <source>/Users/ned/coverage/trunk/tests/farm/html/src</source> + </sources> + <packages> + <package branch-rate="0" complexity="0" line-rate="0.6667" name="."> + <classes> + <class branch-rate="0" complexity="0" filename="a.py" line-rate="0.6667" name="a.py"> + <methods/> + <lines> + <line hits="1" number="6"/> + <line hits="1" number="8"/> + <line hits="0" number="10"/> + </lines> + </class> + </classes> + </package> + </packages> +</coverage> diff --git a/tests/farm/html/gold_y_xml_branch/coverage.xml b/tests/farm/html/gold_y_xml_branch/coverage.xml index 8e098fe8..a6acbfa1 100644 --- a/tests/farm/html/gold_y_xml_branch/coverage.xml +++ b/tests/farm/html/gold_y_xml_branch/coverage.xml @@ -1,25 +1,24 @@ -<?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: https://coverage.readthedocs.org/VER -->
- <sources>
- <source></source>
- </sources>
- <packages>
- <package branch-rate="0.5" complexity="0" line-rate="0.8" name=".">
- <classes>
- <class branch-rate="0.5" complexity="0" filename="y.py" line-rate="0.8" name="y.py">
- <methods/>
- <lines>
- <line hits="1" number="3"/>
- <line branch="true" condition-coverage="50% (1/2)" 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>
+<?xml version="1.0" ?> +<coverage branch-rate="0.5" line-rate="0.8" timestamp="1437745880882" version="4.0a7"> + <!-- Generated by coverage.py: https://coverage.readthedocs.org/en/coverage-4.0a7 --> + <!-- Based on https://raw.githubusercontent.com/cobertura/web/f0366e5e2cf18f111cbd61fc34ef720a6584ba02/htdocs/xml/coverage-03.dtd --> + <sources> + <source>/Users/ned/coverage/trunk/tests/farm/html/src</source> + </sources> + <packages> + <package branch-rate="0.5" complexity="0" line-rate="0.8" name="."> + <classes> + <class branch-rate="0.5" complexity="0" filename="y.py" line-rate="0.8" name="y.py"> + <methods/> + <lines> + <line hits="1" number="6"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="10" number="7"/> + <line hits="1" number="8"/> + <line hits="0" number="10"/> + <line hits="1" number="12"/> + </lines> + </class> + </classes> + </package> + </packages> +</coverage> diff --git a/tests/farm/html/othersrc/other.py b/tests/farm/html/othersrc/other.py index 6d3f86e7..bf0304d2 100644 --- a/tests/farm/html/othersrc/other.py +++ b/tests/farm/html/othersrc/other.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + # A file in another directory. We're checking that it ends up in the # HTML report. diff --git a/tests/farm/html/run_a.py b/tests/farm/html/run_a.py deleted file mode 100644 index f510e117..00000000 --- a/tests/farm/html/run_a.py +++ /dev/null @@ -1,26 +0,0 @@ -def html_it(): - """Run coverage and make an HTML report for a.""" - import coverage - cov = coverage.coverage() - cov.start() - import a # pragma: nested - cov.stop() # pragma: nested - 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_a", size_within=10, file_pattern="*.html") -contains("html_a/a_py.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_a/index.html", - '<a href="a_py.html">a.py</a>', - '<span class="pc_cov">67%</span>', - '<td class="right" data-ratio="2 3">67%</td>', - ) - -clean("html_a") diff --git a/tests/farm/html/run_a_xml_1.py b/tests/farm/html/run_a_xml_1.py deleted file mode 100644 index 593beae2..00000000 --- a/tests/farm/html/run_a_xml_1.py +++ /dev/null @@ -1,26 +0,0 @@ -source_path = None - -def html_it(): - """Run coverage and make an XML report for a.""" - import coverage - cov = coverage.coverage() - cov.start() - import a # pragma: nested - cov.stop() # pragma: nested - cov.xml_report(a, outfile="../xml_1/coverage.xml") - global source_path - source_path = cov.file_locator.relative_dir.rstrip('/') - -import os -if not os.path.exists("xml_1"): - os.makedirs("xml_1") - -runfunc(html_it, rundir="src") - -compare("gold_x_xml", "xml_1", scrubs=[ - (r' timestamp="\d+"', ' timestamp="TIMESTAMP"'), - (r' version="[-.\w]+"', ' version="VERSION"'), - (r'<source>\s*.*?\s*</source>', '<source>%s</source>' % source_path), - (r'/coverage.readthedocs.org/?[-.\w/]*', '/coverage.readthedocs.org/VER'), - ]) -clean("xml_1") diff --git a/tests/farm/html/run_a_xml_2.py b/tests/farm/html/run_a_xml_2.py deleted file mode 100644 index 4d691b3b..00000000 --- a/tests/farm/html/run_a_xml_2.py +++ /dev/null @@ -1,26 +0,0 @@ -source_path = None - -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 # pragma: nested - cov.stop() # pragma: nested - cov.xml_report(a) - global source_path - source_path = cov.file_locator.relative_dir.rstrip('/') - -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"'), - (r'<source>\s*.*?\s*</source>', '<source>%s</source>' % source_path), - (r'/coverage.readthedocs.org/?[-.\w/]*', '/coverage.readthedocs.org/VER'), - ]) -clean("xml_2") diff --git a/tests/farm/html/run_b_branch.py b/tests/farm/html/run_b_branch.py deleted file mode 100644 index 388b5c5e..00000000 --- a/tests/farm/html/run_b_branch.py +++ /dev/null @@ -1,29 +0,0 @@ -def html_it(): - """Run coverage with branches and make an HTML report for b.""" - import coverage - cov = coverage.coverage(branch=True) - cov.start() - import b # pragma: nested - cov.stop() # pragma: nested - 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_py.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">70%</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">23 25</span>', - ) -contains("html_b_branch/index.html", - '<a href="b_py.html">b.py</a>', - '<span class="pc_cov">70%</span>', - '<td class="right" data-ratio="16 23">70%</td>', - ) - -clean("html_b_branch") diff --git a/tests/farm/html/run_bom.py b/tests/farm/html/run_bom.py deleted file mode 100644 index a6e6d8b8..00000000 --- a/tests/farm/html/run_bom.py +++ /dev/null @@ -1,21 +0,0 @@ -import sys - -def html_it(): - """Run coverage and make an HTML report for bom.py.""" - import coverage - cov = coverage.coverage() - cov.start() - import bom # pragma: nested - cov.stop() # pragma: nested - cov.html_report(bom, directory="../html_bom") - -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_bom", "html_bom", size_within=10, file_pattern="*.html") -contains("html_bom/bom_py.html", - '<span class="str">"3×4 = 12, ÷2 = 6±0"</span>', - ) - -clean("html_bom") diff --git a/tests/farm/html/run_isolatin1.py b/tests/farm/html/run_isolatin1.py deleted file mode 100644 index b03cd25c..00000000 --- a/tests/farm/html/run_isolatin1.py +++ /dev/null @@ -1,21 +0,0 @@ -import sys - -def html_it(): - """Run coverage and make an HTML report for isolatin1.py.""" - import coverage - cov = coverage.coverage() - cov.start() - import isolatin1 # pragma: nested - cov.stop() # pragma: nested - cov.html_report(isolatin1, directory="../html_isolatin1") - -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_isolatin1", "html_isolatin1", size_within=10, file_pattern="*.html") -contains("html_isolatin1/isolatin1_py.html", - '<span class="str">"3×4 = 12, ÷2 = 6±0"</span>', - ) - -clean("html_isolatin1") diff --git a/tests/farm/html/run_omit_1.py b/tests/farm/html/run_omit_1.py deleted file mode 100644 index 102aeb2a..00000000 --- a/tests/farm/html/run_omit_1.py +++ /dev/null @@ -1,12 +0,0 @@ -def html_it(): - """Run coverage and make an HTML report for main.""" - import coverage - cov = coverage.coverage(include=["./*"]) - cov.start() - import main # pragma: nested - cov.stop() # pragma: nested - 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/tests/farm/html/run_omit_2.py b/tests/farm/html/run_omit_2.py deleted file mode 100644 index a149c518..00000000 --- a/tests/farm/html/run_omit_2.py +++ /dev/null @@ -1,12 +0,0 @@ -def html_it(): - """Run coverage and make an HTML report for main.""" - import coverage - cov = coverage.coverage(include=["./*"]) - cov.start() - import main # pragma: nested - cov.stop() # pragma: nested - cov.html_report(directory="../html_omit_2", omit=["m1.py"]) - -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/tests/farm/html/run_omit_3.py b/tests/farm/html/run_omit_3.py deleted file mode 100644 index 07b38a8a..00000000 --- a/tests/farm/html/run_omit_3.py +++ /dev/null @@ -1,12 +0,0 @@ -def html_it(): - """Run coverage and make an HTML report for main.""" - import coverage - cov = coverage.coverage(include=["./*"]) - cov.start() - import main # pragma: nested - cov.stop() # pragma: nested - cov.html_report(directory="../html_omit_3", omit=["m1.py", "m2.py"]) - -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/tests/farm/html/run_omit_4.py b/tests/farm/html/run_omit_4.py deleted file mode 100644 index 8c0c789c..00000000 --- a/tests/farm/html/run_omit_4.py +++ /dev/null @@ -1,12 +0,0 @@ -def html_it(): - """Run coverage and make an HTML report for main.""" - import coverage - cov = coverage.coverage(config_file="omit4.ini", include=["./*"]) - cov.start() - import main # pragma: nested - cov.stop() # pragma: nested - 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/tests/farm/html/run_omit_5.py b/tests/farm/html/run_omit_5.py deleted file mode 100644 index 4ba5e50c..00000000 --- a/tests/farm/html/run_omit_5.py +++ /dev/null @@ -1,12 +0,0 @@ -def html_it(): - """Run coverage and make an HTML report for main.""" - import coverage - cov = coverage.coverage(config_file="omit5.ini", include=["./*"]) - cov.start() - import main # pragma: nested - cov.stop() # pragma: nested - 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/tests/farm/html/run_other.py b/tests/farm/html/run_other.py deleted file mode 100644 index 7c7f344a..00000000 --- a/tests/farm/html/run_other.py +++ /dev/null @@ -1,26 +0,0 @@ -def html_it(): - """Run coverage and make an HTML report for everything.""" - import coverage - cov = coverage.coverage(include=["./*", "../othersrc/*"]) - cov.start() - import here # pragma: nested - cov.stop() # pragma: nested - 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("html_other/*_other_py.html"): - os.rename(p, "html_other/blah_blah_other_py.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", "html_other", size_within=10, file_pattern="*.html") -contains("html_other/index.html", - '<a href="here_py.html">here.py</a>', - 'other_py.html">', 'other.py</a>', - ) - -clean("html_other") diff --git a/tests/farm/html/run_partial.py b/tests/farm/html/run_partial.py deleted file mode 100644 index 7330bb27..00000000 --- a/tests/farm/html/run_partial.py +++ /dev/null @@ -1,31 +0,0 @@ -import sys - -def html_it(): - """Run coverage and make an HTML report for partial.""" - import coverage - cov = coverage.coverage(branch=True) - cov.start() - import partial # pragma: nested - cov.stop() # pragma: nested - cov.html_report(partial, directory="../html_partial") - -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_partial", "html_partial", size_within=10, file_pattern="*.html") -contains("html_partial/partial_py.html", - '<p id="t5" class="stm run hide_run">', - '<p id="t8" class="stm run hide_run">', - '<p id="t11" class="stm run hide_run">', - # The "if 0" and "if 1" statements are optimized away. - '<p id="t14" class="pln">', - ) -contains("html_partial/index.html", - '<a href="partial_py.html">partial.py</a>', - ) -contains("html_partial/index.html", - '<span class="pc_cov">100%</span>' - ) - -clean("html_partial") diff --git a/tests/farm/html/run_styled.py b/tests/farm/html/run_styled.py deleted file mode 100644 index ebfbf3bc..00000000 --- a/tests/farm/html/run_styled.py +++ /dev/null @@ -1,28 +0,0 @@ -def html_it(): - """Run coverage and make an HTML report for a.""" - import coverage - cov = coverage.coverage() - cov.start() - import a # pragma: nested - cov.stop() # pragma: nested - cov.html_report(a, directory="../html_styled", extra_css="extra.css") - -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_styled", "html_styled", size_within=10, file_pattern="*.html") -compare("gold_styled", "html_styled", size_within=10, file_pattern="*.css") -contains("html_styled/a_py.html", - '<link rel="stylesheet" href="extra.css" type="text/css">', - '<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_styled/index.html", - '<link rel="stylesheet" href="extra.css" type="text/css">', - '<a href="a_py.html">a.py</a>', - '<span class="pc_cov">67%</span>' - ) - -clean("html_styled") diff --git a/tests/farm/html/run_tabbed.py b/tests/farm/html/run_tabbed.py deleted file mode 100644 index 3e8a900f..00000000 --- a/tests/farm/html/run_tabbed.py +++ /dev/null @@ -1,24 +0,0 @@ -def html_it(): - """Run coverage and make an HTML report for tabbed.""" - import coverage - cov = coverage.coverage() - cov.start() - import tabbed # pragma: nested - cov.stop() # pragma: nested - 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/tabbed_py.html", - '> <span class="key">if</span> ' - '<span class="nam">x</span><span class="op">:</span>' - ' ' - ' ' - '<span class="com"># look nice</span>' - ) - -doesnt_contain("html_tabbed/tabbed_py.html", "\t") -clean("html_tabbed") diff --git a/tests/farm/html/run_unicode.py b/tests/farm/html/run_unicode.py deleted file mode 100644 index 455d0168..00000000 --- a/tests/farm/html/run_unicode.py +++ /dev/null @@ -1,24 +0,0 @@ -def html_it(): - """Run coverage and make an HTML report for unicode.py.""" - import coverage - cov = coverage.coverage() - cov.start() - import unicode # pragma: nested - cov.stop() # pragma: nested - cov.html_report(unicode, directory="../html_unicode") - -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_unicode", "html_unicode", size_within=10, file_pattern="*.html") -contains("html_unicode/unicode_py.html", - '<span class="str">"ʎd˙ǝbɐɹǝʌoɔ"</span>', - ) - -contains_any("html_unicode/unicode_py.html", - '<span class="str">"db40,dd00: x��"</span>', - '<span class="str">"db40,dd00: x󠄀"</span>', - ) - -clean("html_unicode") diff --git a/tests/farm/html/run_y_xml_branch.py b/tests/farm/html/run_y_xml_branch.py deleted file mode 100644 index 59228077..00000000 --- a/tests/farm/html/run_y_xml_branch.py +++ /dev/null @@ -1,26 +0,0 @@ -source_path = None - -def xml_it(): - """Run coverage and make an XML report for y.""" - import coverage - cov = coverage.coverage(branch=True) - cov.start() - import y # pragma: nested - cov.stop() # pragma: nested - cov.xml_report(y, outfile="../xml_branch/coverage.xml") - global source_path - source_path = cov.file_locator.relative_dir.rstrip('/') - -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"'), - (r'<source>\s*.*?\s*</source>', '<source>%s</source>' % source_path), - (r'/coverage.readthedocs.org/?[-.\w/]*', '/coverage.readthedocs.org/VER'), - ]) -clean("xml_branch") diff --git a/tests/farm/html/src/a.py b/tests/farm/html/src/a.py index 9e71aebd..85764e21 100644 --- a/tests/farm/html/src/a.py +++ b/tests/farm/html/src/a.py @@ -1,4 +1,7 @@ -# A test file for HTML reporting by coverage. +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +# A test file for HTML reporting by coverage.py. if 1 < 2: # Needed a < to look at HTML entities. diff --git a/tests/farm/html/src/b.py b/tests/farm/html/src/b.py index 3bf73a9f..cb673c22 100644 --- a/tests/farm/html/src/b.py +++ b/tests/farm/html/src/b.py @@ -1,4 +1,7 @@ -# A test file for HTML reporting by coverage. +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +# A test file for HTML reporting by coverage.py. def one(x): # This will be a branch that misses the else. diff --git a/tests/farm/html/src/bom.py b/tests/farm/html/src/bom.py index 1aff5d52..21d26ca2 100644 --- a/tests/farm/html/src/bom.py +++ b/tests/farm/html/src/bom.py @@ -1,11 +1,14 @@ -# A Python source file in utf-8, with BOM.
-math = "3×4 = 12, ÷2 = 6±0"
+# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt -import sys
-
-if sys.version_info >= (3, 0):
- assert len(math) == 18
- assert len(math.encode('utf-8')) == 21
-else:
- assert len(math) == 21
- assert len(math.decode('utf-8')) == 18
+# A Python source file in utf-8, with BOM. +math = "3×4 = 12, ÷2 = 6±0" + +import sys + +if sys.version_info >= (3, 0): + assert len(math) == 18 + assert len(math.encode('utf-8')) == 21 +else: + assert len(math) == 21 + assert len(math.decode('utf-8')) == 18 diff --git a/tests/farm/html/src/coverage.xml b/tests/farm/html/src/coverage.xml deleted file mode 100644 index e20cdaec..00000000 --- a/tests/farm/html/src/coverage.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?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 -->
- <sources>
- <source></source>
- </sources>
- <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/tests/farm/html/src/here.py b/tests/farm/html/src/here.py index d0d26ea7..fee9960d 100644 --- a/tests/farm/html/src/here.py +++ b/tests/farm/html/src/here.py @@ -1,4 +1,7 @@ -# A test file for HTML reporting by coverage. +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +# A test file for HTML reporting by coverage.py. import other diff --git a/tests/farm/html/src/isolatin1.py b/tests/farm/html/src/isolatin1.py index 7a49b07d..55a6f7de 100644 --- a/tests/farm/html/src/isolatin1.py +++ b/tests/farm/html/src/isolatin1.py @@ -1,5 +1,8 @@ -# A Python source file in another encoding. # -*- coding: iso8859-1 -*- +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +# A Python source file in another encoding. math = "34 = 12, 2 = 60" assert len(math) == 18 diff --git a/tests/farm/html/src/m1.py b/tests/farm/html/src/m1.py index 927e1f6b..524fb0aa 100644 --- a/tests/farm/html/src/m1.py +++ b/tests/farm/html/src/m1.py @@ -1,2 +1,5 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + m1a = 1 m1b = 2 diff --git a/tests/farm/html/src/m2.py b/tests/farm/html/src/m2.py index ffddf6cf..2d13bfe2 100644 --- a/tests/farm/html/src/m2.py +++ b/tests/farm/html/src/m2.py @@ -1,2 +1,5 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + m2a = 1 m2b = 2 diff --git a/tests/farm/html/src/m3.py b/tests/farm/html/src/m3.py index 395d7d25..96e8b992 100644 --- a/tests/farm/html/src/m3.py +++ b/tests/farm/html/src/m3.py @@ -1,2 +1,5 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + m3a = 1 m3b = 2 diff --git a/tests/farm/html/src/main.py b/tests/farm/html/src/main.py index ce894465..238d0b58 100644 --- a/tests/farm/html/src/main.py +++ b/tests/farm/html/src/main.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + import m1 import m2 import m3 diff --git a/tests/farm/html/src/omit4.ini b/tests/farm/html/src/omit4.ini index 6821ecda..b792e703 100644 --- a/tests/farm/html/src/omit4.ini +++ b/tests/farm/html/src/omit4.ini @@ -1,2 +1,5 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + [report] omit = m2.py diff --git a/tests/farm/html/src/omit5.ini b/tests/farm/html/src/omit5.ini index 7e32b414..3b6add29 100644 --- a/tests/farm/html/src/omit5.ini +++ b/tests/farm/html/src/omit5.ini @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + [report] omit = fooey @@ -5,4 +8,4 @@ omit = helloworld [html] -directory = ../html_omit_5 +directory = ../out/omit_5 diff --git a/tests/farm/html/src/partial.py b/tests/farm/html/src/partial.py index 8d62f5c5..66dddacd 100644 --- a/tests/farm/html/src/partial.py +++ b/tests/farm/html/src/partial.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + # partial branches a = 3 diff --git a/tests/farm/html/src/run_a_xml_2.ini b/tests/farm/html/src/run_a_xml_2.ini index 8d28f97b..f632bd09 100644 --- a/tests/farm/html/src/run_a_xml_2.ini +++ b/tests/farm/html/src/run_a_xml_2.ini @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + # Put all the XML output in xml_2 [xml] -output = ../xml_2/coverage.xml +output = ../out/xml_2/coverage.xml diff --git a/tests/farm/html/src/tabbed.py b/tests/farm/html/src/tabbed.py index 2035852f..e897e9fa 100644 --- a/tests/farm/html/src/tabbed.py +++ b/tests/farm/html/src/tabbed.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + # This file should have tabs. x = 1 if x: diff --git a/tests/farm/html/src/unicode.py b/tests/farm/html/src/unicode.py index 08e1b540..37c5533a 100644 --- a/tests/farm/html/src/unicode.py +++ b/tests/farm/html/src/unicode.py @@ -1,5 +1,8 @@ -# A Python source file with exotic characters. # -*- coding: utf-8 -*- +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +# A Python source file with exotic characters. upside_down = "ʎd˙ǝbɐɹǝʌoɔ" surrogate = "db40,dd00: x󠄀" diff --git a/tests/farm/html/src/y.py b/tests/farm/html/src/y.py index af7c9689..a50bb629 100644 --- a/tests/farm/html/src/y.py +++ b/tests/farm/html/src/y.py @@ -1,4 +1,7 @@ -# A test file for XML reporting by coverage. +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +# A test file for XML reporting by coverage.py. def choice(x): if x < 2: diff --git a/tests/farm/run/run_chdir.py b/tests/farm/run/run_chdir.py index 367cd0ad..9e3c7515 100644 --- a/tests/farm/run/run_chdir.py +++ b/tests/farm/run/run_chdir.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + copy("src", "out") run(""" coverage run chdir.py diff --git a/tests/farm/run/run_timid.py b/tests/farm/run/run_timid.py index 99155b85..a632cea3 100644 --- a/tests/farm/run/run_timid.py +++ b/tests/farm/run/run_timid.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + # Test that the --timid command line argument properly swaps the tracer # function for a simpler one. # diff --git a/tests/farm/run/run_xxx.py b/tests/farm/run/run_xxx.py index 6fedc934..62a862e5 100644 --- a/tests/farm/run/run_xxx.py +++ b/tests/farm/run/run_xxx.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + copy("src", "out") run(""" coverage run xxx diff --git a/tests/farm/run/src/chdir.py b/tests/farm/run/src/chdir.py index 6d834924..35cfcc81 100644 --- a/tests/farm/run/src/chdir.py +++ b/tests/farm/run/src/chdir.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + import os print("Line One") os.chdir("subdir") diff --git a/tests/farm/run/src/showtrace.py b/tests/farm/run/src/showtrace.py index e97412e0..3a2750a6 100644 --- a/tests/farm/run/src/showtrace.py +++ b/tests/farm/run/src/showtrace.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + # Show the current frame's trace function, so that we can test what the # command-line options do to the trace function used. diff --git a/tests/farm/run/src/xxx b/tests/farm/run/src/xxx index 8f727f08..864da457 100644 --- a/tests/farm/run/src/xxx +++ b/tests/farm/run/src/xxx @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + # This is a python file though it doesn't look like it, like a main script. a = b = c = d = 0 a = 3 diff --git a/tests/goldtest.py b/tests/goldtest.py new file mode 100644 index 00000000..4ad47424 --- /dev/null +++ b/tests/goldtest.py @@ -0,0 +1,42 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +"""A test base class for tests based on gold file comparison.""" + +import os +import sys + +from tests.coveragetest import CoverageTest + +from coverage.test_helpers import change_dir # pylint: disable=unused-import +from tests.test_farm import clean +# Import helpers, eventually test_farm.py will go away. +from tests.test_farm import ( # pylint: disable=unused-import + compare, contains, doesnt_contain, contains_any, +) + + +class CoverageGoldTest(CoverageTest): + """A test based on gold files.""" + + run_in_temp_dir = False + + def setUp(self): + super(CoverageGoldTest, self).setUp() + self.chdir(self.root_dir) + # Modules should be importable from the current directory. + sys.path.insert(0, '') + + def output_dir(self, the_dir): + """Declare where the output directory is. + + The output directory is deleted at the end of the test, unless the + COVERAGE_KEEP_OUTPUT environment variable is set. + + """ + self.addCleanup(self.cleanup_output_dir, the_dir) + + def cleanup_output_dir(self, the_dir): + """Clean up the output directory of the test.""" + if not os.environ.get("COVERAGE_KEEP_OUTPUT"): # pragma: partial + clean(the_dir) diff --git a/tests/helpers.py b/tests/helpers.py index c26f4859..f4bff2b0 100644 --- a/tests/helpers.py +++ b/tests/helpers.py @@ -1,18 +1,37 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Helpers for coverage.py tests.""" +import os import subprocess +import sys + +from coverage import env +from coverage.misc import output_encoding -# This isn't really a backward compatibility thing, should be moved into a -# helpers file or something. def run_command(cmd): """Run a command in a sub-process. Returns the exit status code and the combined stdout and stderr. """ + if env.PY2 and isinstance(cmd, unicode): + cmd = cmd.encode(sys.getfilesystemencoding()) + + # In some strange cases (PyPy3 in a virtualenv!?) the stdout encoding of + # the subprocess is set incorrectly to ascii. Use an environment variable + # to force the encoding to be the same as ours. + sub_env = dict(os.environ) + encoding = output_encoding() + if encoding: + sub_env['PYTHONIOENCODING'] = encoding + proc = subprocess.Popen( - cmd, shell=True, + cmd, + shell=True, + env=sub_env, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT ) @@ -21,14 +40,14 @@ def run_command(cmd): # Get the output, and canonicalize it to strings with newlines. if not isinstance(output, str): - output = output.decode('utf-8') + output = output.decode(output_encoding()) output = output.replace('\r', '') return status, output class CheckUniqueFilenames(object): - """Asserts the uniqueness of filenames passed to a function.""" + """Asserts the uniqueness of file names passed to a function.""" def __init__(self, wrapped): self.filenames = set() self.wrapped = wrapped @@ -44,7 +63,7 @@ class CheckUniqueFilenames(object): def wrapper(self, filename, *args, **kwargs): """The replacement method. Check that we don't have dupes.""" assert filename not in self.filenames, ( - "Filename %r passed to %r twice" % (filename, self.wrapped) + "File name %r passed to %r twice" % (filename, self.wrapped) ) self.filenames.add(filename) ret = self.wrapped(filename, *args, **kwargs) diff --git a/tests/js/tests.js b/tests/js/tests.js index 73b4ce2b..504a158e 100644 --- a/tests/js/tests.js +++ b/tests/js/tests.js @@ -1,3 +1,6 @@ +/* Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 */ +/* For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt */ + // Tests of coverage.py HTML report chunk navigation. /*global coverage, test, module, equals, jQuery, $ */ diff --git a/tests/modules/covmod1.py b/tests/modules/covmod1.py index b3f5e5f2..0f9638b8 100644 --- a/tests/modules/covmod1.py +++ b/tests/modules/covmod1.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + # covmod1.py: Simplest module for testing. i = 1 i += 1 diff --git a/tests/modules/pkg1/__init__.py b/tests/modules/pkg1/__init__.py index 2dfeb9c1..e2e4af5f 100644 --- a/tests/modules/pkg1/__init__.py +++ b/tests/modules/pkg1/__init__.py @@ -1,3 +1,4 @@ # This __init__.py has a module-level docstring, which is counted as a # statement. """A simple package for testing with.""" +print("pkg1.__init__: %s" % (__name__,)) diff --git a/tests/modules/pkg1/p1a.py b/tests/modules/pkg1/p1a.py index 337add49..5d81b1fa 100644 --- a/tests/modules/pkg1/p1a.py +++ b/tests/modules/pkg1/p1a.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + import os, sys # Invoke functions in os and sys so we can see if we measure code there. diff --git a/tests/modules/pkg1/p1b.py b/tests/modules/pkg1/p1b.py index 59d6fb54..53505cef 100644 --- a/tests/modules/pkg1/p1b.py +++ b/tests/modules/pkg1/p1b.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + x = 1 y = 2 z = 3 diff --git a/tests/modules/pkg1/p1c.py b/tests/modules/pkg1/p1c.py index a9aeef04..98f319e8 100644 --- a/tests/modules/pkg1/p1c.py +++ b/tests/modules/pkg1/p1c.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + a = 1 b = 2 c = 3 diff --git a/tests/modules/pkg1/runmod2.py b/tests/modules/pkg1/runmod2.py index b52964cb..5911db7b 100644 --- a/tests/modules/pkg1/runmod2.py +++ b/tests/modules/pkg1/runmod2.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + # Used in the tests for run_python_module import sys print("runmod2: passed %s" % sys.argv[1]) diff --git a/tests/modules/pkg1/sub/ps1a.py b/tests/modules/pkg1/sub/ps1a.py index 4b6a15cc..44d3b274 100644 --- a/tests/modules/pkg1/sub/ps1a.py +++ b/tests/modules/pkg1/sub/ps1a.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + d = 1 e = 2 f = 3 diff --git a/tests/modules/pkg1/sub/runmod3.py b/tests/modules/pkg1/sub/runmod3.py index 3a1ad155..1f5ce27e 100644 --- a/tests/modules/pkg1/sub/runmod3.py +++ b/tests/modules/pkg1/sub/runmod3.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + # Used in the tests for run_python_module import sys print("runmod3: passed %s" % sys.argv[1]) diff --git a/tests/modules/pkg2/p2a.py b/tests/modules/pkg2/p2a.py index b606711d..62caae22 100644 --- a/tests/modules/pkg2/p2a.py +++ b/tests/modules/pkg2/p2a.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + q = 1 r = 1 s = 1 diff --git a/tests/modules/pkg2/p2b.py b/tests/modules/pkg2/p2b.py index 7a34e2c6..73716eb4 100644 --- a/tests/modules/pkg2/p2b.py +++ b/tests/modules/pkg2/p2b.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + t = 1 u = 1 v = 1 diff --git a/tests/modules/plugins/a_plugin.py b/tests/modules/plugins/a_plugin.py index 2ff84dac..0cc96e5a 100644 --- a/tests/modules/plugins/a_plugin.py +++ b/tests/modules/plugins/a_plugin.py @@ -2,5 +2,10 @@ from coverage import CoveragePlugin + class Plugin(CoveragePlugin): pass + + +def coverage_init(reg, options): + reg.add_file_tracer(Plugin()) diff --git a/tests/modules/plugins/another.py b/tests/modules/plugins/another.py index 2ff84dac..80902d34 100644 --- a/tests/modules/plugins/another.py +++ b/tests/modules/plugins/another.py @@ -1,6 +1,14 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """A plugin for tests to reference.""" from coverage import CoveragePlugin + class Plugin(CoveragePlugin): pass + + +def coverage_init(reg, options): + reg.add_file_tracer(Plugin()) diff --git a/tests/modules/runmod1.py b/tests/modules/runmod1.py index 671d81ef..b43b299a 100644 --- a/tests/modules/runmod1.py +++ b/tests/modules/runmod1.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + # Used in the tests for run_python_module import sys print("runmod1: passed %s" % sys.argv[1]) diff --git a/tests/modules/usepkgs.py b/tests/modules/usepkgs.py index 93c7d904..4e94acaa 100644 --- a/tests/modules/usepkgs.py +++ b/tests/modules/usepkgs.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + import pkg1.p1a, pkg1.p1b import pkg2.p2a, pkg2.p2b import othermods.othera, othermods.otherb diff --git a/tests/moremodules/othermods/othera.py b/tests/moremodules/othermods/othera.py index 78896928..b3ee9c04 100644 --- a/tests/moremodules/othermods/othera.py +++ b/tests/moremodules/othermods/othera.py @@ -1,2 +1,5 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + o = 1 p = 2 diff --git a/tests/moremodules/othermods/otherb.py b/tests/moremodules/othermods/otherb.py index 2bd8a441..334fdc4a 100644 --- a/tests/moremodules/othermods/otherb.py +++ b/tests/moremodules/othermods/otherb.py @@ -1,2 +1,5 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + q = 3 r = 4 diff --git a/tests/moremodules/othermods/sub/osa.py b/tests/moremodules/othermods/sub/osa.py index 0139d28b..4005640e 100644 --- a/tests/moremodules/othermods/sub/osa.py +++ b/tests/moremodules/othermods/sub/osa.py @@ -1,2 +1,5 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + s = 5 t = 6 diff --git a/tests/moremodules/othermods/sub/osb.py b/tests/moremodules/othermods/sub/osb.py index b024b148..7d96fb79 100644 --- a/tests/moremodules/othermods/sub/osb.py +++ b/tests/moremodules/othermods/sub/osb.py @@ -1,2 +1,5 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + u = 7 v = 8 diff --git a/tests/osinfo.py b/tests/osinfo.py index 0b86ef54..a7ebd2ef 100644 --- a/tests/osinfo.py +++ b/tests/osinfo.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """OS information for testing.""" from coverage import env @@ -8,29 +11,29 @@ if env.WINDOWS: 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 + # From: http://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), - ] + _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) - ) + ctypes.windll.kernel32.GetCurrentProcess(), + ctypes.byref(mem_struct), + ctypes.sizeof(mem_struct) + ) if not ret: return 0 return mem_struct.PrivateUsage @@ -44,26 +47,26 @@ elif env.LINUX: def _VmB(key): """Read the /proc/PID/status file to find memory use.""" try: - # get pseudo file /proc/<pid>/status + # Get pseudo file /proc/<pid>/status with open('/proc/%d/status' % os.getpid()) as t: v = t.read() except IOError: return 0 # non-Linux? - # get VmKey line e.g. 'VmRSS: 9999 kB\n ...' + # 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 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. + # Generic implementation. def process_ram(): - """How much RAM is this process using? (placebo implementation)""" - return 0 + """How much RAM is this process using? (stdlib implementation)""" + import resource + return resource.getrusage(resource.RUSAGE_SELF).ru_maxrss diff --git a/tests/plugin1.py b/tests/plugin1.py index f9da35c8..af4dfc52 100644 --- a/tests/plugin1.py +++ b/tests/plugin1.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """A plugin for test_plugins.py to import.""" import os.path @@ -17,7 +20,7 @@ class Plugin(coverage.CoveragePlugin): return FileReporter(filename) -class FileTracer(coverage.plugin.FileTracer): +class FileTracer(coverage.FileTracer): """A FileTracer emulating a simple static plugin.""" def __init__(self, filename): @@ -37,10 +40,12 @@ class FileTracer(coverage.plugin.FileTracer): return lineno*100+5, lineno*100+7 -class FileReporter(coverage.plugin.FileReporter): +class FileReporter(coverage.FileReporter): """Dead-simple FileReporter.""" - def statements(self): + def lines(self): return set([105, 106, 107, 205, 206, 207]) - def excluded_statements(self): - return set([]) + +def coverage_init(reg, options): # pylint: disable=unused-argument + """Called by coverage to initialize the plugins here.""" + reg.add_file_tracer(Plugin()) diff --git a/tests/plugin2.py b/tests/plugin2.py index 658ee221..3bdfbdfd 100644 --- a/tests/plugin2.py +++ b/tests/plugin2.py @@ -1,13 +1,15 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """A plugin for test_plugins.py to import.""" import os.path import coverage -# pylint: disable=missing-docstring - class Plugin(coverage.CoveragePlugin): + """A plugin for testing.""" def file_tracer(self, filename): if "render.py" in filename: return RenderFileTracer() @@ -16,7 +18,7 @@ class Plugin(coverage.CoveragePlugin): return FileReporter(filename) -class RenderFileTracer(coverage.plugin.FileTracer): +class RenderFileTracer(coverage.FileTracer): """A FileTracer using information from the caller.""" def has_dynamic_source_filename(self): @@ -25,16 +27,23 @@ class RenderFileTracer(coverage.plugin.FileTracer): def dynamic_source_filename(self, filename, frame): if frame.f_code.co_name != "render": return None - return os.path.abspath(frame.f_locals['filename']) + source_filename = os.path.abspath(frame.f_locals['filename']) + return source_filename def line_number_range(self, frame): lineno = frame.f_locals['linenum'] return lineno, lineno+1 -class FileReporter(coverage.plugin.FileReporter): - def statements(self): +class FileReporter(coverage.FileReporter): + """A goofy file reporter.""" + def lines(self): # Goofy test arrangement: claim that the file has as many lines as the # number in its name. num = os.path.basename(self.filename).split(".")[0].split("_")[1] return set(range(1, int(num)+1)) + + +def coverage_init(reg, options): # pylint: disable=unused-argument + """Called by coverage to initialize the plugins here.""" + reg.add_file_tracer(Plugin()) diff --git a/tests/stress_phystoken.tok b/tests/stress_phystoken.tok index 8d1b6bec..eb2fb669 100644 --- a/tests/stress_phystoken.tok +++ b/tests/stress_phystoken.tok @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + # 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. diff --git a/tests/stress_phystoken_dos.tok b/tests/stress_phystoken_dos.tok index b08fd70e..5b016a77 100644 --- a/tests/stress_phystoken_dos.tok +++ b/tests/stress_phystoken_dos.tok @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
+# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt
+
# 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.
diff --git a/tests/test_api.py b/tests/test_api.py index a21372ad..a7cadab3 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1,96 +1,25 @@ -"""Tests for Coverage's API.""" +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +"""Tests for coverage.py's API.""" import fnmatch import os -import re import sys import textwrap import coverage from coverage.backward import StringIO +from coverage.misc import CoverageException from tests.coveragetest import CoverageTest -class SingletonApiTest(CoverageTest): - """Tests of the old-fashioned singleton API.""" - - def setUp(self): - super(SingletonApiTest, self).setUp() - # These tests use the singleton module interface. Prevent it from - # writing .coverage files at exit. - coverage.use_cache(0) - - def do_report_work(self, modname): - """Create a module named `modname`, then measure it.""" - coverage.erase() - - self.make_file(modname+".py", """\ - a = 1 - b = 2 - if b == 3: - c = 4 - d = 5 - e = 6 - f = 7 - """) - - # Import the Python file, executing it. - self.start_import_stop(coverage, modname) - - def test_simple(self): - coverage.erase() - - self.make_file("mycode.py", """\ - a = 1 - b = 2 - if b == 3: - c = 4 - d = 5 - """) - - # Import the Python file, executing it. - self.start_import_stop(coverage, "mycode") - - _, statements, missing, missingtext = coverage.analysis("mycode.py") - self.assertEqual(statements, [1,2,3,4,5]) - self.assertEqual(missing, [4]) - self.assertEqual(missingtext, "4") - - def test_report(self): - self.do_report_work("mycode2") - coverage.report(["mycode2.py"]) - self.assertEqual(self.stdout(), textwrap.dedent("""\ - Name Stmts Miss Cover Missing - ------------------------------------------ - mycode2.py 7 3 57% 4-6 - """)) - - def test_report_file(self): - # The file= argument of coverage.report makes the report go there. - self.do_report_work("mycode3") - fout = StringIO() - coverage.report(["mycode3.py"], file=fout) - self.assertEqual(self.stdout(), "") - self.assertEqual(fout.getvalue(), textwrap.dedent("""\ - Name Stmts Miss Cover Missing - ------------------------------------------ - mycode3.py 7 3 57% 4-6 - """)) - - def test_report_default(self): - # Calling report() with no morfs will report on whatever was executed. - self.do_report_work("mycode4") - coverage.report() - rpt = re.sub(r"\s+", " ", self.stdout()) - self.assertIn("mycode4.py 7 3 57% 4-6", rpt) - - class ApiTest(CoverageTest): - """Api-oriented tests for Coverage.""" + """Api-oriented tests for coverage.py.""" def clean_files(self, files, pats): - """Remove names matching `pats` from `files`, a list of filenames.""" + """Remove names matching `pats` from `files`, a list of file names.""" good = [] for f in files: for pat in pats: @@ -107,7 +36,7 @@ class ApiTest(CoverageTest): self.assertCountEqual(here, files) def test_unexecuted_file(self): - cov = coverage.coverage() + cov = coverage.Coverage() self.make_file("mycode.py", """\ a = 1 @@ -140,7 +69,7 @@ class ApiTest(CoverageTest): """) # Import the Python file, executing it. - cov = coverage.coverage() + cov = coverage.Coverage() self.start_import_stop(cov, "mymain") filename, _, _, _ = cov.analysis("mymain.py") @@ -155,7 +84,7 @@ class ApiTest(CoverageTest): # Import the Python file, executing it again, once it's been compiled # already. - cov = coverage.coverage() + cov = coverage.Coverage() self.start_import_stop(cov, "mymain") filename, _, _, _ = cov.analysis("mymain.py") @@ -176,7 +105,7 @@ class ApiTest(CoverageTest): """) # Measure without the stdlib. - cov1 = coverage.coverage() + cov1 = coverage.Coverage() self.assertEqual(cov1.config.cover_pylib, False) self.start_import_stop(cov1, "mymain") @@ -188,7 +117,7 @@ class ApiTest(CoverageTest): self.assertEqual(statements, missing) # Measure with the stdlib. - cov2 = coverage.coverage(cover_pylib=True) + cov2 = coverage.Coverage(cover_pylib=True) self.start_import_stop(cov2, "mymain") # some statements were marked executed in mymain.py @@ -207,7 +136,7 @@ class ApiTest(CoverageTest): """) # Measure without the stdlib, but include colorsys. - cov1 = coverage.coverage(cover_pylib=False, include=["*/colorsys.py"]) + cov1 = coverage.Coverage(cover_pylib=False, include=["*/colorsys.py"]) self.start_import_stop(cov1, "mymain") # some statements were marked executed in colorsys.py @@ -218,7 +147,7 @@ class ApiTest(CoverageTest): self.assertEqual(statements, missing) def test_exclude_list(self): - cov = coverage.coverage() + cov = coverage.Coverage() cov.clear_exclude() self.assertEqual(cov.get_exclude_list(), []) cov.exclude("foo") @@ -230,7 +159,7 @@ class ApiTest(CoverageTest): self.assertEqual(cov.get_exclude_list(), []) def test_exclude_partial_list(self): - cov = coverage.coverage() + cov = coverage.Coverage() cov.clear_exclude(which='partial') self.assertEqual(cov.get_exclude_list(which='partial'), []) cov.exclude("foo", which='partial') @@ -244,7 +173,7 @@ class ApiTest(CoverageTest): self.assertEqual(cov.get_exclude_list(which='partial'), []) def test_exclude_and_partial_are_separate_lists(self): - cov = coverage.coverage() + cov = coverage.Coverage() cov.clear_exclude(which='partial') cov.clear_exclude(which='exclude') cov.exclude("foo", which='partial') @@ -271,7 +200,7 @@ class ApiTest(CoverageTest): """) self.assertFiles(["datatest1.py"]) - cov = coverage.coverage() + cov = coverage.Coverage() self.start_import_stop(cov, "datatest1") cov.save() self.assertFiles(["datatest1.py", ".coverage"]) @@ -283,7 +212,7 @@ class ApiTest(CoverageTest): """) self.assertFiles(["datatest2.py"]) - cov = coverage.coverage(data_file="cov.data") + cov = coverage.Coverage(data_file="cov.data") self.start_import_stop(cov, "datatest2") cov.save() self.assertFiles(["datatest2.py", "cov.data"]) @@ -295,7 +224,7 @@ class ApiTest(CoverageTest): """) self.assertFiles(["datatest3.py"]) - cov = coverage.coverage(data_file="cov.data", data_suffix="14") + cov = coverage.Coverage(data_file="cov.data", data_suffix="14") self.start_import_stop(cov, "datatest3") cov.save() self.assertFiles(["datatest3.py", "cov.data.14"]) @@ -311,18 +240,19 @@ class ApiTest(CoverageTest): """) self.assertFiles(["datatest4.py", ".coveragerc"]) - cov = coverage.coverage() + cov = coverage.Coverage() self.start_import_stop(cov, "datatest4") cov.save() self.assertFiles(["datatest4.py", ".coveragerc", "mydata.dat"]) def test_empty_reporting(self): - # Used to be you'd get an exception reporting on nothing... - cov = coverage.coverage() + # empty summary reports raise exception, just like the xml report + cov = coverage.Coverage() cov.erase() - cov.report() + self.assertRaises(CoverageException, cov.report) - def test_start_stop_start_stop(self): + def make_code1_code2(self): + """Create the code1.py and code2.py files.""" self.make_file("code1.py", """\ code1 = 1 """) @@ -330,10 +260,9 @@ class ApiTest(CoverageTest): code2 = 1 code2 = 2 """) - cov = coverage.coverage() - self.start_import_stop(cov, "code1") - cov.save() - self.start_import_stop(cov, "code2") + + def check_code1_code2(self, cov): + """Check the analysis is correct for code1.py and code2.py.""" _, statements, missing, _ = cov.analysis("code1.py") self.assertEqual(statements, [1]) self.assertEqual(missing, []) @@ -341,30 +270,57 @@ class ApiTest(CoverageTest): self.assertEqual(statements, [1, 2]) self.assertEqual(missing, []) + def test_start_stop_start_stop(self): + self.make_code1_code2() + cov = coverage.Coverage() + self.start_import_stop(cov, "code1") + cov.save() + self.start_import_stop(cov, "code2") + self.check_code1_code2(cov) + if 0: # expected failure # for https://bitbucket.org/ned/coveragepy/issue/79 def test_start_save_stop(self): - self.make_file("code1.py", """\ - code1 = 1 - """) - self.make_file("code2.py", """\ - code2 = 1 - code2 = 2 - """) - cov = coverage.coverage() + self.make_code1_code2() + cov = coverage.Coverage() cov.start() self.import_local_file("code1") cov.save() self.import_local_file("code2") cov.stop() - _, statements, missing, _ = cov.analysis("code1.py") - self.assertEqual(statements, [1]) - self.assertEqual(missing, []) - _, statements, missing, _ = cov.analysis("code2.py") - self.assertEqual(statements, [1, 2]) - self.assertEqual(missing, []) + self.check_code1_code2(cov) + def make_corrupt_data_files(self): + """Make some good and some bad data files.""" + self.make_code1_code2() + cov = coverage.Coverage(data_suffix=True) + self.start_import_stop(cov, "code1") + cov.save() + + cov = coverage.Coverage(data_suffix=True) + self.start_import_stop(cov, "code2") + cov.save() + + self.make_file(".coverage.foo", """La la la, this isn't coverage data!""") + + def test_combining_corrupt_data(self): + # If you combine a corrupt data file, then you will get a warning, + # and the file will remain. + self.make_corrupt_data_files() + cov = coverage.Coverage() + warning_regex = ( + r"Couldn't read data from '.*\.coverage\.foo': " + r"CoverageException: Doesn't seem to be a coverage\.py data file" + ) + with self.assert_warnings(cov, [warning_regex]): + cov.combine() + + # We got the results from code1 and code2 properly. + self.check_code1_code2(cov) + + # The bad file still exists. + self.assert_exists(".coverage.foo") class UsingModulesMixin(object): @@ -374,11 +330,12 @@ class UsingModulesMixin(object): def setUp(self): super(UsingModulesMixin, self).setUp() - # Parent class saves and restores sys.path, we can just modify it. + old_dir = os.getcwd() os.chdir(self.nice_file(os.path.dirname(__file__), 'modules')) self.addCleanup(os.chdir, old_dir) + # Parent class saves and restores sys.path, we can just modify it. sys.path.append(".") sys.path.append("../moremodules") @@ -445,15 +402,15 @@ class SourceOmitIncludeTest(OmitIncludeTestsMixin, CoverageTest): def coverage_usepkgs(self, **kwargs): """Run coverage on usepkgs and return the line summary. - Arguments are passed to the `coverage.coverage` constructor. + Arguments are passed to the `coverage.Coverage` constructor. """ - cov = coverage.coverage(**kwargs) + cov = coverage.Coverage(**kwargs) cov.start() import usepkgs # pragma: nested # pylint: disable=import-error,unused-variable cov.stop() # pragma: nested - cov._harvest_data() # private! sshhh... - summary = cov.data.summary() + data = cov.get_data() + summary = data.line_counts() for k, v in list(summary.items()): assert k.endswith(".py") summary[k[:-3]] = v @@ -487,7 +444,7 @@ class ReportIncludeOmitTest(OmitIncludeTestsMixin, CoverageTest): def coverage_usepkgs(self, **kwargs): """Try coverage.report().""" - cov = coverage.coverage() + cov = coverage.Coverage() cov.start() import usepkgs # pragma: nested # pylint: disable=import-error,unused-variable cov.stop() # pragma: nested @@ -506,7 +463,7 @@ class XmlIncludeOmitTest(OmitIncludeTestsMixin, CoverageTest): def coverage_usepkgs(self, **kwargs): """Try coverage.xml_report().""" - cov = coverage.coverage() + cov = coverage.Coverage() cov.start() import usepkgs # pragma: nested # pylint: disable=import-error,unused-variable cov.stop() # pragma: nested @@ -517,7 +474,7 @@ class XmlIncludeOmitTest(OmitIncludeTestsMixin, CoverageTest): class AnalysisTest(CoverageTest): """Test the numerical analysis of results.""" def test_many_missing_branches(self): - cov = coverage.coverage(branch=True) + cov = coverage.Coverage(branch=True) self.make_file("missing.py", """\ def fun1(x): @@ -546,8 +503,8 @@ class AnalysisTest(CoverageTest): self.assertEqual(nums.n_missing_branches, 2) -class PluginTest(CoverageTest): - """Test that the API works properly the way the plugins call it. +class TestRunnerPluginTest(CoverageTest): + """Test that the API works properly the way various third-party plugins call it. We don't actually use the plugins, but these tests call the API the same way they do. @@ -555,7 +512,7 @@ class PluginTest(CoverageTest): """ def pretend_to_be_nose_with_cover(self, erase): """This is what the nose --with-cover plugin does.""" - cov = coverage.coverage() + cov = coverage.Coverage() self.make_file("no_biggie.py", """\ a = 1 diff --git a/tests/test_arcs.py b/tests/test_arcs.py index a4462ea1..df303d8b 100644 --- a/tests/test_arcs.py +++ b/tests/test_arcs.py @@ -1,4 +1,7 @@ -"""Tests for Coverage.py's arc measurement.""" +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +"""Tests for coverage.py's arc measurement.""" from tests.coveragetest import CoverageTest @@ -8,7 +11,7 @@ from coverage.files import abs_file class SimpleArcTest(CoverageTest): - """Tests for Coverage.py's arc measurement.""" + """Tests for coverage.py's arc measurement.""" def test_simple_sequence(self): self.check_coverage("""\ @@ -672,6 +675,11 @@ class MiscArcTest(CoverageTest): """Miscellaneous arc-measuring tests.""" def test_dict_literal(self): + if env.PYVERSION < (3, 5): + arcz = ".1 19 9." + else: + # Python 3.5 changed how dict literals are constructed. + arcz = ".1 19 9-2" self.check_coverage("""\ d = { 'a': 2, @@ -683,7 +691,7 @@ class MiscArcTest(CoverageTest): } assert d """, - arcz=".1 19 9.") + arcz=arcz) def test_pathologically_long_code_object(self): # https://bitbucket.org/ned/coveragepy/issue/359 @@ -755,6 +763,6 @@ class LineDataTest(CoverageTest): self.start_import_stop(cov, "fun1") - cov._harvest_data() - fun1_lines = cov.data.line_data()[abs_file("fun1.py")] - self.assertEqual(fun1_lines, [1, 2, 5]) + data = cov.get_data() + fun1_lines = data.lines(abs_file("fun1.py")) + self.assertCountEqual(fun1_lines, [1, 2, 5]) diff --git a/tests/test_backward.py b/tests/test_backward.py index 09803ba7..fbb9ad8b 100644 --- a/tests/test_backward.py +++ b/tests/test_backward.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Tests that our version shims in backward.py are working.""" from coverage.backunittest import TestCase diff --git a/tests/test_cmdline.py b/tests/test_cmdline.py index b616ed51..c78e3468 100644 --- a/tests/test_cmdline.py +++ b/tests/test_cmdline.py @@ -1,4 +1,7 @@ -"""Test cmdline.py for coverage.""" +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +"""Test cmdline.py for coverage.py.""" import pprint import re @@ -11,6 +14,7 @@ import mock import coverage import coverage.cmdline from coverage.config import CoverageConfig +from coverage.data import CoverageData, CoverageDataFiles from coverage.misc import ExceptionDuringRun from tests.coveragetest import CoverageTest, OK, ERR @@ -52,35 +56,42 @@ class BaseCmdLineTest(CoverageTest): # We'll invoke .coverage as the constructor, and then keep using the # same object as the resulting coverage object. mk.coverage.return_value = mk - mk.config = CoverageConfig() + + # The mock needs to get options, but shouldn't need to set them. + config = CoverageConfig() + mk.get_option = config.get_option + return mk - def mock_command_line(self, args): + def mock_command_line(self, args, path_exists=None): """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( + m.path_exists.return_value = path_exists + + ret = coverage.cmdline.CoverageScript( _covpkg=m, _run_python_file=m.run_python_file, - _run_python_module=m.run_python_module, _help_fn=m.help_fn + _run_python_module=m.run_python_module, _help_fn=m.help_fn, + _path_exists=m.path_exists, ).command_line(shlex.split(args)) + return m, ret - def cmd_executes(self, args, code, ret=OK): + def cmd_executes(self, args, code, ret=OK, path_exists=None): """Assert that the `args` end up executing the sequence in `code`.""" - m1, r1 = self.mock_command_line(args) - self.assertEqual( - r1, ret, "Wrong status: got %s, wanted %s" % (r1, ret) - ) + m1, r1 = self.mock_command_line(args, path_exists=path_exists) + self.assertEqual(r1, ret, "Wrong status: got %r, wanted %r" % (r1, ret)) # 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() + m2.path_exists.return_value = path_exists code_obj = compile(code, "<code>", "exec") - eval(code_obj, globals(), { 'm2': m2 }) # pylint: disable=eval-used + eval(code_obj, globals(), {'m2': m2}) # pylint: disable=eval-used # Many of our functions take a lot of arguments, and cmdline.py # calls them with many. But most of them are just the defaults, which @@ -117,17 +128,11 @@ class BaseCmdLineTest(CoverageTest): """ m, r = self.mock_command_line(args) - self.assertEqual(r, ret, - "Wrong status: got %s, wanted %s" % (r, ret) - ) + self.assertEqual(r, ret, "Wrong status: got %s, wanted %s" % (r, ret)) if help_msg: - self.assertEqual(m.method_calls[-1], - ('help_fn', (help_msg,), {}) - ) + self.assertEqual(m.method_calls[-1], ('help_fn', (help_msg,), {})) else: - self.assertEqual(m.method_calls[-1], - ('help_fn', (), {'topic':topic}) - ) + self.assertEqual(m.method_calls[-1], ('help_fn', (), {'topic': topic})) class BaseCmdLineTestTest(BaseCmdLineTest): @@ -139,38 +144,6 @@ class BaseCmdLineTestTest(BaseCmdLineTest): self.cmd_executes_same("run", "debug") -class FakeCoverageForDebugData(object): - """Just enough of a fake coverage package for the 'debug data' tests.""" - def __init__(self, summary, plugin_data=None): - self._summary = summary - self._plugin_data = plugin_data or {} - 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=unused-argument - """Fake coverage().data.summary()""" - return self._summary - - def plugin_data(self): - """Fake coverage().data.plugin_data()""" - return self._plugin_data - - class CmdLineTest(BaseCmdLineTest): """Tests of the coverage.py command line.""" @@ -228,40 +201,25 @@ class CmdLineTest(BaseCmdLineTest): .save() """) + def test_combine_doesnt_confuse_options_with_args(self): + # https://bitbucket.org/ned/coveragepy/issues/385/coverage-combine-doesnt-work-with-rcfile + self.cmd_executes("combine --rcfile cov.ini", """\ + .coverage(config_file='cov.ini') + .load() + .combine(None) + .save() + """) + self.cmd_executes("combine --rcfile cov.ini data1 data2/more", """\ + .coverage(config_file='cov.ini') + .load() + .combine(["data1", "data2/more"]) + .save() + """) + def test_debug(self): 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 test_debug_data(self): - fake = FakeCoverageForDebugData( - summary={ - 'file1.py': 17, 'file2.py': 23, - }, - plugin_data={ - 'file1.py': 'a_plugin', - }, - ) - 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 [a_plugin] - file2.py: 23 lines - """)) - - def test_debug_data_with_no_data(self): - fake = FakeCoverageForDebugData(summary={}) - self.command_line("debug data", _covpkg=fake) - self.assertMultiLineEqual(self.stdout(), textwrap.dedent("""\ - -- data ------------------------------------------------------ - path: FILENAME - has_arcs: False - No data collected - """)) - def test_debug_sys(self): self.command_line("debug sys") out = self.stdout() @@ -288,8 +246,7 @@ class CmdLineTest(BaseCmdLineTest): self.cmd_executes("help", ".help_fn(topic='help')") def test_cmd_help(self): - self.cmd_executes("run --help", - ".help_fn(parser='<CmdOptionParser:run>')") + self.cmd_executes("run --help", ".help_fn(parser='<CmdOptionParser:run>')") self.cmd_executes_same("help run", "run --help") def test_html(self): @@ -390,15 +347,25 @@ class CmdLineTest(BaseCmdLineTest): .stop() .save() """) - # run -a calls coverage.load first without erasing. + # run -a combines with an existing data file before saving. self.cmd_executes("run -a foo.py", """\ .coverage() - .load() .start() .run_python_file('foo.py', ['foo.py']) .stop() + .path_exists('.coverage') + .combine(data_paths=['.coverage']) .save() - """) + """, path_exists=True) + # run -a doesn't combine anything if the data file doesn't exist. + self.cmd_executes("run -a foo.py", """\ + .coverage() + .start() + .run_python_file('foo.py', ['foo.py']) + .stop() + .path_exists('.coverage') + .save() + """, path_exists=False) # --timid sets a flag, and program arguments get passed through. self.cmd_executes("run --timid foo.py abc 123", """\ .coverage(timid=True) @@ -449,8 +416,7 @@ class CmdLineTest(BaseCmdLineTest): .stop() .save() """) - self.cmd_executes("run --include=pre1,pre2 --omit=opre1,opre2 foo.py", - """\ + self.cmd_executes("run --include=pre1,pre2 --omit=opre1,opre2 foo.py", """\ .coverage(include=["pre1", "pre2"], omit=["opre1", "opre2"]) .erase() .start() @@ -525,6 +491,14 @@ class CmdLineTest(BaseCmdLineTest): """) self.cmd_executes_same("run -m mymodule", "run --module mymodule") + def test_run_nothing(self): + self.command_line("run", ret=ERR) + self.assertIn("Nothing to do", self.stdout()) + + def test_cant_append_parallel(self): + self.command_line("run --append --parallel-mode foo.py", ret=ERR) + self.assertIn("Can't append to data files in parallel mode.", self.stdout()) + def test_xml(self): # coverage xml [-i] [--omit DIR,...] [FILE1 FILE2 ...] self.cmd_executes("xml", """\ @@ -575,6 +549,43 @@ class CmdLineTest(BaseCmdLineTest): self.cmd_help("xyzzy", "Unknown command: 'xyzzy'") +class CmdLineWithFilesTest(BaseCmdLineTest): + """Test the command line in ways that need temp files.""" + + run_in_temp_dir = True + no_files_in_temp_dir = True + + def test_debug_data(self): + data = CoverageData() + data.add_lines({ + "file1.py": dict.fromkeys(range(1, 18)), + "file2.py": dict.fromkeys(range(1, 24)), + }) + data.add_file_tracers({"file1.py": "a_plugin"}) + data_files = CoverageDataFiles() + data_files.write(data) + + self.command_line("debug data") + self.assertMultiLineEqual(self.stdout(), textwrap.dedent("""\ + -- data ------------------------------------------------------ + path: FILENAME + has_arcs: False + + 2 files: + file1.py: 17 lines [a_plugin] + file2.py: 23 lines + """).replace("FILENAME", data_files.filename)) + + def test_debug_data_with_no_data(self): + data_files = CoverageDataFiles() + self.command_line("debug data") + self.assertMultiLineEqual(self.stdout(), textwrap.dedent("""\ + -- data ------------------------------------------------------ + path: FILENAME + No data collected + """).replace("FILENAME", data_files.filename)) + + class CmdLineStdoutTest(BaseCmdLineTest): """Test the command line with real stdout output.""" @@ -632,17 +643,17 @@ class CmdMainTest(CoverageTest): elif argv[0] == 'exit': sys.exit(23) else: - raise AssertionError("Bad CoverageScriptStub: %r"% (argv,)) + 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 - self.addCleanup(self.restore_coverage_script) + self.addCleanup(self.cleanup_coverage_script) - def restore_coverage_script(self): - """A cleanup""" + def cleanup_coverage_script(self): + """Restore CoverageScript when the test is done.""" coverage.cmdline.CoverageScript = self.old_CoverageScript def test_normal(self): diff --git a/tests/test_collector.py b/tests/test_collector.py index 26360091..bd963415 100644 --- a/tests/test_collector.py +++ b/tests/test_collector.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Tests of coverage/collector.py and other collectors.""" import os.path @@ -35,7 +38,7 @@ class CollectorTest(CoverageTest): # Trace one file, but not the other. CheckUniqueFilenames will assert # that _should_trace hasn't been called twice for the same file. - cov = coverage.coverage(include=["f1.py"]) + cov = coverage.Coverage(include=["f1.py"]) should_trace_hook = CheckUniqueFilenames.hook(cov, '_should_trace') # Import the Python file, executing it. diff --git a/tests/test_concurrency.py b/tests/test_concurrency.py index 93809dff..c6d750d0 100644 --- a/tests/test_concurrency.py +++ b/tests/test_concurrency.py @@ -1,11 +1,13 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Tests for concurrency libraries.""" -import os -import os.path import threading import coverage from coverage import env +from coverage.files import abs_file from tests.coveragetest import CoverageTest @@ -22,10 +24,7 @@ try: except ImportError: gevent = None -try: - import greenlet -except ImportError: - greenlet = None +import greenlet def line_count(s): @@ -148,13 +147,13 @@ class ConcurrencyTest(CoverageTest): data.read_file(".coverage") # If the test fails, it's helpful to see this info: - fname = os.path.abspath("try_it.py") - linenos = data.executed_lines(fname).keys() + fname = abs_file("try_it.py") + linenos = data.lines(fname) print("{0}: {1}".format(len(linenos), linenos)) print_simple_annotation(code, linenos) lines = line_count(code) - self.assertEqual(data.summary()['try_it.py'], lines) + self.assertEqual(data.line_counts()['try_it.py'], lines) else: expected_out = ( "Can't support concurrency=%s with PyTracer, " @@ -215,7 +214,7 @@ class ConcurrencyTest(CoverageTest): eventlet.sleep(.005) eventlet.sleep(.1) - print len(gts) + print(len(gts)) """ self.try_some_code(BUG_330, "eventlet", eventlet, "0\n") diff --git a/tests/test_config.py b/tests/test_config.py index 58615f6c..93a7bbf6 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -1,4 +1,7 @@ -# -*- coding: utf-8 -*- +# coding: utf-8 +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Test the config file handling for coverage.py""" import sys @@ -15,14 +18,14 @@ class ConfigTest(CoverageTest): def test_default_config(self): # Just constructing a coverage() object gets the right defaults. - cov = coverage.coverage() + 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 configuration. - cov = coverage.coverage(timid=True, data_file="fooey.dat") + 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") @@ -35,7 +38,7 @@ class ConfigTest(CoverageTest): timid = True data_file = .hello_kitty.data """) - cov = coverage.coverage() + cov = coverage.Coverage() self.assertTrue(cov.config.timid) self.assertFalse(cov.config.branch) self.assertEqual(cov.config.data_file, ".hello_kitty.data") @@ -48,7 +51,7 @@ class ConfigTest(CoverageTest): ; I wouldn't really use this as a data file... data_file = delete.me """) - cov = coverage.coverage(config_file="my_cov.ini") + 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") @@ -60,7 +63,7 @@ class ConfigTest(CoverageTest): timid = True data_file = delete.me """) - cov = coverage.coverage(config_file=False) + cov = coverage.Coverage(config_file=False) self.assertFalse(cov.config.timid) self.assertFalse(cov.config.branch) self.assertEqual(cov.config.data_file, ".coverage") @@ -72,7 +75,7 @@ class ConfigTest(CoverageTest): timid = True data_file = weirdo.file """) - cov = coverage.coverage(timid=False, data_file=".mycov") + 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") @@ -85,10 +88,10 @@ class ConfigTest(CoverageTest): data_file = weirdo.file """) self.set_environ("COVERAGE_FILE", "fromenv.dat") - cov = coverage.coverage() + cov = coverage.Coverage() self.assertEqual(cov.config.data_file, "fromenv.dat") # But the constructor arguments override the environment variable. - cov = coverage.coverage(data_file="fromarg.dat") + cov = coverage.Coverage(data_file="fromarg.dat") self.assertEqual(cov.config.data_file, "fromarg.dat") def test_parse_errors(self): @@ -99,21 +102,21 @@ class ConfigTest(CoverageTest): ("[run\n", r"\[run"), ("[report]\nexclude_lines = foo(\n", r"Invalid \[report\].exclude_lines value 'foo\(': " - r"unbalanced parenthesis"), + r"(unbalanced parenthesis|missing \))"), ("[report]\npartial_branches = foo[\n", r"Invalid \[report\].partial_branches value 'foo\[': " - r"unexpected end of regular expression"), + r"(unexpected end of regular expression|unterminated character set)"), ("[report]\npartial_branches_always = foo***\n", r"Invalid \[report\].partial_branches_always value " - r"'foo\*\*\*': " - r"multiple repeat"), - ] + r"'foo\*\*\*': " + r"multiple repeat"), + ] for bad_config, msg in bad_configs_and_msgs: print("Trying %r" % bad_config) self.make_file(".coveragerc", bad_config) with self.assertRaisesRegex(CoverageException, msg): - coverage.coverage() + coverage.Coverage() def test_environment_vars_in_config(self): # Config files can have $envvars in them. @@ -132,51 +135,79 @@ class ConfigTest(CoverageTest): self.set_environ("DATA_FILE", "hello-world") self.set_environ("THING", "ZZZ") self.set_environ("OKAY", "yes") - cov = coverage.coverage() + cov = coverage.Coverage() self.assertEqual(cov.config.data_file, "hello-world.fooey") self.assertEqual(cov.config.branch, True) - self.assertEqual(cov.config.exclude_list, + self.assertEqual( + cov.config.exclude_list, ["the_$one", "anotherZZZ", "xZZZy", "xy", "huh${X}what"] - ) + ) def test_tweaks_after_constructor(self): # Arguments to the constructor are applied to the configuration. - cov = coverage.coverage(timid=True, data_file="fooey.dat") - cov.config["run:timid"] = False + cov = coverage.Coverage(timid=True, data_file="fooey.dat") + cov.set_option("run:timid", False) self.assertFalse(cov.config.timid) self.assertFalse(cov.config.branch) self.assertEqual(cov.config.data_file, "fooey.dat") - self.assertFalse(cov.config["run:timid"]) - self.assertFalse(cov.config["run:branch"]) - self.assertEqual(cov.config["run:data_file"], "fooey.dat") + self.assertFalse(cov.get_option("run:timid")) + self.assertFalse(cov.get_option("run:branch")) + self.assertEqual(cov.get_option("run:data_file"), "fooey.dat") def test_tweak_error_checking(self): # Trying to set an unknown config value raises an error. - cov = coverage.coverage() + cov = coverage.Coverage() with self.assertRaises(CoverageException): - cov.config["run:xyzzy"] = 12 + cov.set_option("run:xyzzy", 12) with self.assertRaises(CoverageException): - cov.config["xyzzy:foo"] = 12 + cov.set_option("xyzzy:foo", 12) with self.assertRaises(CoverageException): - _ = cov.config["run:xyzzy"] + _ = cov.get_option("run:xyzzy") with self.assertRaises(CoverageException): - _ = cov.config["xyzzy:foo"] + _ = cov.get_option("xyzzy:foo") def test_tweak_plugin_options(self): # Plugin options have a more flexible syntax. - cov = coverage.coverage() - cov.config["run:plugins"] = ["fooey.plugin", "xyzzy.coverage.plugin"] - cov.config["fooey.plugin:xyzzy"] = 17 - cov.config["xyzzy.coverage.plugin:plugh"] = ["a", "b"] + cov = coverage.Coverage() + cov.set_option("run:plugins", ["fooey.plugin", "xyzzy.coverage.plugin"]) + cov.set_option("fooey.plugin:xyzzy", 17) + cov.set_option("xyzzy.coverage.plugin:plugh", ["a", "b"]) with self.assertRaises(CoverageException): - cov.config["no_such.plugin:foo"] = 23 + cov.set_option("no_such.plugin:foo", 23) - self.assertEqual(cov.config["fooey.plugin:xyzzy"], 17) - self.assertEqual(cov.config["xyzzy.coverage.plugin:plugh"], ["a", "b"]) + self.assertEqual(cov.get_option("fooey.plugin:xyzzy"), 17) + self.assertEqual(cov.get_option("xyzzy.coverage.plugin:plugh"), ["a", "b"]) with self.assertRaises(CoverageException): - _ = cov.config["no_such.plugin:foo"] + _ = cov.get_option("no_such.plugin:foo") + + def test_unknown_option(self): + self.make_file(".coveragerc", """\ + [run] + xyzzy = 17 + """) + msg = r"Unrecognized option '\[run\] xyzzy=' in config file .coveragerc" + with self.assertRaisesRegex(CoverageException, msg): + _ = coverage.Coverage() + + def test_misplaced_option(self): + self.make_file(".coveragerc", """\ + [report] + branch = True + """) + msg = r"Unrecognized option '\[report\] branch=' in config file .coveragerc" + with self.assertRaisesRegex(CoverageException, msg): + _ = coverage.Coverage() + + def test_unknown_option_in_other_ini_file(self): + self.make_file("setup.cfg", """\ + [coverage:run] + huh = what? + """) + msg = r"Unrecognized option '\[coverage:run\] huh=' in config file setup.cfg" + with self.assertRaisesRegex(CoverageException, msg): + _ = coverage.Coverage() class ConfigFileTest(CoverageTest): @@ -270,25 +301,15 @@ class ConfigFileTest(CoverageTest): self.assertTrue(cov.config.parallel) self.assertEqual(cov.config.concurrency, "thread") - self.assertEqual(cov.get_exclude_list(), - ["if 0:", r"pragma:?\s+no cover", "another_tab"] - ) + self.assertEqual(cov.get_exclude_list(), ["if 0:", r"pragma:?\s+no cover", "another_tab"]) self.assertTrue(cov.config.ignore_errors) self.assertEqual(cov.config.include, ["a/", "b/"]) - self.assertEqual(cov.config.omit, - ["one", "another", "some_more", "yet_more"] - ) + self.assertEqual(cov.config.omit, ["one", "another", "some_more", "yet_more"]) self.assertEqual(cov.config.precision, 3) - self.assertEqual(cov.config.partial_list, - [r"pragma:?\s+no branch"] - ) - self.assertEqual(cov.config.partial_always_list, - ["if 0:", "while True:"] - ) - self.assertEqual(cov.config.plugins, - ["plugins.a_plugin", "plugins.another"] - ) + self.assertEqual(cov.config.partial_list, [r"pragma:?\s+no branch"]) + self.assertEqual(cov.config.partial_always_list, ["if 0:", "while True:"]) + self.assertEqual(cov.config.plugins, ["plugins.a_plugin", "plugins.another"]) self.assertTrue(cov.config.show_missing) self.assertTrue(cov.config.skip_covered) self.assertEqual(cov.config.html_dir, r"c:\tricky\dir.somewhere") @@ -301,17 +322,17 @@ class ConfigFileTest(CoverageTest): self.assertEqual(cov.config.paths, { 'source': ['.', '/home/ned/src/'], 'other': ['other', '/home/ned/other', 'c:\\Ned\\etc'] - }) + }) self.assertEqual(cov.config.get_plugin_options("plugins.a_plugin"), { 'hello': 'world', 'names': 'Jane/John/Jenny', - }) + }) self.assertEqual(cov.config.get_plugin_options("plugins.another"), {}) def test_config_file_settings(self): self.make_file(".coveragerc", self.LOTSA_SETTINGS.format(section="")) - cov = coverage.coverage() + cov = coverage.Coverage() self.assert_config_settings_are_correct(cov) def test_config_file_settings_in_setupcfg(self): @@ -319,7 +340,7 @@ class ConfigFileTest(CoverageTest): # "coverage:" nested = self.LOTSA_SETTINGS.format(section="coverage:") self.make_file("setup.cfg", nested + "\n" + self.SETUP_CFG) - cov = coverage.coverage() + cov = coverage.Coverage() self.assert_config_settings_are_correct(cov) def test_config_file_settings_in_setupcfg_if_coveragerc_specified(self): @@ -328,7 +349,7 @@ class ConfigFileTest(CoverageTest): # .coveragerc file. nested = self.LOTSA_SETTINGS.format(section="coverage:") self.make_file("setup.cfg", nested + "\n" + self.SETUP_CFG) - cov = coverage.coverage(config_file=".coveragerc") + cov = coverage.Coverage(config_file=".coveragerc") self.assert_config_settings_are_correct(cov) def test_setupcfg_only_if_not_coveragerc(self): @@ -341,7 +362,7 @@ class ConfigFileTest(CoverageTest): omit = bar branch = true """) - cov = coverage.coverage() + cov = coverage.Coverage() self.assertEqual(cov.config.include, ["foo"]) self.assertEqual(cov.config.omit, None) self.assertEqual(cov.config.branch, False) @@ -352,7 +373,7 @@ class ConfigFileTest(CoverageTest): omit = bar branch = true """) - cov = coverage.coverage() + cov = coverage.Coverage() self.assertEqual(cov.config.omit, None) self.assertEqual(cov.config.branch, False) @@ -361,11 +382,9 @@ class ConfigFileTest(CoverageTest): [html] title = tabblo & «ταБЬℓσ» # numbers """) - cov = coverage.coverage() + cov = coverage.Coverage() - self.assertEqual(cov.config.html_title, - "tabblo & «ταБЬℓσ» # numbers" - ) + self.assertEqual(cov.config.html_title, "tabblo & «ταБЬℓσ» # numbers") def test_unreadable_config(self): # If a config file is explicitly specified, then it is an error for it @@ -373,14 +392,14 @@ class ConfigFileTest(CoverageTest): bad_files = [ "nosuchfile.txt", ".", - ] + ] for bad_file in bad_files: msg = "Couldn't read %r as a config file" % bad_file with self.assertRaisesRegex(CoverageException, msg): - coverage.coverage(config_file=bad_file) + coverage.Coverage(config_file=bad_file) def test_nocoveragerc_file_when_specified(self): - cov = coverage.coverage(config_file=".coveragerc") + cov = coverage.Coverage(config_file=".coveragerc") self.assertFalse(cov.config.timid) self.assertFalse(cov.config.branch) self.assertEqual(cov.config.data_file, ".coverage") diff --git a/tests/test_coverage.py b/tests/test_coverage.py index 3de381f1..9e2a444c 100644 --- a/tests/test_coverage.py +++ b/tests/test_coverage.py @@ -1,5 +1,7 @@ -"""Tests for Coverage.""" -# http://nedbatchelder.com/code/coverage +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +"""Tests for coverage.py.""" import coverage from coverage import env @@ -1424,7 +1426,7 @@ class ExcludeTest(CoverageTest): [1,2,3,4,5,6,9], "", excludes=['#pragma: NO COVER']) def test_excluding_if_pass(self): - # From a comment on the coverage page by Michael McNeil Forbes: + # From a comment on the coverage.py page by Michael McNeil Forbes: self.check_coverage("""\ def f(): if False: # pragma: no cover @@ -1663,25 +1665,30 @@ class ModuleTest(CoverageTest): def test_not_singleton(self): # You *can* create another coverage object. - coverage.coverage() - coverage.coverage() + coverage.Coverage() + coverage.Coverage() + + def test_old_name_and_new_name(self): + self.assertIs(coverage.coverage, coverage.Coverage) class ReportingTest(CoverageTest): """Tests of some reporting behavior.""" - # We don't make any temp files, but we need an empty directory to run the - # tests in. + # We don't make any temporary files, but we need an empty directory to run + # the tests in. no_files_in_temp_dir = True def test_no_data_to_report_on_annotate(self): - # Reporting with no data produces a nice message and no output dir. + # Reporting with no data produces a nice message and no output + # directory. with self.assertRaisesRegex(CoverageException, "No data to report."): self.command_line("annotate -d ann") self.assert_doesnt_exist("ann") def test_no_data_to_report_on_html(self): - # Reporting with no data produces a nice message and no output dir. + # Reporting with no data produces a nice message and no output + # directory. with self.assertRaisesRegex(CoverageException, "No data to report."): self.command_line("html -d htmlcov") self.assert_doesnt_exist("htmlcov") diff --git a/tests/test_data.py b/tests/test_data.py index 776f7b59..b3882726 100644 --- a/tests/test_data.py +++ b/tests/test_data.py @@ -1,15 +1,25 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Tests for coverage.data""" +import glob +import json import os +import os.path +import re + +import mock -from coverage.backward import pickle -from coverage.data import CoverageData -from coverage.files import PathAliases +from coverage.backward import StringIO +from coverage.data import CoverageData, CoverageDataFiles, debug_main, canonicalize_json_data +from coverage.files import PathAliases, canonical_filename +from coverage.misc import CoverageException -from tests.coveragetest import CoverageTest +from tests.coveragetest import CoverageTest, DebugControlString -DATA_1 = { +LINES_1 = { 'a.py': {1: None, 2: None}, 'b.py': {3: None}, } @@ -18,171 +28,764 @@ MEASURED_FILES_1 = ['a.py', 'b.py'] A_PY_LINES_1 = [1, 2] B_PY_LINES_1 = [3] -DATA_2 = { +LINES_2 = { 'a.py': {1: None, 5: None}, 'c.py': {17: None}, } SUMMARY_1_2 = {'a.py': 3, 'b.py': 1, 'c.py': 1} MEASURED_FILES_1_2 = ['a.py', 'b.py', 'c.py'] -ARC_DATA_3 = { +ARCS_3 = { 'x.py': { + (-1, 1): None, (1, 2): None, (2, 3): None, + (3, -1): None, }, 'y.py': { + (-1, 17): None, (17, 23): None, + (23, -1): None, + }, +} +X_PY_ARCS_3 = [(-1, 1), (1, 2), (2, 3), (3, -1)] +Y_PY_ARCS_3 = [(-1, 17), (17, 23), (23, -1)] +SUMMARY_3 = {'x.py': 3, 'y.py': 2} +MEASURED_FILES_3 = ['x.py', 'y.py'] +X_PY_LINES_3 = [1, 2, 3] +Y_PY_LINES_3 = [17, 23] + +ARCS_4 = { + 'x.py': { + (-1, 2): None, + (2, 5): None, + (5, -1): None, + }, + 'z.py': { + (-1, 1000): None, + (1000, -1): None, }, } -X_PY_ARCS_3 = [(1, 2), (2, 3)] -Y_PY_ARCS_3 = [(17, 23)] +SUMMARY_3_4 = {'x.py': 5, 'y.py': 2, 'z.py': 1} +MEASURED_FILES_3_4 = ['x.py', 'y.py', 'z.py'] class DataTestHelpers(CoverageTest): """Test helpers for data tests.""" - def assert_summary(self, covdata, summary, fullpath=False): - """Check that the summary of `covdata` is `summary`.""" - self.assertEqual(covdata.summary(fullpath), summary) + def assert_line_counts(self, covdata, line_counts, fullpath=False): + """Check that the line_counts of `covdata` is `line_counts`.""" + self.assertEqual(covdata.line_counts(fullpath), line_counts) def assert_measured_files(self, covdata, measured): """Check that `covdata`'s measured files are `measured`.""" self.assertCountEqual(covdata.measured_files(), measured) + def assert_lines1_data(self, covdata): + """Check that `covdata` has the data from LINES1.""" + self.assert_line_counts(covdata, SUMMARY_1) + self.assert_measured_files(covdata, MEASURED_FILES_1) + self.assertCountEqual(covdata.lines("a.py"), A_PY_LINES_1) + self.assertEqual(covdata.run_infos(), []) + self.assertFalse(covdata.has_arcs()) + + def assert_arcs3_data(self, covdata): + """Check that `covdata` has the data from ARCS3.""" + self.assert_line_counts(covdata, SUMMARY_3) + self.assert_measured_files(covdata, MEASURED_FILES_3) + self.assertCountEqual(covdata.lines("x.py"), X_PY_LINES_3) + self.assertCountEqual(covdata.arcs("x.py"), X_PY_ARCS_3) + self.assertCountEqual(covdata.lines("y.py"), Y_PY_LINES_3) + self.assertCountEqual(covdata.arcs("y.py"), Y_PY_ARCS_3) + self.assertTrue(covdata.has_arcs()) + self.assertEqual(covdata.run_infos(), []) -class DataTest(DataTestHelpers, CoverageTest): - """Test cases for coverage.data.""" + +class CoverageDataTest(DataTestHelpers, CoverageTest): + """Test cases for CoverageData.""" run_in_temp_dir = False - def test_reading_empty(self): + def test_empty_data_is_false(self): covdata = CoverageData() - covdata.read() - self.assert_summary(covdata, {}) + self.assertFalse(covdata) - def test_adding_data(self): + def test_line_data_is_true(self): covdata = CoverageData() - covdata.add_line_data(DATA_1) - self.assert_summary(covdata, SUMMARY_1) - self.assert_measured_files(covdata, MEASURED_FILES_1) + covdata.add_lines(LINES_1) + self.assertTrue(covdata) + + def test_arc_data_is_true(self): + covdata = CoverageData() + covdata.add_arcs(ARCS_3) + self.assertTrue(covdata) + + def test_empty_line_data_is_false(self): + covdata = CoverageData() + covdata.add_lines({}) + self.assertFalse(covdata) + + def test_empty_arc_data_is_false(self): + covdata = CoverageData() + covdata.add_arcs({}) + self.assertFalse(covdata) + + def test_adding_lines(self): + covdata = CoverageData() + covdata.add_lines(LINES_1) + self.assert_lines1_data(covdata) + + def test_adding_arcs(self): + covdata = CoverageData() + covdata.add_arcs(ARCS_3) + self.assert_arcs3_data(covdata) + + def test_ok_to_add_lines_twice(self): + covdata = CoverageData() + covdata.add_lines(LINES_1) + covdata.add_lines(LINES_2) + self.assert_line_counts(covdata, SUMMARY_1_2) + self.assert_measured_files(covdata, MEASURED_FILES_1_2) + + def test_ok_to_add_arcs_twice(self): + covdata = CoverageData() + covdata.add_arcs(ARCS_3) + covdata.add_arcs(ARCS_4) + self.assert_line_counts(covdata, SUMMARY_3_4) + self.assert_measured_files(covdata, MEASURED_FILES_3_4) + + def test_cant_add_arcs_with_lines(self): + covdata = CoverageData() + covdata.add_lines(LINES_1) + with self.assertRaisesRegex(CoverageException, "Can't add arcs to existing line data"): + covdata.add_arcs(ARCS_3) + + def test_cant_add_lines_with_arcs(self): + covdata = CoverageData() + covdata.add_arcs(ARCS_3) + with self.assertRaisesRegex(CoverageException, "Can't add lines to existing arc data"): + covdata.add_lines(LINES_1) + + def test_touch_file_with_lines(self): + covdata = CoverageData() + covdata.add_lines(LINES_1) + covdata.touch_file('zzz.py') + self.assert_measured_files(covdata, MEASURED_FILES_1 + ['zzz.py']) + + def test_touch_file_with_arcs(self): + covdata = CoverageData() + covdata.add_arcs(ARCS_3) + covdata.touch_file('zzz.py') + self.assert_measured_files(covdata, MEASURED_FILES_3 + ['zzz.py']) + + def test_no_lines_vs_unmeasured_file(self): + covdata = CoverageData() + covdata.add_lines(LINES_1) + covdata.touch_file('zzz.py') + self.assertEqual(covdata.lines('zzz.py'), []) + self.assertIsNone(covdata.lines('no_such_file.py')) + + def test_run_info(self): + covdata = CoverageData() + self.assertEqual(covdata.run_infos(), []) + covdata.add_run_info(hello="there") + self.assertEqual(covdata.run_infos(), [{"hello": "there"}]) + covdata.add_run_info(count=17) + self.assertEqual(covdata.run_infos(), [{"hello": "there", "count": 17}]) + + def test_no_arcs_vs_unmeasured_file(self): + covdata = CoverageData() + covdata.add_arcs(ARCS_3) + covdata.touch_file('zzz.py') + self.assertEqual(covdata.lines('zzz.py'), []) + self.assertIsNone(covdata.lines('no_such_file.py')) + self.assertEqual(covdata.arcs('zzz.py'), []) + self.assertIsNone(covdata.arcs('no_such_file.py')) + + def test_file_tracer_name(self): + covdata = CoverageData() + covdata.add_lines({ + "p1.foo": dict.fromkeys([1, 2, 3]), + "p2.html": dict.fromkeys([10, 11, 12]), + "main.py": dict.fromkeys([20]), + }) + covdata.add_file_tracers({"p1.foo": "p1.plugin", "p2.html": "p2.plugin"}) + self.assertEqual(covdata.file_tracer("p1.foo"), "p1.plugin") + self.assertEqual(covdata.file_tracer("main.py"), "") + self.assertIsNone(covdata.file_tracer("p3.not_here")) + + def test_cant_file_tracer_unmeasured_files(self): + covdata = CoverageData() + msg = "Can't add file tracer data for unmeasured file 'p1.foo'" + with self.assertRaisesRegex(CoverageException, msg): + covdata.add_file_tracers({"p1.foo": "p1.plugin"}) + + covdata.add_lines({"p2.html": dict.fromkeys([10, 11, 12])}) + with self.assertRaisesRegex(CoverageException, msg): + covdata.add_file_tracers({"p1.foo": "p1.plugin"}) + + def test_cant_change_file_tracer_name(self): + covdata = CoverageData() + covdata.add_lines({"p1.foo": dict.fromkeys([1, 2, 3])}) + covdata.add_file_tracers({"p1.foo": "p1.plugin"}) + + msg = "Conflicting file tracer name for 'p1.foo': 'p1.plugin' vs 'p1.plugin.foo'" + with self.assertRaisesRegex(CoverageException, msg): + covdata.add_file_tracers({"p1.foo": "p1.plugin.foo"}) + + def test_update_lines(self): + covdata1 = CoverageData() + covdata1.add_lines(LINES_1) + + covdata2 = CoverageData() + covdata2.add_lines(LINES_2) + + covdata3 = CoverageData() + covdata3.update(covdata1) + covdata3.update(covdata2) + + self.assert_line_counts(covdata3, SUMMARY_1_2) + self.assert_measured_files(covdata3, MEASURED_FILES_1_2) + self.assertEqual(covdata3.run_infos(), []) + + def test_update_arcs(self): + covdata1 = CoverageData() + covdata1.add_arcs(ARCS_3) + + covdata2 = CoverageData() + covdata2.add_arcs(ARCS_4) + + covdata3 = CoverageData() + covdata3.update(covdata1) + covdata3.update(covdata2) + + self.assert_line_counts(covdata3, SUMMARY_3_4) + self.assert_measured_files(covdata3, MEASURED_FILES_3_4) + self.assertEqual(covdata3.run_infos(), []) + + def test_update_run_info(self): + covdata1 = CoverageData() + covdata1.add_arcs(ARCS_3) + covdata1.add_run_info(hello="there", count=17) + + covdata2 = CoverageData() + covdata2.add_arcs(ARCS_4) + covdata2.add_run_info(hello="goodbye", count=23) + + covdata3 = CoverageData() + covdata3.update(covdata1) + covdata3.update(covdata2) + + self.assertEqual(covdata3.run_infos(), [ + {'hello': 'there', 'count': 17}, + {'hello': 'goodbye', 'count': 23}, + ]) + + def test_update_cant_mix_lines_and_arcs(self): + covdata1 = CoverageData() + covdata1.add_lines(LINES_1) + + covdata2 = CoverageData() + covdata2.add_arcs(ARCS_3) + + with self.assertRaisesRegex(CoverageException, "Can't combine arc data with line data"): + covdata1.update(covdata2) + + with self.assertRaisesRegex(CoverageException, "Can't combine line data with arc data"): + covdata2.update(covdata1) + + def test_update_file_tracers(self): + covdata1 = CoverageData() + covdata1.add_lines({ + "p1.html": dict.fromkeys([1, 2, 3, 4]), + "p2.html": dict.fromkeys([5, 6, 7]), + "main.py": dict.fromkeys([10, 11, 12]), + }) + covdata1.add_file_tracers({ + "p1.html": "html.plugin", + "p2.html": "html.plugin2", + }) + + covdata2 = CoverageData() + covdata2.add_lines({ + "p1.html": dict.fromkeys([3, 4, 5, 6]), + "p2.html": dict.fromkeys([7, 8, 9]), + "p3.foo": dict.fromkeys([1000, 1001]), + "main.py": dict.fromkeys([10, 11, 12]), + }) + covdata2.add_file_tracers({ + "p1.html": "html.plugin", + "p2.html": "html.plugin2", + "p3.foo": "foo_plugin", + }) + + covdata3 = CoverageData() + covdata3.update(covdata1) + covdata3.update(covdata2) + self.assertEqual(covdata3.file_tracer("p1.html"), "html.plugin") + self.assertEqual(covdata3.file_tracer("p2.html"), "html.plugin2") + self.assertEqual(covdata3.file_tracer("p3.foo"), "foo_plugin") + self.assertEqual(covdata3.file_tracer("main.py"), "") + + def test_update_conflicting_file_tracers(self): + covdata1 = CoverageData() + covdata1.add_lines({"p1.html": dict.fromkeys([1, 2, 3])}) + covdata1.add_file_tracers({"p1.html": "html.plugin"}) + + covdata2 = CoverageData() + covdata2.add_lines({"p1.html": dict.fromkeys([1, 2, 3])}) + covdata2.add_file_tracers({"p1.html": "html.other_plugin"}) + + msg = "Conflicting file tracer name for 'p1.html': 'html.plugin' vs 'html.other_plugin'" + with self.assertRaisesRegex(CoverageException, msg): + covdata1.update(covdata2) + + msg = "Conflicting file tracer name for 'p1.html': 'html.other_plugin' vs 'html.plugin'" + with self.assertRaisesRegex(CoverageException, msg): + covdata2.update(covdata1) + + def test_update_file_tracer_vs_no_file_tracer(self): + covdata1 = CoverageData() + covdata1.add_lines({"p1.html": dict.fromkeys([1, 2, 3])}) + covdata1.add_file_tracers({"p1.html": "html.plugin"}) + + covdata2 = CoverageData() + covdata2.add_lines({"p1.html": dict.fromkeys([1, 2, 3])}) + + msg = "Conflicting file tracer name for 'p1.html': 'html.plugin' vs ''" + with self.assertRaisesRegex(CoverageException, msg): + covdata1.update(covdata2) + + msg = "Conflicting file tracer name for 'p1.html': '' vs 'html.plugin'" + with self.assertRaisesRegex(CoverageException, msg): + covdata2.update(covdata1) + + def test_add_to_hash_with_lines(self): + covdata = CoverageData() + covdata.add_lines(LINES_1) + hasher = mock.Mock() + covdata.add_to_hash("a.py", hasher) + self.assertEqual(hasher.method_calls, [ + mock.call.update([1, 2]), # lines + mock.call.update(""), # file_tracer name + ]) + + def test_add_to_hash_with_arcs(self): + covdata = CoverageData() + covdata.add_arcs(ARCS_3) + covdata.add_file_tracers({"y.py": "hologram_plugin"}) + hasher = mock.Mock() + covdata.add_to_hash("y.py", hasher) + self.assertEqual(hasher.method_calls, [ + mock.call.update([(-1, 17), (17, 23), (23, -1)]), # arcs + mock.call.update("hologram_plugin"), # file_tracer name + ]) + + def test_add_to_lines_hash_with_missing_file(self): + # https://bitbucket.org/ned/coveragepy/issues/403 + covdata = CoverageData() + covdata.add_lines(LINES_1) + hasher = mock.Mock() + covdata.add_to_hash("missing.py", hasher) + self.assertEqual(hasher.method_calls, [ + mock.call.update([]), + mock.call.update(None), + ]) + + def test_add_to_arcs_hash_with_missing_file(self): + # https://bitbucket.org/ned/coveragepy/issues/403 + covdata = CoverageData() + covdata.add_arcs(ARCS_3) + covdata.add_file_tracers({"y.py": "hologram_plugin"}) + hasher = mock.Mock() + covdata.add_to_hash("missing.py", hasher) + self.assertEqual(hasher.method_calls, [ + mock.call.update([]), + mock.call.update(None), + ]) + + def test_empty_lines_are_still_lines(self): + covdata = CoverageData() + covdata.add_lines({}) + covdata.touch_file("abc.py") + self.assertFalse(covdata.has_arcs()) + + def test_empty_arcs_are_still_arcs(self): + covdata = CoverageData() + covdata.add_arcs({}) + covdata.touch_file("abc.py") + self.assertTrue(covdata.has_arcs()) + + def test_read_and_write_are_opposites(self): + covdata1 = CoverageData() + covdata1.add_arcs(ARCS_3) + stringio = StringIO() + covdata1.write_fileobj(stringio) + + stringio.seek(0) + covdata2 = CoverageData() + covdata2.read_fileobj(stringio) + self.assert_arcs3_data(covdata2) + + +class CoverageDataTestInTempDir(DataTestHelpers, CoverageTest): + """Tests of CoverageData that need a temporary directory to make files.""" + + def test_read_write_lines(self): + covdata1 = CoverageData() + covdata1.add_lines(LINES_1) + covdata1.write_file("lines.dat") + + covdata2 = CoverageData() + covdata2.read_file("lines.dat") + self.assert_lines1_data(covdata2) + + def test_read_write_arcs(self): + covdata1 = CoverageData() + covdata1.add_arcs(ARCS_3) + covdata1.write_file("arcs.dat") + + covdata2 = CoverageData() + covdata2.read_file("arcs.dat") + self.assert_arcs3_data(covdata2) + + def test_read_errors(self): + covdata = CoverageData() + + msg = r"Couldn't read data from '{0}': \S+" + self.make_file("xyzzy.dat", "xyzzy") + with self.assertRaisesRegex(CoverageException, msg.format("xyzzy.dat")): + covdata.read_file("xyzzy.dat") + + self.make_file("empty.dat", "") + with self.assertRaisesRegex(CoverageException, msg.format("empty.dat")): + covdata.read_file("empty.dat") + + with self.assertRaisesRegex(CoverageException, msg.format("nonexistent.dat")): + covdata.read_file("nonexistent.dat") + + self.make_file("misleading.dat", CoverageData._GO_AWAY + " this isn't JSON") + with self.assertRaisesRegex(CoverageException, msg.format("misleading.dat")): + covdata.read_file("misleading.dat") - def test_touch_file(self): + # After all that, no data should be in our CoverageData. + self.assertFalse(covdata) + + def test_debug_main(self): + covdata1 = CoverageData() + covdata1.add_lines(LINES_1) + covdata1.write_file(".coverage") + debug_main([]) + + covdata2 = CoverageData() + covdata2.add_arcs(ARCS_3) + covdata2.add_file_tracers({"y.py": "magic_plugin"}) + covdata2.add_run_info(version="v3.14", chunks=["z", "a"]) + covdata2.write_file("arcs.dat") + + covdata3 = CoverageData() + covdata3.write_file("empty.dat") + debug_main(["arcs.dat", "empty.dat"]) + + expected = { + ".coverage": { + "lines": { + "a.py": [1, 2], + "b.py": [3], + }, + }, + "arcs.dat": { + "arcs": { + "x.py": [[-1, 1], [1, 2], [2, 3], [3, -1]], + "y.py": [[-1, 17], [17, 23], [23, -1]], + }, + "file_tracers": {"y.py": "magic_plugin"}, + "runs": [ + { + "chunks": ["z", "a"], + "version": "v3.14", + }, + ], + }, + "empty.dat": {}, + } + pieces = re.split(r"(?m)-+ ([\w.]+) -+$", self.stdout()) + for name, json_out in zip(pieces[1::2], pieces[2::2]): + json_got = json.loads(json_out) + canonicalize_json_data(json_got) + self.assertEqual(expected[name], json_got) + + +class CoverageDataFilesTest(DataTestHelpers, CoverageTest): + """Tests of CoverageDataFiles.""" + + no_files_in_temp_dir = True + + def setUp(self): + super(CoverageDataFilesTest, self).setUp() + self.data_files = CoverageDataFiles() + + def test_reading_missing(self): + self.assert_doesnt_exist(".coverage") covdata = CoverageData() - covdata.add_line_data(DATA_1) - covdata.touch_file('x.py') - self.assert_measured_files(covdata, MEASURED_FILES_1 + ['x.py']) + self.data_files.read(covdata) + self.assert_line_counts(covdata, {}) def test_writing_and_reading(self): covdata1 = CoverageData() - covdata1.add_line_data(DATA_1) - covdata1.write() + covdata1.add_lines(LINES_1) + self.data_files.write(covdata1) covdata2 = CoverageData() - covdata2.read() - self.assert_summary(covdata2, SUMMARY_1) + self.data_files.read(covdata2) + self.assert_line_counts(covdata2, SUMMARY_1) + + def test_debug_output_with_debug_option(self): + # With debug option dataio, we get debug output about reading and + # writing files. + debug = DebugControlString(options=["dataio"]) + covdata1 = CoverageData(debug=debug) + covdata1.add_lines(LINES_1) + self.data_files.write(covdata1) + + covdata2 = CoverageData(debug=debug) + self.data_files.read(covdata2) + self.assert_line_counts(covdata2, SUMMARY_1) + + self.assertRegex( + debug.get_output(), + r"^Writing data to '.*\.coverage'\n" + r"Reading data from '.*\.coverage'\n$" + ) + + def test_debug_output_without_debug_option(self): + # With a debug object, but not the dataio option, we don't get debug + # output. + debug = DebugControlString(options=[]) + covdata1 = CoverageData(debug=debug) + covdata1.add_lines(LINES_1) + self.data_files.write(covdata1) + + covdata2 = CoverageData(debug=debug) + self.data_files.read(covdata2) + self.assert_line_counts(covdata2, SUMMARY_1) + + self.assertEqual(debug.get_output(), "") + + def test_explicit_suffix(self): + self.assert_doesnt_exist(".coverage.SUFFIX") + covdata = CoverageData() + covdata.add_lines(LINES_1) + self.data_files.write(covdata, suffix='SUFFIX') + self.assert_exists(".coverage.SUFFIX") + self.assert_doesnt_exist(".coverage") + + def test_true_suffix(self): + self.assertEqual(glob.glob(".coverage.*"), []) + + # suffix=True will make a randomly named data file. + covdata1 = CoverageData() + covdata1.add_lines(LINES_1) + self.data_files.write(covdata1, suffix=True) + self.assert_doesnt_exist(".coverage") + data_files1 = glob.glob(".coverage.*") + self.assertEqual(len(data_files1), 1) + + # Another suffix=True will choose a different name. + covdata2 = CoverageData() + covdata2.add_lines(LINES_1) + self.data_files.write(covdata2, suffix=True) + self.assert_doesnt_exist(".coverage") + data_files2 = glob.glob(".coverage.*") + self.assertEqual(len(data_files2), 2) + + # In addition to being different, the suffixes have the pid in them. + self.assertTrue(all(str(os.getpid()) in fn for fn in data_files2)) def test_combining(self): + self.assert_doesnt_exist(".coverage.1") + self.assert_doesnt_exist(".coverage.2") + covdata1 = CoverageData() - covdata1.add_line_data(DATA_1) - covdata1.write(suffix='1') + covdata1.add_lines(LINES_1) + self.data_files.write(covdata1, suffix='1') + self.assert_exists(".coverage.1") + self.assert_doesnt_exist(".coverage.2") covdata2 = CoverageData() - covdata2.add_line_data(DATA_2) - covdata2.write(suffix='2') + covdata2.add_lines(LINES_2) + self.data_files.write(covdata2, suffix='2') + self.assert_exists(".coverage.2") covdata3 = CoverageData() - covdata3.combine_parallel_data() - self.assert_summary(covdata3, SUMMARY_1_2) + self.data_files.combine_parallel_data(covdata3) + self.assert_line_counts(covdata3, SUMMARY_1_2) self.assert_measured_files(covdata3, MEASURED_FILES_1_2) + self.assert_doesnt_exist(".coverage.1") + self.assert_doesnt_exist(".coverage.2") def test_erasing(self): covdata1 = CoverageData() - covdata1.add_line_data(DATA_1) - covdata1.write() + covdata1.add_lines(LINES_1) + self.data_files.write(covdata1) + covdata1.erase() - self.assert_summary(covdata1, {}) + self.assert_line_counts(covdata1, {}) + self.data_files.erase() covdata2 = CoverageData() - covdata2.read() - self.assert_summary(covdata2, {}) + self.data_files.read(covdata2) + self.assert_line_counts(covdata2, {}) + + def test_erasing_parallel(self): + self.make_file("datafile.1") + self.make_file("datafile.2") + self.make_file(".coverage") + data_files = CoverageDataFiles("datafile") + data_files.erase(parallel=True) + self.assert_doesnt_exist("datafile.1") + self.assert_doesnt_exist("datafile.2") + self.assert_exists(".coverage") + + def read_json_data_file(self, fname): + """Read a JSON data file for testing the JSON directly.""" + with open(fname, 'r') as fdata: + go_away = fdata.read(len(CoverageData._GO_AWAY)) + self.assertEqual(go_away, CoverageData._GO_AWAY) + return json.load(fdata) def test_file_format(self): - # Write with CoverageData, then read the pickle explicitly. + # Write with CoverageData, then read the JSON explicitly. covdata = CoverageData() - covdata.add_line_data(DATA_1) - covdata.write() + covdata.add_lines(LINES_1) + self.data_files.write(covdata) - with open(".coverage", 'rb') as fdata: - data = pickle.load(fdata) + data = self.read_json_data_file(".coverage") lines = data['lines'] self.assertCountEqual(lines.keys(), MEASURED_FILES_1) self.assertCountEqual(lines['a.py'], A_PY_LINES_1) self.assertCountEqual(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') + self.assertNotIn('arcs', data) + # If no file tracers were involved, there's no file_tracers entry. + self.assertNotIn('file_tracers', data) def test_file_format_with_arcs(self): - # Write with CoverageData, then read the pickle explicitly. + # Write with CoverageData, then read the JSON explicitly. covdata = CoverageData() - covdata.add_arc_data(ARC_DATA_3) - covdata.write() + covdata.add_arcs(ARCS_3) + self.data_files.write(covdata) - with open(".coverage", 'rb') as fdata: - data = pickle.load(fdata) + data = self.read_json_data_file(".coverage") - self.assertCountEqual(data['lines'].keys(), []) + self.assertNotIn('lines', data) arcs = data['arcs'] - self.assertCountEqual(arcs['x.py'], X_PY_ARCS_3) - self.assertCountEqual(arcs['y.py'], Y_PY_ARCS_3) + self.assertCountEqual(arcs.keys(), MEASURED_FILES_3) + self.assertCountEqual(arcs['x.py'], map(list, X_PY_ARCS_3)) + self.assertCountEqual(arcs['y.py'], map(list, Y_PY_ARCS_3)) + # If no file tracers were involved, there's no file_tracers entry. + self.assertNotIn('file_tracers', data) + + def test_writing_to_other_file(self): + data_files = CoverageDataFiles(".otherfile") + covdata = CoverageData() + covdata.add_lines(LINES_1) + data_files.write(covdata) + self.assert_doesnt_exist(".coverage") + self.assert_exists(".otherfile") + + data_files.write(covdata, suffix="extra") + self.assert_exists(".otherfile.extra") + self.assert_doesnt_exist(".coverage") def test_combining_with_aliases(self): covdata1 = CoverageData() - covdata1.add_line_data({ + covdata1.add_lines({ '/home/ned/proj/src/a.py': {1: None, 2: None}, '/home/ned/proj/src/sub/b.py': {3: None}, - }) - covdata1.write(suffix='1') + '/home/ned/proj/src/template.html': {10: None}, + }) + covdata1.add_file_tracers({ + '/home/ned/proj/src/template.html': 'html.plugin', + }) + self.data_files.write(covdata1, suffix='1') covdata2 = CoverageData() - covdata2.add_line_data({ + covdata2.add_lines({ r'c:\ned\test\a.py': {4: None, 5: None}, - r'c:\ned\test\sub\b.py': {6: None}, - }) - covdata2.write(suffix='2') + r'c:\ned\test\sub\b.py': {3: None, 6: None}, + }) + self.data_files.write(covdata2, suffix='2') covdata3 = CoverageData() aliases = PathAliases() aliases.add("/home/ned/proj/src/", "./") aliases.add(r"c:\ned\test", "./") - covdata3.combine_parallel_data(aliases=aliases) - self.assert_summary( - covdata3, {'./a.py': 4, './sub/b.py': 2}, fullpath=True - ) - self.assert_measured_files(covdata3, ['./a.py', './sub/b.py']) - + self.data_files.combine_parallel_data(covdata3, aliases=aliases) -class DataTestInTempDir(DataTestHelpers, CoverageTest): - """Test cases for coverage.data.""" + apy = canonical_filename('./a.py') + sub_bpy = canonical_filename('./sub/b.py') + template_html = canonical_filename('./template.html') - no_files_in_temp_dir = True + self.assert_line_counts(covdata3, {apy: 4, sub_bpy: 2, template_html: 1}, fullpath=True) + self.assert_measured_files(covdata3, [apy, sub_bpy, template_html]) + self.assertEqual(covdata3.file_tracer(template_html), 'html.plugin') def test_combining_from_different_directories(self): covdata1 = CoverageData() - covdata1.add_line_data(DATA_1) + covdata1.add_lines(LINES_1) os.makedirs('cov1') covdata1.write_file('cov1/.coverage.1') covdata2 = CoverageData() - covdata2.add_line_data(DATA_2) + covdata2.add_lines(LINES_2) os.makedirs('cov2') covdata2.write_file('cov2/.coverage.2') + # This data won't be included. + covdata_xxx = CoverageData() + covdata_xxx.add_arcs(ARCS_3) + covdata_xxx.write_file('.coverage.xxx') + covdata3 = CoverageData() - covdata3.combine_parallel_data(data_dirs=[ - 'cov1/', - 'cov2/', - ]) + self.data_files.combine_parallel_data(covdata3, data_paths=['cov1', 'cov2']) - self.assert_summary(covdata3, SUMMARY_1_2) + self.assert_line_counts(covdata3, SUMMARY_1_2) self.assert_measured_files(covdata3, MEASURED_FILES_1_2) + self.assert_doesnt_exist("cov1/.coverage.1") + self.assert_doesnt_exist("cov2/.coverage.2") + self.assert_exists(".coverage.xxx") + + def test_combining_from_files(self): + covdata1 = CoverageData() + covdata1.add_lines(LINES_1) + os.makedirs('cov1') + covdata1.write_file('cov1/.coverage.1') + + covdata2 = CoverageData() + covdata2.add_lines(LINES_2) + os.makedirs('cov2') + covdata2.write_file('cov2/.coverage.2') + + # This data won't be included. + covdata_xxx = CoverageData() + covdata_xxx.add_arcs(ARCS_3) + covdata_xxx.write_file('.coverage.xxx') + covdata_xxx.write_file('cov2/.coverage.xxx') + + covdata3 = CoverageData() + self.data_files.combine_parallel_data(covdata3, data_paths=['cov1', 'cov2/.coverage.2']) + + self.assert_line_counts(covdata3, SUMMARY_1_2) + self.assert_measured_files(covdata3, MEASURED_FILES_1_2) + self.assert_doesnt_exist("cov1/.coverage.1") + self.assert_doesnt_exist("cov2/.coverage.2") + self.assert_exists(".coverage.xxx") + self.assert_exists("cov2/.coverage.xxx") + + def test_combining_from_nonexistent_directories(self): + covdata = CoverageData() + msg = "Couldn't combine from non-existent path 'xyzzy'" + with self.assertRaisesRegex(CoverageException, msg): + self.data_files.combine_parallel_data(covdata, data_paths=['xyzzy']) diff --git a/tests/test_debug.py b/tests/test_debug.py index 8dd13a57..4d9e9271 100644 --- a/tests/test_debug.py +++ b/tests/test_debug.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Tests of coverage/debug.py""" import os @@ -61,7 +64,7 @@ class DebugTraceTest(CoverageTest): """) debug_out = StringIO() - cov = coverage.coverage(debug=debug) + cov = coverage.Coverage(debug=debug) cov._debug_file = debug_out self.start_import_stop(cov, "f1") @@ -116,7 +119,7 @@ class DebugTraceTest(CoverageTest): out_lines = self.f1_debug_output(["sys"]) labels = """ - version coverage cover_dir pylib_dirs tracer config_files + version coverage cover_dirs pylib_dirs tracer config_files configs_read data_path python platform implementation executable cwd path environment command_line cover_match pylib_match """.split() diff --git a/tests/test_execfile.py b/tests/test_execfile.py index 49d6cc8c..135240f9 100644 --- a/tests/test_execfile.py +++ b/tests/test_execfile.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Tests for coverage.execfile""" import compileall @@ -82,6 +85,18 @@ class RunFileTest(CoverageTest): with self.assertRaises(NoSource): run_python_file("xyzzy.py", []) + def test_directory_with_main(self): + self.make_file("with_main/__main__.py", """\ + print("I am __main__") + """) + run_python_file("with_main", ["with_main"]) + self.assertEqual(self.stdout(), "I am __main__\n") + + def test_directory_without_main(self): + self.make_file("without_main/__init__.py", "") + with self.assertRaisesRegex(NoSource, "Can't find '__main__' module in 'without_main'"): + run_python_file("without_main", ["without_main"]) + class RunPycFileTest(CoverageTest): """Test cases for `run_python_file`.""" @@ -150,22 +165,27 @@ class RunModuleTest(CoverageTest): def test_runmod2(self): run_python_module("pkg1.runmod2", ["runmod2", "hello"]) self.assertEqual(self.stderr(), "") - self.assertEqual(self.stdout(), "runmod2: passed hello\n") + self.assertEqual(self.stdout(), "pkg1.__init__: pkg1\nrunmod2: passed hello\n") def test_runmod3(self): run_python_module("pkg1.sub.runmod3", ["runmod3", "hello"]) self.assertEqual(self.stderr(), "") - self.assertEqual(self.stdout(), "runmod3: passed hello\n") + self.assertEqual(self.stdout(), "pkg1.__init__: pkg1\nrunmod3: passed hello\n") def test_pkg1_main(self): run_python_module("pkg1", ["pkg1", "hello"]) self.assertEqual(self.stderr(), "") - self.assertEqual(self.stdout(), "pkg1.__main__: passed hello\n") + self.assertEqual(self.stdout(), "pkg1.__init__: pkg1\npkg1.__main__: passed hello\n") def test_pkg1_sub_main(self): run_python_module("pkg1.sub", ["pkg1.sub", "hello"]) self.assertEqual(self.stderr(), "") - self.assertEqual(self.stdout(), "pkg1.sub.__main__: passed hello\n") + self.assertEqual(self.stdout(), "pkg1.__init__: pkg1\npkg1.sub.__main__: passed hello\n") + + def test_pkg1_init(self): + run_python_module("pkg1.__init__", ["pkg1.__init__", "wut?"]) + self.assertEqual(self.stderr(), "") + self.assertEqual(self.stdout(), "pkg1.__init__: pkg1\npkg1.__init__: __main__\n") def test_no_such_module(self): with self.assertRaises(NoSource): diff --git a/tests/test_farm.py b/tests/test_farm.py index 92bd968a..0db0af88 100644 --- a/tests/test_farm.py +++ b/tests/test_farm.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Run tests in the farm sub-directory. Designed for nose.""" import difflib @@ -8,13 +11,15 @@ import os import re import shutil import sys +import unittest from nose.plugins.skip import SkipTest +from coverage.test_helpers import ModuleAwareMixin, SysPathAwareMixin, change_dir, saved_sys_path from tests.helpers import run_command from tests.backtest import execfile # pylint: disable=redefined-builtin -from coverage.control import _TEST_NAME_FILE +from coverage.debug import _TEST_NAME_FILE def test_farm(clean_only=False): @@ -28,7 +33,7 @@ def test_farm(clean_only=False): READ_MODE = "rU" if sys.version_info < (3, 4) else "r" -class FarmTestCase(object): +class FarmTestCase(ModuleAwareMixin, SysPathAwareMixin, unittest.TestCase): """A test case from the farm tree. Tests are short Python script files, often called run.py: @@ -45,7 +50,15 @@ class FarmTestCase(object): has options to allow various uses of the test cases (normal execution, cleaning-only, or run and leave the results for debugging). + This class is a unittest.TestCase so that we can use behavior-modifying + mixins, but it's only useful as a nose test function. Yes, this is + confusing. + """ + + # We don't want test runners finding this and instantiating it themselves. + __test__ = False + def __init__(self, runpy, clean_only=False, dont_clean=False): """Create a test case from a run.py file. @@ -53,65 +66,63 @@ class FarmTestCase(object): `dont_clean` means that the clean() action is not executed. """ + super(FarmTestCase, self).__init__() + self.description = runpy self.dir, self.runpy = os.path.split(runpy) self.clean_only = clean_only self.dont_clean = dont_clean self.ok = True - def cd(self, newdir): - """Change the current directory, and return the old one.""" - cwd = os.getcwd() - os.chdir(newdir) - return cwd + def setUp(self): + """Test set up, run by nose before __call__.""" + super(FarmTestCase, self).setUp() + # Modules should be importable from the current directory. + sys.path.insert(0, '') - def addtopath(self, directory): - """Add `directory` to the path, and return the old path.""" - oldpath = sys.path[:] - if directory is not None: - sys.path.insert(0, directory) - return oldpath + def tearDown(self): + """Test tear down, run by nose after __call__.""" + # Make sure the test is cleaned up, unless we never want to, or if the + # test failed. + if not self.dont_clean and self.ok: # pragma: part covered + self.clean_only = True + self() - def restorepath(self, path): - """Restore the system path to `path`.""" - sys.path = path + super(FarmTestCase, self).tearDown() - def __call__(self): - """Execute the test from the run.py file. + # This object will be run by nose via the __call__ method, and nose + # doesn't do cleanups in that case. Do them now. + self.doCleanups() - """ + def runTest(self): + """Here to make unittest.TestCase happy, but will never be invoked.""" + raise Exception("runTest isn't used in this class!") + + def __call__(self): + """Execute the test from the run.py file.""" if _TEST_NAME_FILE: # pragma: debugging with open(_TEST_NAME_FILE, "w") as f: f.write(self.description.replace("/", "_")) - cwd = self.cd(self.dir) - # Prepare a dictionary of globals for the run.py files to use. fns = """ copy run runfunc clean skip compare contains contains_any doesnt_contain """.split() if self.clean_only: - glo = dict((fn, self.noop) for fn in fns) - glo['clean'] = self.clean + glo = dict((fn, noop) for fn in fns) + glo['clean'] = clean else: - glo = dict((fn, getattr(self, fn)) for fn in fns) + glo = dict((fn, globals()[fn]) for fn in fns) if self.dont_clean: # pragma: not covered - glo['clean'] = self.noop + glo['clean'] = noop - old_mods = dict(sys.modules) - try: - execfile(self.runpy, glo) - except Exception: - self.ok = False - raise - 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. - to_del = [m for m in sys.modules if m not in old_mods] - for m in to_del: - del sys.modules[m] + with change_dir(self.dir): + try: + execfile(self.runpy, glo) + except Exception: + self.ok = False + raise def run_fully(self): # pragma: not covered """Run as a full test case, with setUp and tearDown.""" @@ -121,58 +132,30 @@ class FarmTestCase(object): finally: self.tearDown() - 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 file_pattern: - files = [f for f in files if fnmatch.fnmatch(f, file_pattern)] - return files - - def setUp(self): - """Test set up, run by nose before __call__.""" - - # 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 the test is cleaned up, unless we never want to, or if the - # test failed. - if not self.dont_clean and self.ok: # pragma: part covered - self.clean_only = True - self() - # Restore the original sys.path - sys.path = self.old_syspath +# Functions usable inside farm run.py files - # Functions usable inside farm run.py files +def noop(*args_unused, **kwargs_unused): + """A no-op function to stub out run, copy, etc, when only cleaning.""" + pass - 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.""" +def copy(src, dst): + """Copy a directory.""" + if os.path.exists(dst): + shutil.rmtree(dst) + shutil.copytree(src, dst) - if os.path.exists(dst): - shutil.rmtree(dst) - shutil.copytree(src, dst) - def run(self, cmds, rundir="src", outfile=None): - """Run a list of commands. +def run(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. + `cmds` is a string, commands separated by newlines. + `rundir` is the directory in which to run the commands. + `outfile` is a file name to redirect stdout to. - """ - cwd = self.cd(rundir) + """ + with change_dir(rundir): if outfile: fout = open(outfile, "a+") try: @@ -189,190 +172,207 @@ class FarmTestCase(object): finally: if outfile: fout.close() - self.cd(cwd) - 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. +def runfunc(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: + """ + with change_dir(rundir): + with saved_sys_path(): + if addtopath is not None: + sys.path.insert(0, addtopath) fn() - finally: - self.cd(cwd) - self.restorepath(oldpath) - def compare( - self, dir1, dir2, file_pattern=None, size_within=0, - left_extra=False, right_extra=False, scrubs=None - ): - """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. +def compare( + dir1, dir2, file_pattern=None, size_within=0, + left_extra=False, right_extra=False, scrubs=None +): + """Compare files matching `file_pattern` in `dir1` and `dir2`. - `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. + `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. - `left_extra` true means the left directory can have extra files in it - without triggering an assertion. `right_extra` means the right - directory can. + `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. - `scrubs` is a list of pairs, regex find and replace patterns to use to - scrub the files of unimportant differences. + `left_extra` true means the left directory can have extra files in it + without triggering an assertion. `right_extra` means the right + directory can. - An assertion will be raised if the directories fail one of their - matches. + `scrubs` is a list of pairs, regexes to find and literal strings to + replace them with to scrub the files of unimportant differences. - """ - # Search for a dir2 with a version suffix. - version_suff = ''.join(map(str, sys.version_info[:3])) - while version_suff: - trydir = dir2 + '_v' + version_suff - if os.path.exists(trydir): - dir2 = trydir - break - version_suff = version_suff[:-1] - - 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, file_pattern) - left_only = self.fnmatch_list(dc.left_only, file_pattern) - right_only = self.fnmatch_list(dc.right_only, file_pattern) - show_diff = True - - if size_within: - # The files were already compared, use the diff_files list as a - # guide for size comparison. - wrong_size = [] - for f in diff_files: - with open(os.path.join(dir1, f), "rb") as fobj: - left = fobj.read() - with open(os.path.join(dir2, f), "rb") as fobj: - right = fobj.read() - size_l, size_r = len(left), len(right) - big, little = max(size_l, size_r), min(size_l, size_r) - if (big - little) / float(little) > size_within/100.0: - # print "%d %d" % (big, little) - # print "Left: ---\n%s\n-----\n%s" % (left, right) - wrong_size.append("%s (%s,%s)" % (f, size_l, size_r)) - if wrong_size: - print("File sizes differ between %s and %s: %s" % ( - dir1, dir2, ", ".join(wrong_size) - )) - - # We'll show the diff iff the files differed enough in size. - show_diff = bool(wrong_size) - - if show_diff: - # filecmp only compares in binary mode, but we want text mode. So - # look through the list of different files, and compare them - # ourselves. - text_diff = [] - for f in diff_files: - with open(os.path.join(dir1, f), READ_MODE) as fobj: - left = fobj.read() - with open(os.path.join(dir2, f), READ_MODE) as fobj: - right = fobj.read() - if scrubs: - left = self._scrub(left, scrubs) - right = self._scrub(right, scrubs) - if left != right: - text_diff.append(f) - left = left.splitlines() - right = right.splitlines() - print("\n".join(difflib.Differ().compare(left, right))) - assert not text_diff, "Files differ: %s" % text_diff - - if not left_extra: - assert not left_only, "Files in %s only: %s" % (dir1, left_only) - if not right_extra: - assert not right_only, "Files in %s only: %s" % (dir2, right_only) - - def _scrub(self, strdata, scrubs): - """Scrub uninteresting data from the payload in `strdata`. - - `scrubs` is a list of (find, replace) pairs of regexes that are used on - `strdata`. A string is returned. + An assertion will be raised if the directories fail one of their + matches. - """ - for rgx_find, rgx_replace in scrubs: - strdata = re.sub(rgx_find, rgx_replace, strdata) - return strdata + """ + # Search for a dir2 with a version suffix. + version_suff = ''.join(map(str, sys.version_info[:3])) + while version_suff: + trydir = dir2 + '_v' + version_suff + if os.path.exists(trydir): + dir2 = trydir + break + version_suff = version_suff[:-1] + + 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 = fnmatch_list(dc.diff_files, file_pattern) + left_only = fnmatch_list(dc.left_only, file_pattern) + right_only = fnmatch_list(dc.right_only, file_pattern) + show_diff = True + + if size_within: + # The files were already compared, use the diff_files list as a + # guide for size comparison. + wrong_size = [] + for f in diff_files: + with open(os.path.join(dir1, f), "rb") as fobj: + left = fobj.read() + with open(os.path.join(dir2, f), "rb") as fobj: + right = fobj.read() + size_l, size_r = len(left), len(right) + big, little = max(size_l, size_r), min(size_l, size_r) + if (big - little) / float(little) > size_within/100.0: + # print "%d %d" % (big, little) + # print "Left: ---\n%s\n-----\n%s" % (left, right) + wrong_size.append("%s (%s,%s)" % (f, size_l, size_r)) + if wrong_size: + print("File sizes differ between %s and %s: %s" % ( + dir1, dir2, ", ".join(wrong_size) + )) + + # We'll show the diff iff the files differed enough in size. + show_diff = bool(wrong_size) + + if show_diff: + # filecmp only compares in binary mode, but we want text mode. So + # look through the list of different files, and compare them + # ourselves. + text_diff = [] + for f in diff_files: + with open(os.path.join(dir1, f), READ_MODE) as fobj: + left = fobj.read() + with open(os.path.join(dir2, f), READ_MODE) as fobj: + right = fobj.read() + if scrubs: + left = scrub(left, scrubs) + right = scrub(right, scrubs) + if left != right: + text_diff.append(f) + left = left.splitlines() + right = right.splitlines() + print("\n".join(difflib.Differ().compare(left, right))) + assert not text_diff, "Files differ: %s" % text_diff + + if not left_extra: + assert not left_only, "Files in %s only: %s" % (dir1, left_only) + if not right_extra: + assert not right_only, "Files in %s only: %s" % (dir2, right_only) + + +def contains(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`. + + """ + with open(filename, "r") as fobj: + text = fobj.read() + for s in strlist: + assert s in text, "Missing content in %s: %r" % (filename, s) - 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`. +def contains_any(filename, *strlist): + """Check that the file contains at least one of a list of strings. - """ - with open(filename, "r") as fobj: - text = fobj.read() - for s in strlist: - assert s in text, "Missing content in %s: %r" % (filename, s) + An assert will be raised if none of the arguments in `strlist` is in + `filename`. - def contains_any(self, filename, *strlist): - """Check that the file contains at least one of a list of strings. + """ + with open(filename, "r") as fobj: + text = fobj.read() + for s in strlist: + if s in text: + return + assert False, "Missing content in %s: %r [1 of %d]" % (filename, strlist[0], len(strlist),) - An assert will be raised if none of the arguments in `strlist` is in - `filename`. - """ - with open(filename, "r") as fobj: - text = fobj.read() - for s in strlist: - if s in text: - return - assert False, "Missing content in %s: %r [1 of %d]" % ( - filename, strlist[0], len(strlist), - ) +def doesnt_contain(filename, *strlist): + """Check that the file contains none of a list of strings. - 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`. - An assert will be raised if any of the strings in strlist appears in - `filename`. + """ + with open(filename, "r") as fobj: + text = fobj.read() + for s in strlist: + assert s not in text, "Forbidden content in %s: %r" % (filename, s) + + +def clean(cleandir): + """Clean `cleandir` by removing it and all its children completely.""" + # 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: # pragma: part covered + if os.path.exists(cleandir): + try: + shutil.rmtree(cleandir) + except OSError: # pragma: not covered + if tries == 1: + raise + else: + tries -= 1 + continue + break - """ - with open(filename, "r") as fobj: - text = fobj.read() - for s in strlist: - assert s not in text, "Forbidden content in %s: %r" % (filename, s) - - def clean(self, cleandir): - """Clean `cleandir` by removing it and all its children completely.""" - # 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: # pragma: part covered - if os.path.exists(cleandir): - try: - shutil.rmtree(cleandir) - except OSError: # pragma: not covered - if tries == 1: - raise - else: - tries -= 1 - continue - break - def skip(self, msg=None): - """Skip the current test.""" - raise SkipTest(msg) +def skip(msg=None): + """Skip the current test.""" + raise SkipTest(msg) + + +# Helpers + +def fnmatch_list(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 file_pattern: + files = [f for f in files if fnmatch.fnmatch(f, file_pattern)] + return files + + +def scrub(strdata, scrubs): + """Scrub uninteresting data from the payload in `strdata`. + + `scrubs` is a list of (find, replace) pairs of regexes that are used on + `strdata`. A string is returned. + + """ + for rgx_find, rgx_replace in scrubs: + strdata = re.sub(rgx_find, re.escape(rgx_replace), strdata) + return strdata def main(): # pragma: not covered @@ -385,11 +385,10 @@ def main(): # pragma: not covered clean - Clean all the output for all tests. """ - op = 'help' try: op = sys.argv[1] except IndexError: - pass + op = 'help' if op == 'run': # Run the test for real. diff --git a/tests/test_filereporter.py b/tests/test_filereporter.py index 9db4c0c3..a348a844 100644 --- a/tests/test_filereporter.py +++ b/tests/test_filereporter.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Tests for FileReporters""" import os @@ -32,12 +35,9 @@ class FileReporterTest(CoverageTest): acu = PythonFileReporter("aa/afile.py") bcu = PythonFileReporter("aa/bb/bfile.py") ccu = PythonFileReporter("aa/bb/cc/cfile.py") - self.assertEqual(acu.name, "aa/afile.py") - self.assertEqual(bcu.name, "aa/bb/bfile.py") - self.assertEqual(ccu.name, "aa/bb/cc/cfile.py") - self.assertEqual(acu.flat_rootname(), "aa_afile_py") - self.assertEqual(bcu.flat_rootname(), "aa_bb_bfile_py") - self.assertEqual(ccu.flat_rootname(), "aa_bb_cc_cfile_py") + self.assertEqual(acu.relative_filename(), "aa/afile.py") + self.assertEqual(bcu.relative_filename(), "aa/bb/bfile.py") + self.assertEqual(ccu.relative_filename(), "aa/bb/cc/cfile.py") self.assertEqual(acu.source(), "# afile.py\n") self.assertEqual(bcu.source(), "# bfile.py\n") self.assertEqual(ccu.source(), "# cfile.py\n") @@ -46,12 +46,9 @@ class FileReporterTest(CoverageTest): acu = PythonFileReporter("aa/afile.odd.py") bcu = PythonFileReporter("aa/bb/bfile.odd.py") b2cu = PythonFileReporter("aa/bb.odd/bfile.py") - self.assertEqual(acu.name, "aa/afile.odd.py") - self.assertEqual(bcu.name, "aa/bb/bfile.odd.py") - self.assertEqual(b2cu.name, "aa/bb.odd/bfile.py") - self.assertEqual(acu.flat_rootname(), "aa_afile_odd_py") - self.assertEqual(bcu.flat_rootname(), "aa_bb_bfile_odd_py") - self.assertEqual(b2cu.flat_rootname(), "aa_bb_odd_bfile_py") + self.assertEqual(acu.relative_filename(), "aa/afile.odd.py") + self.assertEqual(bcu.relative_filename(), "aa/bb/bfile.odd.py") + self.assertEqual(b2cu.relative_filename(), "aa/bb.odd/bfile.py") self.assertEqual(acu.source(), "# afile.odd.py\n") self.assertEqual(bcu.source(), "# bfile.odd.py\n") self.assertEqual(b2cu.source(), "# bfile.py\n") @@ -64,12 +61,9 @@ class FileReporterTest(CoverageTest): acu = PythonFileReporter(aa) bcu = PythonFileReporter(aa.bb) ccu = PythonFileReporter(aa.bb.cc) - self.assertEqual(acu.name, native("aa.py")) - self.assertEqual(bcu.name, native("aa/bb.py")) - self.assertEqual(ccu.name, native("aa/bb/cc.py")) - self.assertEqual(acu.flat_rootname(), "aa_py") - self.assertEqual(bcu.flat_rootname(), "aa_bb_py") - self.assertEqual(ccu.flat_rootname(), "aa_bb_cc_py") + self.assertEqual(acu.relative_filename(), native("aa.py")) + self.assertEqual(bcu.relative_filename(), native("aa/bb.py")) + self.assertEqual(ccu.relative_filename(), native("aa/bb/cc.py")) self.assertEqual(acu.source(), "# aa\n") self.assertEqual(bcu.source(), "# bb\n") self.assertEqual(ccu.source(), "") # yes, empty @@ -82,12 +76,9 @@ class FileReporterTest(CoverageTest): acu = PythonFileReporter(aa.afile) bcu = PythonFileReporter(aa.bb.bfile) ccu = PythonFileReporter(aa.bb.cc.cfile) - self.assertEqual(acu.name, native("aa/afile.py")) - self.assertEqual(bcu.name, native("aa/bb/bfile.py")) - self.assertEqual(ccu.name, native("aa/bb/cc/cfile.py")) - self.assertEqual(acu.flat_rootname(), "aa_afile_py") - self.assertEqual(bcu.flat_rootname(), "aa_bb_bfile_py") - self.assertEqual(ccu.flat_rootname(), "aa_bb_cc_cfile_py") + self.assertEqual(acu.relative_filename(), native("aa/afile.py")) + self.assertEqual(bcu.relative_filename(), native("aa/bb/bfile.py")) + self.assertEqual(ccu.relative_filename(), native("aa/bb/cc/cfile.py")) self.assertEqual(acu.source(), "# afile.py\n") self.assertEqual(bcu.source(), "# bfile.py\n") self.assertEqual(ccu.source(), "# cfile.py\n") @@ -117,4 +108,4 @@ class FileReporterTest(CoverageTest): ecu = PythonFileReporter(egg1) eecu = PythonFileReporter(egg1.egg1) self.assertEqual(ecu.source(), u"") - self.assertEqual(eecu.source().split("\n")[0], u"# My egg file!") + self.assertIn(u"# My egg file!", eecu.source().splitlines()) diff --git a/tests/test_files.py b/tests/test_files.py index ae56e728..e7353235 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -1,19 +1,24 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Tests for files.py""" import os import os.path +from coverage import files from coverage.files import ( - FileLocator, TreeMatcher, FnmatchMatcher, ModuleMatcher, PathAliases, - find_python_files, abs_file + TreeMatcher, FnmatchMatcher, ModuleMatcher, PathAliases, + find_python_files, abs_file, actual_path, flat_rootname, ) from coverage.misc import CoverageException +from coverage import env from tests.coveragetest import CoverageTest -class FileLocatorTest(CoverageTest): - """Tests of `FileLocator`.""" +class FilesTest(CoverageTest): + """Tests of coverage.files.""" def abs_path(self, p): """Return the absolute path for `p`.""" @@ -21,11 +26,11 @@ class FileLocatorTest(CoverageTest): def test_simple(self): self.make_file("hello.py") - fl = FileLocator() - self.assertEqual(fl.relative_filename("hello.py"), "hello.py") + files.set_relative_directory() + self.assertEqual(files.relative_filename(u"hello.py"), u"hello.py") a = self.abs_path("hello.py") self.assertNotEqual(a, "hello.py") - self.assertEqual(fl.relative_filename(a), "hello.py") + self.assertEqual(files.relative_filename(a), "hello.py") def test_peer_directories(self): self.make_file("sub/proj1/file1.py") @@ -34,20 +39,24 @@ class FileLocatorTest(CoverageTest): 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) + files.set_relative_directory() + self.assertEqual(files.relative_filename(a1), "file1.py") + self.assertEqual(files.relative_filename(a2), a2) def test_filepath_contains_absolute_prefix_twice(self): # https://bitbucket.org/ned/coveragepy/issue/194 # Build a path that has two pieces matching the absolute path prefix. # Technically, this test doesn't do that on Windows, but drive # letters make that impractical to achieve. - fl = FileLocator() + files.set_relative_directory() d = abs_file(os.curdir) trick = os.path.splitdrive(d)[1].lstrip(os.path.sep) rel = os.path.join('sub', trick, 'file1.py') - self.assertEqual(fl.relative_filename(abs_file(rel)), rel) + self.assertEqual(files.relative_filename(abs_file(rel)), rel) + + def test_flat_rootname(self): + self.assertEqual(flat_rootname("a/b/c.py"), "a_b_c_py") + self.assertEqual(flat_rootname(r"c:\foo\bar.html"), "_foo_bar_html") class MatcherTest(CoverageTest): @@ -55,11 +64,11 @@ class MatcherTest(CoverageTest): def setUp(self): super(MatcherTest, self).setUp() - self.fl = FileLocator() + files.set_relative_directory() def assertMatches(self, matcher, filepath, matches): """The `matcher` should agree with `matches` about `filepath`.""" - canonical = self.fl.canonical_filename(filepath) + canonical = files.canonical_filename(filepath) self.assertEqual( matcher.match(canonical), matches, "File %s should have matched as %s" % (filepath, matches) @@ -73,10 +82,9 @@ class MatcherTest(CoverageTest): (self.make_file("sub3/file4.py"), True), (self.make_file("sub3/file5.c"), False), ] - fl = FileLocator() trees = [ - fl.canonical_filename("sub"), - fl.canonical_filename("sub3/file4.py"), + files.canonical_filename("sub"), + files.canonical_filename("sub3/file4.py"), ] tm = TreeMatcher(trees) self.assertEqual(tm.info(), trees) @@ -146,34 +154,48 @@ class PathAliasesTest(CoverageTest): run_in_temp_dir = False + def assert_mapped(self, aliases, inp, out): + """Assert that `inp` mapped through `aliases` produces `out`. + + `out` is canonicalized first, since aliases always produce + canonicalized paths. + + """ + self.assertEqual(aliases.map(inp), files.canonical_filename(out)) + + def assert_not_mapped(self, aliases, inp): + """Assert that `inp` mapped through `aliases` is unchanged.""" + self.assertEqual(aliases.map(inp), inp) + def test_noop(self): aliases = PathAliases() - self.assertEqual(aliases.map('/ned/home/a.py'), '/ned/home/a.py') + self.assert_not_mapped(aliases, '/ned/home/a.py') def test_nomatch(self): aliases = PathAliases() aliases.add('/home/*/src', './mysrc') - self.assertEqual(aliases.map('/home/foo/a.py'), '/home/foo/a.py') + self.assert_not_mapped(aliases, '/home/foo/a.py') def test_wildcard(self): aliases = PathAliases() aliases.add('/ned/home/*/src', './mysrc') - self.assertEqual(aliases.map('/ned/home/foo/src/a.py'), './mysrc/a.py') + self.assert_mapped(aliases, '/ned/home/foo/src/a.py', './mysrc/a.py') + aliases = PathAliases() aliases.add('/ned/home/*/src/', './mysrc') - self.assertEqual(aliases.map('/ned/home/foo/src/a.py'), './mysrc/a.py') + self.assert_mapped(aliases, '/ned/home/foo/src/a.py', './mysrc/a.py') def test_no_accidental_match(self): aliases = PathAliases() aliases.add('/home/*/src', './mysrc') - self.assertEqual(aliases.map('/home/foo/srcetc'), '/home/foo/srcetc') + self.assert_not_mapped(aliases, '/home/foo/srcetc') def test_multiple_patterns(self): aliases = PathAliases() aliases.add('/home/*/src', './mysrc') aliases.add('/lib/*/libsrc', './mylib') - self.assertEqual(aliases.map('/home/foo/src/a.py'), './mysrc/a.py') - self.assertEqual(aliases.map('/lib/foo/libsrc/a.py'), './mylib/a.py') + self.assert_mapped(aliases, '/home/foo/src/a.py', './mysrc/a.py') + self.assert_mapped(aliases, '/lib/foo/libsrc/a.py', './mylib/a.py') def test_cant_have_wildcard_at_end(self): aliases = PathAliases() @@ -189,34 +211,26 @@ class PathAliasesTest(CoverageTest): aliases = PathAliases() aliases.add(r'c:\Zoo\boo', 'src/') aliases.add('/home/ned$', 'src/') - self.assertEqual(aliases.map(r'c:\Zoo\boo\foo.py'), 'src/foo.py') - self.assertEqual(aliases.map(r'/home/ned$/foo.py'), 'src/foo.py') + self.assert_mapped(aliases, r'c:\Zoo\boo\foo.py', 'src/foo.py') + self.assert_mapped(aliases, r'/home/ned$/foo.py', 'src/foo.py') def test_paths_are_os_corrected(self): aliases = PathAliases() aliases.add('/home/ned/*/src', './mysrc') aliases.add(r'c:\ned\src', './mysrc') - mapped = aliases.map(r'C:\Ned\src\sub\a.py') - self.assertEqual(mapped, './mysrc/sub/a.py') + self.assert_mapped(aliases, r'C:\Ned\src\sub\a.py', './mysrc/sub/a.py') aliases = PathAliases() aliases.add('/home/ned/*/src', r'.\mysrc') aliases.add(r'c:\ned\src', r'.\mysrc') - mapped = aliases.map(r'/home/ned/foo/src/sub/a.py') - self.assertEqual(mapped, r'.\mysrc\sub\a.py') + self.assert_mapped(aliases, r'/home/ned/foo/src/sub/a.py', r'.\mysrc\sub\a.py') def test_leading_wildcard(self): aliases = PathAliases() aliases.add('*/d1', './mysrc1') aliases.add('*/d2', './mysrc2') - self.assertEqual(aliases.map('/foo/bar/d1/x.py'), './mysrc1/x.py') - self.assertEqual(aliases.map('/foo/bar/d2/y.py'), './mysrc2/y.py') - - -class RelativePathAliasesTest(CoverageTest): - """Tests for coverage/files.py:PathAliases, with relative files.""" - - run_in_temp_dir = False + self.assert_mapped(aliases, '/foo/bar/d1/x.py', './mysrc1/x.py') + self.assert_mapped(aliases, '/foo/bar/d2/y.py', './mysrc2/y.py') def test_dot(self): for d in ('.', '..', '../other', '~'): @@ -227,7 +241,7 @@ class RelativePathAliasesTest(CoverageTest): the_file = os.path.abspath(os.path.realpath(the_file)) assert '~' not in the_file # to be sure the test is pure. - self.assertEqual(aliases.map(the_file), '/the/source/a.py') + self.assert_mapped(aliases, the_file, '/the/source/a.py') class FindPythonFilesTest(CoverageTest): @@ -248,3 +262,17 @@ class FindPythonFilesTest(CoverageTest): "sub/ssub/__init__.py", "sub/ssub/s.py", "sub/windows.pyw", ]) + + +class WindowsFileTest(CoverageTest): + """Windows-specific tests of file name handling.""" + + run_in_temp_dir = False + + def setUp(self): + if not env.WINDOWS: + self.skip("Only need to run Windows tests on Windows.") + super(WindowsFileTest, self).setUp() + + def test_actual_path(self): + self.assertEquals(actual_path(r'c:\Windows'), actual_path(r'C:\wINDOWS')) diff --git a/tests/test_html.py b/tests/test_html.py index 6f6f42e4..11f0979a 100644 --- a/tests/test_html.py +++ b/tests/test_html.py @@ -1,16 +1,24 @@ # -*- coding: utf-8 -*- +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Tests that HTML generation is awesome.""" import datetime +import glob +import os import os.path import re +import sys import coverage -from coverage import env +import coverage.files import coverage.html from coverage.misc import CoverageException, NotPython, NoSource from tests.coveragetest import CoverageTest +from tests.goldtest import CoverageGoldTest +from tests.goldtest import change_dir, compare, contains, doesnt_contain, contains_any class HtmlTestHelpers(CoverageTest): @@ -34,9 +42,9 @@ class HtmlTestHelpers(CoverageTest): """) def run_coverage(self, covargs=None, htmlargs=None): - """Run coverage on main_file.py, and create an HTML report.""" + """Run coverage.py on main_file.py, and create an HTML report.""" self.clean_local_file_imports() - cov = coverage.coverage(**(covargs or {})) + cov = coverage.Coverage(**(covargs or {})) self.start_import_stop(cov, "main_file") cov.html_report(**(htmlargs or {})) @@ -54,23 +62,35 @@ class HtmlTestHelpers(CoverageTest): with open(filename) as f: return f.read() - def get_html_index_content(self, scrub_time_stamp=True): + def get_html_index_content(self): """Return the content of index.html. - If `scrub_time_stamp` is true, then replace the timestamp with a - placeholder so that clocks don't matter. + Timestamps are replaced with a placeholder so that clocks don't matter. """ with open("htmlcov/index.html") as f: index = f.read() - if scrub_time_stamp: - index = re.sub( - r"created at \d{4}-\d{2}-\d{2} \d{2}:\d{2}", - r"created at YYYY-MM-DD HH:MM", - index, - ) + index = re.sub( + r"created at \d{4}-\d{2}-\d{2} \d{2}:\d{2}", + r"created at YYYY-MM-DD HH:MM", + index, + ) return index + def assert_correct_timestamp(self, html): + """Extract the timestamp from `html`, and assert it is recent.""" + timestamp_pat = r"created at (\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2})" + m = re.search(timestamp_pat, html) + self.assertTrue(m, "Didn't find a timestamp!") + timestamp = datetime.datetime(*map(int, m.groups())) + # The timestamp only records the minute, so the delta could be from + # 12:00 to 12:01:59, or two minutes. + self.assert_recent_datetime( + timestamp, + seconds=120, + msg="Timestamp is wrong: {0}".format(timestamp), + ) + class HtmlDeltaTest(HtmlTestHelpers, CoverageTest): """Tests of the HTML delta speed-ups.""" @@ -78,12 +98,12 @@ class HtmlDeltaTest(HtmlTestHelpers, CoverageTest): def setUp(self): super(HtmlDeltaTest, self).setUp() - # At least one of our tests monkey-patches the version of coverage, + # At least one of our tests monkey-patches the version of coverage.py, # so grab it here to restore it later. self.real_coverage_version = coverage.__version__ - self.addCleanup(self.restore_coverage_version) + self.addCleanup(self.cleanup_coverage_version) - def restore_coverage_version(self): + def cleanup_coverage_version(self): """A cleanup.""" coverage.__version__ = self.real_coverage_version @@ -148,8 +168,8 @@ class HtmlDeltaTest(HtmlTestHelpers, CoverageTest): def test_html_delta_from_settings_change(self): # HTML generation can create only the files that have changed. - # In this case, everything changes because the coverage settings have - # changed. + # In this case, everything changes because the coverage.py settings + # have changed. self.create_initial_files() self.run_coverage(covargs=dict(omit=[])) index1 = self.get_html_index_content() @@ -167,7 +187,7 @@ class HtmlDeltaTest(HtmlTestHelpers, CoverageTest): def test_html_delta_from_coverage_version_change(self): # HTML generation can create only the files that have changed. - # In this case, everything changes because the coverage version has + # In this case, everything changes because the coverage.py version has # changed. self.create_initial_files() self.run_coverage() @@ -209,19 +229,17 @@ class HtmlTitleTest(HtmlTestHelpers, CoverageTest): def test_non_ascii_title_set_in_config_file(self): self.create_initial_files() - self.make_file(".coveragerc", - "[html]\ntitle = «ταБЬℓσ» numbers" - ) + self.make_file(".coveragerc", "[html]\ntitle = «ταБЬℓσ» numbers") self.run_coverage() index = self.get_html_index_content() self.assertIn( "<title>«ταБЬℓσ»" " numbers", index - ) + ) self.assertIn( "<h1>«ταБЬℓσ»" " numbers", index - ) + ) def test_title_set_in_args(self): self.create_initial_files() @@ -231,11 +249,11 @@ class HtmlTitleTest(HtmlTestHelpers, CoverageTest): self.assertIn( "<title>«ταБЬℓσ»" " & stüff!</title>", index - ) + ) self.assertIn( "<h1>«ταБЬℓσ»" " & stüff!:", index - ) + ) class HtmlWithUnparsableFilesTest(HtmlTestHelpers, CoverageTest): @@ -243,7 +261,7 @@ class HtmlWithUnparsableFilesTest(HtmlTestHelpers, CoverageTest): def test_dotpy_not_python(self): self.make_file("innocuous.py", "a = 1") - cov = coverage.coverage() + cov = coverage.Coverage() self.start_import_stop(cov, "innocuous") self.make_file("innocuous.py", "<h1>This isn't python!</h1>") msg = "Couldn't parse '.*innocuous.py' as Python source: .* at line 1" @@ -252,7 +270,7 @@ class HtmlWithUnparsableFilesTest(HtmlTestHelpers, CoverageTest): def test_dotpy_not_python_ignored(self): self.make_file("innocuous.py", "a = 2") - cov = coverage.coverage() + cov = coverage.Coverage() self.start_import_stop(cov, "innocuous") self.make_file("innocuous.py", "<h1>This isn't python!</h1>") cov.html_report(ignore_errors=True) @@ -279,7 +297,7 @@ class HtmlWithUnparsableFilesTest(HtmlTestHelpers, CoverageTest): source = "exec(compile('','','exec'), {'__file__': 'liar.html'})" self.make_file("liar.py", source) self.make_file("liar.html", "{# Whoops, not python code #}") - cov = coverage.coverage() + cov = coverage.Coverage() self.start_import_stop(cov, "liar") cov.html_report() self.assert_exists("htmlcov/index.html") @@ -292,14 +310,13 @@ class HtmlWithUnparsableFilesTest(HtmlTestHelpers, CoverageTest): self.make_file("liar.py", source) # Tokenize will raise an IndentationError if it can't dedent. self.make_file("liar.html", "0\n 2\n 1\n") - cov = coverage.coverage() + cov = coverage.Coverage() self.start_import_stop(cov, "liar") cov.html_report() self.assert_exists("htmlcov/index.html") - # TODO: enable this test, and then fix this: - # https://bitbucket.org/ned/coveragepy/issue/351/files-with-incorrect-encoding-are-ignored - def SKIP_THIS_decode_error(self): + def test_decode_error(self): + # https://bitbucket.org/ned/coveragepy/issue/351/files-with-incorrect-encoding-are-ignored # imp.load_module won't load a file with an undecodable character # in a comment, though Python will run them. So we'll change the # file after running. @@ -309,7 +326,7 @@ class HtmlWithUnparsableFilesTest(HtmlTestHelpers, CoverageTest): # coding: utf8 a = 1 # Isn't this great?! """) - cov = coverage.coverage() + cov = coverage.Coverage() self.start_import_stop(cov, "main") # Create the undecodable version of the file. make_file is too helpful, @@ -324,16 +341,13 @@ class HtmlWithUnparsableFilesTest(HtmlTestHelpers, CoverageTest): cov.html_report() html_report = self.get_html_report_content("sub/not_ascii.py") - if env.PY2: - expected = "# Isn't this great?�!" - else: - expected = "# Isn't this great?Ë!" + expected = "# Isn't this great?�!" self.assertIn(expected, html_report) def test_formfeeds(self): # https://bitbucket.org/ned/coveragepy/issue/360/html-reports-get-confused-by-l-in-the-code self.make_file("formfeed.py", "line_one = 1\n\f\nline_two = 2\n") - cov = coverage.coverage() + cov = coverage.Coverage() self.start_import_stop(cov, "formfeed") cov.html_report() @@ -349,7 +363,7 @@ class HtmlTest(HtmlTestHelpers, CoverageTest): self.make_file("thefile.py", "import sub.another\n") self.make_file("sub/__init__.py", "") self.make_file("sub/another.py", "print('another')\n") - cov = coverage.coverage() + cov = coverage.Coverage() self.start_import_stop(cov, 'thefile') os.remove("sub/another.py") @@ -360,16 +374,16 @@ class HtmlTest(HtmlTestHelpers, CoverageTest): cov.html_report() def test_extensionless_file_collides_with_extension(self): - # It used to be that "afile" and "afile.py" would both be reported to - # "afile.html". Now they are not. + # It used to be that "program" and "program.py" would both be reported + # to "program.html". Now they are not. # https://bitbucket.org/ned/coveragepy/issue/69 - self.make_file("afile", "import afile\n") - self.make_file("afile.py", "a = 1\n") - self.run_command("coverage run afile") + self.make_file("program", "import program\n") + self.make_file("program.py", "a = 1\n") + self.run_command("coverage run program") self.run_command("coverage html") self.assert_exists("htmlcov/index.html") - self.assert_exists("htmlcov/afile.html") - self.assert_exists("htmlcov/afile_py.html") + self.assert_exists("htmlcov/program.html") + self.assert_exists("htmlcov/program_py.html") def test_has_date_stamp_in_files(self): self.create_initial_files() @@ -380,19 +394,22 @@ class HtmlTest(HtmlTestHelpers, CoverageTest): with open("htmlcov/main_file_py.html") as f: self.assert_correct_timestamp(f.read()) - def assert_correct_timestamp(self, html): - """Extract the timestamp from `html`, and assert it is recent.""" - timestamp_pat = r"created at (\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2})" - m = re.search(timestamp_pat, html) - self.assertTrue(m, "Didn't find a timestamp!") - timestamp = datetime.datetime(*map(int, m.groups())) - # The timestamp only records the minute, so the delta could be from - # 12:00 to 12:01:59, or two minutes. - self.assert_recent_datetime( - timestamp, - seconds=120, - msg="Timestamp is wrong: {0}".format(timestamp), - ) + def test_reporting_on_unmeasured_file(self): + # It should be ok to ask for an HTML report on a file that wasn't even + # measured at all. https://bitbucket.org/ned/coveragepy/issues/403 + self.create_initial_files() + self.make_file("other.py", "a = 1\n") + self.run_coverage(htmlargs=dict(morfs=['other.py'])) + self.assert_exists("htmlcov/index.html") + self.assert_exists("htmlcov/other_py.html") + + def test_shining_panda_fix(self): + # The ShiningPanda plugin looks for "status.dat" to find HTML reports. + # Accomodate them, but only if we are running under Jenkins. + self.set_environ("JENKINS_URL", "Something or other") + self.create_initial_files() + self.run_coverage() + self.assert_exists("htmlcov/status.dat") class HtmlStaticFileTest(CoverageTest): @@ -401,9 +418,9 @@ class HtmlStaticFileTest(CoverageTest): def setUp(self): super(HtmlStaticFileTest, self).setUp() self.original_path = list(coverage.html.STATIC_PATH) - self.addCleanup(self.restore_static_path) + self.addCleanup(self.cleanup_static_path) - def restore_static_path(self): + def cleanup_static_path(self): """A cleanup.""" coverage.html.STATIC_PATH = self.original_path @@ -413,7 +430,7 @@ class HtmlStaticFileTest(CoverageTest): coverage.html.STATIC_PATH.insert(0, "static_here") self.make_file("main.py", "print(17)") - cov = coverage.coverage() + cov = coverage.Coverage() self.start_import_stop(cov, "main") cov.html_report() @@ -434,7 +451,7 @@ class HtmlStaticFileTest(CoverageTest): coverage.html.STATIC_PATH.insert(0, "static_here") self.make_file("main.py", "print(17)") - cov = coverage.coverage() + cov = coverage.Coverage() self.start_import_stop(cov, "main") cov.html_report() @@ -449,8 +466,304 @@ class HtmlStaticFileTest(CoverageTest): coverage.html.STATIC_PATH = ["/xyzzy"] self.make_file("main.py", "print(17)") - cov = coverage.coverage() + cov = coverage.Coverage() self.start_import_stop(cov, "main") msg = "Couldn't find static file u?'.*'" with self.assertRaisesRegex(CoverageException, msg): cov.html_report() + + +class HtmlGoldTests(CoverageGoldTest): + """Tests of HTML reporting that use gold files.""" + + root_dir = 'tests/farm/html' + + def test_a(self): + self.output_dir("out/a") + + with change_dir("src"): + # pylint: disable=import-error + cov = coverage.Coverage() + cov.start() + import a # pragma: nested + cov.stop() # pragma: nested + cov.html_report(a, directory='../out/a') + + compare("gold_a", "out/a", size_within=10, file_pattern="*.html") + contains( + "out/a/a_py.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( + "out/a/index.html", + '<a href="a_py.html">a.py</a>', + '<span class="pc_cov">67%</span>', + '<td class="right" data-ratio="2 3">67%</td>', + ) + + def test_b_branch(self): + self.output_dir("out/b_branch") + + with change_dir("src"): + # pylint: disable=import-error + cov = coverage.Coverage(branch=True) + cov.start() + import b # pragma: nested + cov.stop() # pragma: nested + cov.html_report(b, directory="../out/b_branch") + + compare("gold_b_branch", "out/b_branch", size_within=10, file_pattern="*.html") + contains( + "out/b_branch/b_py.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">70%</span>', + ('<span class="annotate" title="Line 8 was executed, but never jumped to line 11">' + '8 ↛ 11 [?]</span>'), + ('<span class="annotate" title="Line 17 was executed, but never jumped ' + 'to the function exit">17 ↛ exit [?]</span>'), + ('<span class="annotate" title="Line 25 was executed, but never jumped ' + 'to line 26 or line 28">25 ↛ 26, ' + '25 ↛ 28 [?]</span>'), + ) + contains( + "out/b_branch/index.html", + '<a href="b_py.html">b.py</a>', + '<span class="pc_cov">70%</span>', + '<td class="right" data-ratio="16 23">70%</td>', + ) + + def test_bom(self): + self.output_dir("out/bom") + + with change_dir("src"): + # pylint: disable=import-error + cov = coverage.Coverage() + cov.start() + import bom # pragma: nested + cov.stop() # pragma: nested + cov.html_report(bom, directory="../out/bom") + + compare("gold_bom", "out/bom", size_within=10, file_pattern="*.html") + contains( + "out/bom/bom_py.html", + '<span class="str">"3×4 = 12, ÷2 = 6±0"</span>', + ) + + def test_isolatin1(self): + self.output_dir("out/isolatin1") + + with change_dir("src"): + # pylint: disable=import-error + cov = coverage.Coverage() + cov.start() + import isolatin1 # pragma: nested + cov.stop() # pragma: nested + cov.html_report(isolatin1, directory="../out/isolatin1") + + compare("gold_isolatin1", "out/isolatin1", size_within=10, file_pattern="*.html") + contains( + "out/isolatin1/isolatin1_py.html", + '<span class="str">"3×4 = 12, ÷2 = 6±0"</span>', + ) + + def test_omit_1(self): + self.output_dir("out/omit_1") + + with change_dir("src"): + # pylint: disable=import-error, unused-variable + cov = coverage.Coverage(include=["./*"]) + cov.start() + import main # pragma: nested + cov.stop() # pragma: nested + cov.html_report(directory="../out/omit_1") + + compare("gold_omit_1", "out/omit_1", size_within=10, file_pattern="*.html") + + def test_omit_2(self): + self.output_dir("out/omit_2") + + with change_dir("src"): + # pylint: disable=import-error, unused-variable + cov = coverage.Coverage(include=["./*"]) + cov.start() + import main # pragma: nested + cov.stop() # pragma: nested + cov.html_report(directory="../out/omit_2", omit=["m1.py"]) + + compare("gold_omit_2", "out/omit_2", size_within=10, file_pattern="*.html") + + def test_omit_3(self): + self.output_dir("out/omit_3") + + with change_dir("src"): + # pylint: disable=import-error, unused-variable + cov = coverage.Coverage(include=["./*"]) + cov.start() + import main # pragma: nested + cov.stop() # pragma: nested + cov.html_report(directory="../out/omit_3", omit=["m1.py", "m2.py"]) + + compare("gold_omit_3", "out/omit_3", size_within=10, file_pattern="*.html") + + def test_omit_4(self): + self.output_dir("out/omit_4") + + with change_dir("src"): + # pylint: disable=import-error, unused-variable + cov = coverage.Coverage(config_file="omit4.ini", include=["./*"]) + cov.start() + import main # pragma: nested + cov.stop() # pragma: nested + cov.html_report(directory="../out/omit_4") + + compare("gold_omit_4", "out/omit_4", size_within=10, file_pattern="*.html") + + def test_omit_5(self): + self.output_dir("out/omit_5") + + with change_dir("src"): + # pylint: disable=import-error, unused-variable + cov = coverage.Coverage(config_file="omit5.ini", include=["./*"]) + cov.start() + import main # pragma: nested + cov.stop() # pragma: nested + cov.html_report() + + compare("gold_omit_5", "out/omit_5", size_within=10, file_pattern="*.html") + + def test_other(self): + self.output_dir("out/other") + + with change_dir("src"): + # pylint: disable=import-error, unused-variable + sys.path.insert(0, "../othersrc") + cov = coverage.Coverage(include=["./*", "../othersrc/*"]) + cov.start() + import here # pragma: nested + cov.stop() # pragma: nested + cov.html_report(directory="../out/other") + + # Different platforms will name the "other" file differently. Rename it + for p in glob.glob("out/other/*_other_py.html"): + os.rename(p, "out/other/blah_blah_other_py.html") + + compare("gold_other", "out/other", size_within=10, file_pattern="*.html") + contains( + "out/other/index.html", + '<a href="here_py.html">here.py</a>', + 'other_py.html">', 'other.py</a>', + ) + + def test_partial(self): + self.output_dir("out/partial") + + with change_dir("src"): + # pylint: disable=import-error + cov = coverage.Coverage(branch=True) + cov.start() + import partial # pragma: nested + cov.stop() # pragma: nested + cov.html_report(partial, directory="../out/partial") + + compare("gold_partial", "out/partial", size_within=10, file_pattern="*.html") + contains( + "out/partial/partial_py.html", + '<p id="t8" class="stm run hide_run">', + '<p id="t11" class="stm run hide_run">', + '<p id="t14" class="stm run hide_run">', + # The "if 0" and "if 1" statements are optimized away. + '<p id="t17" class="pln">', + ) + contains( + "out/partial/index.html", + '<a href="partial_py.html">partial.py</a>', + ) + contains( + "out/partial/index.html", + '<span class="pc_cov">100%</span>' + ) + + def test_styled(self): + self.output_dir("out/styled") + + with change_dir("src"): + # pylint: disable=import-error + cov = coverage.Coverage() + cov.start() + import a # pragma: nested + cov.stop() # pragma: nested + cov.html_report(a, directory="../out/styled", extra_css="extra.css") + + compare("gold_styled", "out/styled", size_within=10, file_pattern="*.html") + compare("gold_styled", "out/styled", size_within=10, file_pattern="*.css") + contains( + "out/styled/a_py.html", + '<link rel="stylesheet" href="extra.css" type="text/css">', + ('<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( + "out/styled/index.html", + '<link rel="stylesheet" href="extra.css" type="text/css">', + '<a href="a_py.html">a.py</a>', + '<span class="pc_cov">67%</span>' + ) + + def test_tabbed(self): + self.output_dir("out/tabbed") + + with change_dir("src"): + # pylint: disable=import-error + cov = coverage.Coverage() + cov.start() + import tabbed # pragma: nested + cov.stop() # pragma: nested + cov.html_report(tabbed, directory="../out/tabbed") + + # 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( + "out/tabbed/tabbed_py.html", + '> <span class="key">if</span> ' + '<span class="nam">x</span><span class="op">:</span>' + ' ' + ' ' + '<span class="com"># look nice</span>' + ) + + doesnt_contain("out/tabbed/tabbed_py.html", "\t") + + def test_unicode(self): + self.output_dir("out/unicode") + + with change_dir("src"): + # pylint: disable=import-error, redefined-builtin + cov = coverage.Coverage() + cov.start() + import unicode # pragma: nested + cov.stop() # pragma: nested + cov.html_report(unicode, directory="../out/unicode") + + compare("gold_unicode", "out/unicode", size_within=10, file_pattern="*.html") + contains( + "out/unicode/unicode_py.html", + ('<span class="str">"ʎd˙ǝbɐɹǝʌoɔ"' + '</span>'), + ) + + contains_any( + "out/unicode/unicode_py.html", + '<span class="str">"db40,dd00: x��"</span>', + '<span class="str">"db40,dd00: x󠄀"</span>', + ) diff --git a/tests/test_misc.py b/tests/test_misc.py index 152207b5..931e0bc5 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -1,9 +1,14 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Tests of miscellaneous stuff.""" import sys -from coverage.misc import Hasher, file_be_gone, overrides -from coverage import __version__, __url__ +import coverage +from coverage.version import _make_url, _make_version +from coverage.misc import Hasher, file_be_gone + from tests.coveragetest import CoverageTest @@ -57,6 +62,36 @@ class RemoveFileTest(CoverageTest): file_be_gone(".") +class VersionTest(CoverageTest): + """Tests of version.py""" + + run_in_temp_dir = False + + def test_version_info(self): + # Make sure we didn't screw up the version_info tuple. + self.assertIsInstance(coverage.version_info, tuple) + self.assertEqual([type(d) for d in coverage.version_info], [int, int, int, str, int]) + self.assertIn(coverage.version_info[3], ['alpha', 'beta', 'candidate', 'final']) + + def test_make_version(self): + self.assertEqual(_make_version(4, 0, 0, 'alpha', 0), "4.0a0") + self.assertEqual(_make_version(4, 0, 0, 'alpha', 1), "4.0a1") + self.assertEqual(_make_version(4, 0, 0, 'final', 0), "4.0") + self.assertEqual(_make_version(4, 1, 2, 'beta', 3), "4.1.2b3") + self.assertEqual(_make_version(4, 1, 2, 'final', 0), "4.1.2") + self.assertEqual(_make_version(5, 10, 2, 'candidate', 7), "5.10.2rc7") + + def test_make_url(self): + self.assertEqual( + _make_url(4, 0, 0, 'final', 0), + "https://coverage.readthedocs.org" + ) + self.assertEqual( + _make_url(4, 1, 2, 'beta', 3), + "https://coverage.readthedocs.org/en/coverage-4.1.2b3" + ) + + class SetupPyTest(CoverageTest): """Tests of setup.py""" @@ -69,8 +104,8 @@ class SetupPyTest(CoverageTest): self.assertEqual(status, 0) out = output.splitlines() self.assertIn("measurement", out[0]) - self.assertEqual(out[1], __version__) - self.assertEqual(out[2], __url__) + self.assertEqual(out[1], coverage.__version__) + self.assertEqual(out[2], coverage.__url__) self.assertIn("Ned Batchelder", out[3]) def test_more_metadata(self): @@ -87,52 +122,3 @@ class SetupPyTest(CoverageTest): self.assertGreater(len(long_description), 7) self.assertNotEqual(long_description[0].strip(), "") self.assertNotEqual(long_description[-1].strip(), "") - - -class OverridesTest(CoverageTest): - """Test plugins.py:overrides.""" - - run_in_temp_dir = False - - def test_overrides(self): - # pylint: disable=missing-docstring - class SomeBase(object): - def method1(self): - pass - - def method2(self): - pass - - class Derived1(SomeBase): - def method1(self): - pass - - self.assertTrue(overrides(Derived1(), "method1", SomeBase)) - self.assertFalse(overrides(Derived1(), "method2", SomeBase)) - - class FurtherDerived1(Derived1): - """Derive again from Derived1, inherit its method1.""" - pass - - self.assertTrue(overrides(FurtherDerived1(), "method1", SomeBase)) - self.assertFalse(overrides(FurtherDerived1(), "method2", SomeBase)) - - class FurtherDerived2(Derived1): - """Override the overridden method.""" - def method1(self): - pass - - self.assertTrue(overrides(FurtherDerived2(), "method1", SomeBase)) - self.assertFalse(overrides(FurtherDerived2(), "method2", SomeBase)) - - class Mixin(object): - """A mixin that overrides method1.""" - def method1(self): - pass - - class Derived2(Mixin, SomeBase): - """A class that gets the method from the mixin.""" - pass - - self.assertTrue(overrides(Derived2(), "method1", SomeBase)) - self.assertFalse(overrides(Derived2(), "method2", SomeBase)) diff --git a/tests/test_oddball.py b/tests/test_oddball.py index 9fdc654d..87c65b0e 100644 --- a/tests/test_oddball.py +++ b/tests/test_oddball.py @@ -1,9 +1,12 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Oddball cases for testing coverage.py""" -import os import sys import coverage +from coverage.files import abs_file from tests.coveragetest import CoverageTest from tests import osinfo @@ -107,7 +110,7 @@ class RecursionTest(CoverageTest): i = 11 """) - cov = coverage.coverage() + cov = coverage.Coverage() self.start_import_stop(cov, "recur") pytrace = (cov.collector.tracer_name() == "PyTracer") @@ -173,7 +176,7 @@ class MemoryLeakTest(CoverageTest): # Running the code 10k times shouldn't grow the ram much more than # running it 10 times. ram_growth = (ram_10k - ram_10) - (ram_10 - ram_0) - if ram_growth > 100000: + if ram_growth > 100000: # pragma: only failure fails += 1 if fails > 8: # pragma: only failure @@ -209,7 +212,7 @@ class PyexpatTest(CoverageTest): self.make_file("outer.py", "\n"*100 + "import trydom\na = 102\n") - cov = coverage.coverage() + cov = coverage.Coverage() cov.erase() # Import the Python file, executing it. @@ -223,6 +226,14 @@ class PyexpatTest(CoverageTest): self.assertEqual(statements, [101, 102]) self.assertEqual(missing, []) + # Make sure pyexpat isn't recorded as a source file. + # https://bitbucket.org/ned/coveragepy/issues/419/nosource-no-source-for-code-path-to-c + files = cov.get_data().measured_files() + self.assertFalse( + any(f.endswith("pyexpat.c") for f in files), + "Pyexpat.c is in the measured files!: %r:" % (files,) + ) + class ExceptionTest(CoverageTest): """I suspect different versions of Python deal with exceptions differently @@ -307,9 +318,10 @@ class ExceptionTest(CoverageTest): 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()] + callnames = callnames.split() + calls = [getattr(sys.modules[cn], cn) for cn in callnames] - cov = coverage.coverage() + cov = coverage.Coverage() cov.start() # Call our list of functions: invoke the first, with the rest as # an argument. @@ -317,17 +329,14 @@ class ExceptionTest(CoverageTest): cov.stop() # pragma: nested # Clean the line data and compare to expected results. - # The filenames are absolute, so keep just the base. - cov._harvest_data() # private! sshhh... - lines = cov.data.line_data() + # The file names are absolute, so keep just the base. clean_lines = {} - for f, llist in lines.items(): - # f is a path to a Python module, so we drop the '.py' to get - # a callname. - basename = os.path.basename(f) - assert basename.endswith(".py") - if basename[:-3] in callnames: - clean_lines[basename] = llist + data = cov.get_data() + for callname in callnames: + filename = callname + ".py" + lines = data.lines(abs_file(filename)) + clean_lines[filename] = sorted(lines) + self.assertEqual(clean_lines, lines_expected) @@ -400,3 +409,111 @@ class GettraceTest(CoverageTest): f = 12 ''', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], "") + + def test_setting_new_trace_function(self): + # https://bitbucket.org/ned/coveragepy/issues/436/disabled-coverage-ctracer-may-rise-from + self.check_coverage('''\ + import sys + + def tracer(frame, event, arg): + print("%s: %s @ %d" % (event, frame.f_code.co_filename, frame.f_lineno)) + return tracer + + def begin(): + sys.settrace(tracer) + + def collect(): + t = sys.gettrace() + assert t is tracer, t + + def test_unsets_trace(): + begin() + collect() + + old = sys.gettrace() + test_unsets_trace() + sys.settrace(old) + ''', + lines=[1, 3, 4, 5, 7, 8, 10, 11, 12, 14, 15, 16, 18, 19, 20], + missing="4-5, 11-12", + ) + + out = self.stdout().replace(self.last_module_name, "coverage_test") + + self.assertEqual( + out, + ( + "call: coverage_test.py @ 10\n" + "line: coverage_test.py @ 11\n" + "line: coverage_test.py @ 12\n" + "return: coverage_test.py @ 12\n" + ), + ) + + +class ExecTest(CoverageTest): + """Tests of exec.""" + def test_correct_filename(self): + # https://bitbucket.org/ned/coveragepy/issues/380/code-executed-by-exec-excluded-from + # Bug was that exec'd files would have their lines attributed to the + # calling file. Make two files, both with ~30 lines, but no lines in + # common. Line 30 in to_exec.py was recorded as line 30 in main.py, + # but now it's fixed. :) + self.make_file("to_exec.py", """\ + \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n + print("var is {0}".format(var)) # line 31 + """) + self.make_file("main.py", """\ + namespace = {'var': 17} + with open("to_exec.py") as to_exec_py: + code = compile(to_exec_py.read(), 'to_exec.py', 'exec') + exec(code, globals(), namespace) + \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n + print("done") # line 35 + """) + + cov = coverage.Coverage() + self.start_import_stop(cov, "main") + + _, statements, missing, _ = cov.analysis("main.py") + self.assertEqual(statements, [1, 2, 3, 4, 35]) + self.assertEqual(missing, []) + _, statements, missing, _ = cov.analysis("to_exec.py") + self.assertEqual(statements, [31]) + self.assertEqual(missing, []) + + +class MockingProtectionTest(CoverageTest): + """Tests about protecting ourselves from aggressive mocking. + + https://bitbucket.org/ned/coveragepy/issues/416/coverage-40-is-causing-existing-unit-tests + + """ + def test_os_path_exists(self): + # To see if this test still detects the problem, change isolate_module + # in misc.py to simply return its argument. It should fail with a + # StopIteration error. + self.make_file("bug416.py", """\ + import os.path + + import mock + + @mock.patch('os.path.exists') + def test_path_exists(mock_exists): + mock_exists.side_effect = [17] + print("in test") + import bug416a + print(bug416a.foo) + print(os.path.exists(".")) + + test_path_exists() + """) + self.make_file("bug416a.py", """\ + print("bug416a.py") + foo = 23 + """) + + import py_compile + py_compile.compile("bug416a.py") + out = self.run_command("coverage run bug416.py") + self.assertEqual(out, "in test\nbug416a.py\n23\n17\n") diff --git a/tests/test_parser.py b/tests/test_parser.py index 81916a98..44a261d9 100644 --- a/tests/test_parser.py +++ b/tests/test_parser.py @@ -1,17 +1,26 @@ -"""Tests for Coverage.py's code parsing.""" +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +"""Tests for coverage.py's code parsing.""" import textwrap + from tests.coveragetest import CoverageTest + +from coverage import env +from coverage.misc import NotPython from coverage.parser import PythonParser class PythonParserTest(CoverageTest): - """Tests for Coverage.py's Python code parsing.""" + """Tests for coverage.py's Python code parsing.""" run_in_temp_dir = False def parse_source(self, text): """Parse `text` as source, and return the `PythonParser` used.""" + if env.PY2: + text = text.decode("ascii") text = textwrap.dedent(text) parser = PythonParser(text=text, exclude="nocover") parser.parse_source() @@ -108,14 +117,82 @@ class PythonParserTest(CoverageTest): """) self.assertEqual(parser.exit_counts(), { 1:1, 2:1, 3:1, 6:1 }) + def test_indentation_error(self): + msg = ( + "Couldn't parse '<code>' as Python source: " + "'unindent does not match any outer indentation level' at line 3" + ) + with self.assertRaisesRegex(NotPython, msg): + _ = self.parse_source("""\ + 0 spaces + 2 + 1 + """) + + def test_token_error(self): + msg = "Couldn't parse '<code>' as Python source: 'EOF in multi-line string' at line 1" + with self.assertRaisesRegex(NotPython, msg): + _ = self.parse_source("""\ + ''' + """) + + def test_decorator_pragmas(self): + parser = self.parse_source("""\ + # 1 + + @foo(3) # nocover + @bar + def func(x, y=5): + return 6 + + class Foo: # the only statement... + '''9''' + @foo # nocover + def __init__(self): + '''12''' + return 13 + + @foo( # nocover + 16, + 17, + ) + def meth(self): + return 20 + + @foo( # nocover + 23 + ) + def func(x=25): + return 26 + """) + self.assertEqual( + parser.raw_statements, + set([3, 4, 5, 6, 8, 9, 10, 13, 15, 16, 17, 20, 22, 23, 25, 26]) + ) + self.assertEqual(parser.statements, set([8])) + + def test_class_decorator_pragmas(self): + parser = self.parse_source("""\ + class Foo(object): + def __init__(self): + self.x = 3 + + @foo # nocover + class Bar(object): + def __init__(self): + self.x = 8 + """) + self.assertEqual(parser.raw_statements, set([1, 2, 3, 5, 6, 7, 8])) + self.assertEqual(parser.statements, set([1, 2, 3])) + class ParserFileTest(CoverageTest): - """Tests for Coverage.py's code parsing from files.""" + """Tests for coverage.py's code parsing from files.""" def parse_file(self, filename): """Parse `text` as source, and return the `PythonParser` used.""" parser = PythonParser(filename=filename, exclude="nocover") - self.statements, self.excluded = parser.parse_source() + parser.parse_source() return parser def test_line_endings(self): @@ -137,7 +214,11 @@ class ParserFileTest(CoverageTest): fname = fname + ".py" self.make_file(fname, text, newline=newline) parser = self.parse_file(fname) - self.assertEqual(parser.exit_counts(), counts) + self.assertEqual( + parser.exit_counts(), + counts, + "Wrong for %r" % fname + ) def test_encoding(self): self.make_file("encoded.py", """\ @@ -158,8 +239,8 @@ class ParserFileTest(CoverageTest): stderr=subprocess.PIPE).communicate() """) - self.parse_file("normal.py") - self.assertEqual(self.statements, set([1])) + parser = self.parse_file("normal.py") + self.assertEqual(parser.statements, set([1])) self.make_file("abrupt.py", """\ out, err = subprocess.Popen( @@ -171,5 +252,5 @@ class ParserFileTest(CoverageTest): with open("abrupt.py") as f: self.assertEqual(f.read()[-1], ")") - self.parse_file("abrupt.py") - self.assertEqual(self.statements, set([1])) + parser = self.parse_file("abrupt.py") + self.assertEqual(parser.statements, set([1])) diff --git a/tests/test_phystokens.py b/tests/test_phystokens.py index 7edd6aa4..e28fb176 100644 --- a/tests/test_phystokens.py +++ b/tests/test_phystokens.py @@ -1,21 +1,26 @@ -"""Tests for Coverage.py's improved tokenizer.""" +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +"""Tests for coverage.py's improved tokenizer.""" import os.path import re from coverage import env from coverage.phystokens import source_token_lines, source_encoding +from coverage.phystokens import neuter_encoding_declaration, compile_unicode +from coverage.python import get_python_source from tests.coveragetest import CoverageTest -SIMPLE = """\ +SIMPLE = u"""\ # yay! def foo(): say('two = %d' % 2) """ -MIXED_WS = """\ +MIXED_WS = u"""\ def hello(): a="Hello world!" \tb="indented" @@ -25,7 +30,7 @@ HERE = os.path.dirname(__file__) class PhysTokensTest(CoverageTest): - """Tests for Coverage.py's improved tokenizer.""" + """Tests for coverage.py's improved tokenizer.""" run_in_temp_dir = False @@ -44,9 +49,7 @@ class PhysTokensTest(CoverageTest): def check_file_tokenization(self, fname): """Use the contents of `fname` for `check_tokenization`.""" - with open(fname) as f: - source = f.read() - self.check_tokenization(source) + self.check_tokenization(get_python_source(fname)) def test_simple(self): self.assertEqual(list(source_token_lines(SIMPLE)), @@ -92,21 +95,28 @@ else: DEF_ENCODING = "ascii" +ENCODING_DECLARATION_SOURCES = [ + # Various forms from http://www.python.org/dev/peps/pep-0263/ + b"# coding=cp850\n\n", + b"#!/usr/bin/python\n# -*- coding: cp850 -*-\n", + b"#!/usr/bin/python\n# vim: set fileencoding=cp850:\n", + b"# This Python file uses this encoding: cp850\n", + b"# This file uses a different encoding:\n# coding: cp850\n", + b"\n# coding=cp850\n\n", +] + class SourceEncodingTest(CoverageTest): """Tests of source_encoding() for detecting encodings.""" run_in_temp_dir = False def test_detect_source_encoding(self): - # Various forms from http://www.python.org/dev/peps/pep-0263/ - source = b"# coding=cp850\n\n" - self.assertEqual(source_encoding(source), 'cp850') - source = b"#!/usr/bin/python\n# -*- coding: utf-8 -*-\n" - self.assertEqual(source_encoding(source), 'utf-8') - source = b"#!/usr/bin/python\n# vim: set fileencoding=utf8 :\n" - self.assertEqual(source_encoding(source), 'utf8') - source = b"# This Python file uses this encoding: utf-8\n" - self.assertEqual(source_encoding(source), 'utf-8') + for source in ENCODING_DECLARATION_SOURCES: + self.assertEqual( + source_encoding(source), + 'cp850', + "Wrong encoding in %r" % source + ) def test_detect_source_encoding_not_in_comment(self): if env.PYPY and env.PY3: @@ -117,11 +127,6 @@ class SourceEncodingTest(CoverageTest): source = b'def parse(src, encoding=None):\n pass' self.assertEqual(source_encoding(source), DEF_ENCODING) - def test_detect_source_encoding_on_second_line(self): - # A coding declaration should be found despite a first blank line. - source = b"\n# coding=cp850\n\n" - self.assertEqual(source_encoding(source), 'cp850') - def test_dont_detect_source_encoding_on_third_line(self): # A coding declaration doesn't count on the third line. source = b"\n\n# coding=cp850\n\n" @@ -140,3 +145,41 @@ class SourceEncodingTest(CoverageTest): source = b"\xEF\xBB\xBF# coding: cp850\n" with self.assertRaises(SyntaxError): source_encoding(source) + + +class NeuterEncodingDeclarationTest(CoverageTest): + """Tests of phystokens.neuter_encoding_declaration().""" + + run_in_temp_dir = False + + def test_neuter_encoding_declaration(self): + for source in ENCODING_DECLARATION_SOURCES: + neutered = neuter_encoding_declaration(source.decode("ascii")) + neutered = neutered.encode("ascii") + + # The neutered source should have the same number of lines. + source_lines = source.splitlines() + neutered_lines = neutered.splitlines() + self.assertEqual(len(source_lines), len(neutered_lines)) + + # Only one of the lines should be different. + lines_different = sum( + int(nline != sline) for nline, sline in zip(neutered_lines, source_lines) + ) + self.assertEqual(lines_different, 1) + + self.assertEqual( + source_encoding(neutered), + DEF_ENCODING, + "Wrong encoding in %r" % neutered + ) + + +class CompileUnicodeTest(CoverageTest): + """Tests of compiling Unicode strings.""" + + run_in_temp_dir = False + + def test_cp1252(self): + uni = u"""# coding: cp1252\n# \u201C curly \u201D\n""" + compile_unicode(uni, "<string>", "exec") diff --git a/tests/test_pickle2json.py b/tests/test_pickle2json.py new file mode 100644 index 00000000..433dade6 --- /dev/null +++ b/tests/test_pickle2json.py @@ -0,0 +1,55 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +"""Tests for coverage.pickle2json""" + +from coverage.backward import pickle, iitems +from coverage.data import CoverageData +from coverage.pickle2json import pickle2json + +from tests.coveragetest import CoverageTest +from tests.test_data import DataTestHelpers, LINES_1, ARCS_3 + + +class Pickle2JsonTestInTempDir(DataTestHelpers, CoverageTest): + """Tests pickle2json.py.""" + + no_files_in_temp_dir = True + + def write_pickled_file(self, covdata, filename): + """Write coverage data as pickled `filename`.""" + # Create the file data. + file_data = {} + + if covdata._arcs: + file_data['arcs'] = dict((f, list(amap)) for f, amap in iitems(covdata._arcs)) + else: + file_data['lines'] = dict((f, list(lmap)) for f, lmap in iitems(covdata._lines)) + + # Write the pickle to the file. + with open(filename, 'wb') as file_obj: + pickle.dump(file_data, file_obj, 2) + + def test_read_write_lines_pickle(self): + # Test the old pickle format. + covdata1 = CoverageData() + covdata1.add_lines(LINES_1) + self.write_pickled_file(covdata1, "lines.pkl") + + pickle2json("lines.pkl", "lines.json") + + covdata2 = CoverageData() + covdata2.read_file("lines.json") + self.assert_lines1_data(covdata2) + + def test_read_write_arcs_pickle(self): + # Test the old pickle format. + covdata1 = CoverageData() + covdata1.add_arcs(ARCS_3) + self.write_pickled_file(covdata1, "arcs.pkl") + + pickle2json("arcs.pkl", "arcs.json") + + covdata2 = CoverageData() + covdata2.read_file("arcs.json") + self.assert_arcs3_data(covdata2) diff --git a/tests/test_plugins.py b/tests/test_plugins.py index 69e7b42b..54f26a7f 100644 --- a/tests/test_plugins.py +++ b/tests/test_plugins.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Tests for plugins.""" import os.path @@ -40,6 +43,9 @@ class LoadPluginsTest(CoverageTest): class Plugin(CoveragePlugin): pass + + def coverage_init(reg, options): + reg.add_file_tracer(Plugin()) """) config = FakeConfig("plugin1", {}) @@ -55,8 +61,11 @@ class LoadPluginsTest(CoverageTest): class Plugin(CoveragePlugin): def __init__(self, options): - super(Plugin, self).__init__(options) + self.options = options self.this_is = "me" + + def coverage_init(reg, options): + reg.add_file_tracer(Plugin(options)) """) config = FakeConfig("plugin1", {'a': 'hello'}) @@ -73,14 +82,21 @@ class LoadPluginsTest(CoverageTest): class Plugin(CoveragePlugin): def __init__(self, options): - super(Plugin, self).__init__(options) + self.options = options self.this_is = "me" + + def coverage_init(reg, options): + reg.add_file_tracer(Plugin(options)) """) self.make_file("plugin2.py", """\ from coverage import CoveragePlugin class Plugin(CoveragePlugin): - pass + def __init__(self, options): + self.options = options + + def coverage_init(reg, options): + reg.add_file_tracer(Plugin(options)) """) config = FakeConfig("plugin1", {'a': 'hello'}) @@ -105,12 +121,12 @@ class LoadPluginsTest(CoverageTest): with self.assertRaises(ImportError): _ = Plugins.load_plugins(["plugin_not_there"], None) - def test_plugin_must_define_plugin_class(self): + def test_plugin_must_define_coverage_init(self): self.make_file("no_plugin.py", """\ from coverage import CoveragePlugin Nothing = 0 """) - msg_pat = "Plugin module 'no_plugin' didn't define a Plugin class" + msg_pat = "Plugin module 'no_plugin' didn't define a coverage_init function" with self.assertRaisesRegex(CoverageException, msg_pat): list(Plugins.load_plugins(["no_plugin"], None)) @@ -124,15 +140,17 @@ class PluginTest(CoverageTest): from coverage import CoveragePlugin class Plugin(CoveragePlugin): pass + def coverage_init(reg, options): + reg.add_noop(Plugin()) with open("evidence.out", "w") as f: f.write("we are here!") """) self.assert_doesnt_exist("evidence.out") cov = coverage.Coverage() - cov.config["run:plugins"] = ["my_plugin"] + cov.set_option("run:plugins", ["my_plugin"]) cov.start() - cov.stop() + cov.stop() # pragma: nested with open("evidence.out") as f: self.assertEqual(f.read(), "we are here!") @@ -141,7 +159,7 @@ class PluginTest(CoverageTest): # Prove that a missing plugin will raise an ImportError. with self.assertRaises(ImportError): cov = coverage.Coverage() - cov.config["run:plugins"] = ["does_not_exist_woijwoicweo"] + cov.set_option("run:plugins", ["does_not_exist_woijwoicweo"]) cov.start() cov.stop() @@ -152,7 +170,7 @@ class PluginTest(CoverageTest): """) with self.assertRaises(ZeroDivisionError): cov = coverage.Coverage() - cov.config["run:plugins"] = ["plugin_over_zero"] + cov.set_option("run:plugins", ["plugin_over_zero"]) cov.start() cov.stop() @@ -163,16 +181,19 @@ class PluginTest(CoverageTest): class Plugin(coverage.CoveragePlugin): def sys_info(self): return [("hello", "world")] + + def coverage_init(reg, options): + reg.add_noop(Plugin()) """) debug_out = StringIO() cov = coverage.Coverage(debug=["sys"]) cov._debug_file = debug_out - cov.config["run:plugins"] = ["plugin_sys_info"] + cov.set_option("run:plugins", ["plugin_sys_info"]) cov.load() out_lines = debug_out.getvalue().splitlines() expected_end = [ - "-- sys: plugin_sys_info --------------------------------------", + "-- sys: plugin_sys_info.Plugin -------------------------------", " hello: world", "-- end -------------------------------------------------------", ] @@ -184,16 +205,19 @@ class PluginTest(CoverageTest): class Plugin(coverage.CoveragePlugin): pass + + def coverage_init(reg, options): + reg.add_noop(Plugin()) """) debug_out = StringIO() cov = coverage.Coverage(debug=["sys"]) cov._debug_file = debug_out - cov.config["run:plugins"] = ["plugin_no_sys_info"] + cov.set_option("run:plugins", ["plugin_no_sys_info"]) cov.load() out_lines = debug_out.getvalue().splitlines() expected_end = [ - "-- sys: plugin_no_sys_info -----------------------------------", + "-- sys: plugin_no_sys_info.Plugin ----------------------------", "-- end -------------------------------------------------------", ] self.assertEqual(expected_end, out_lines[-len(expected_end):]) @@ -202,8 +226,10 @@ class PluginTest(CoverageTest): self.make_file("importing_plugin.py", """\ from coverage import CoveragePlugin import local_module - class Plugin(CoveragePlugin): + class MyPlugin(CoveragePlugin): pass + def coverage_init(reg, options): + reg.add_noop(MyPlugin()) """) self.make_file("local_module.py", "CONST = 1") self.make_file(".coveragerc", """\ @@ -220,28 +246,20 @@ class PluginTest(CoverageTest): class PluginWarningOnPyTracer(CoverageTest): """Test that we get a controlled exception with plugins on PyTracer.""" - def setUp(self): - super(PluginWarningOnPyTracer, self).setUp() + def test_exception_if_plugins_on_pytracer(self): if env.C_TRACER: self.skip("This test is only about PyTracer.") - def test_exception_if_plugins_on_pytracer(self): self.make_file("simple.py", """a = 1""") cov = coverage.Coverage() - cov.config["run:plugins"] = ["tests.plugin1"] + cov.set_option("run:plugins", ["tests.plugin1"]) - warnings = [] - def capture_warning(msg): - warnings.append(msg) - cov._warn = capture_warning - - self.start_import_stop(cov, "simple") - self.assertIn( - "Plugin file tracers (tests.plugin1) " - "aren't supported with PyTracer", - warnings - ) + expected_warnings = [ + r"Plugin file tracers \(tests.plugin1.Plugin\) aren't supported with PyTracer", + ] + with self.assert_warnings(cov, expected_warnings): + self.start_import_stop(cov, "simple") class FileTracerTest(CoverageTest): @@ -270,7 +288,7 @@ class GoodPluginTest(FileTracerTest): cov = coverage.Coverage() CheckUniqueFilenames.hook(cov, '_should_trace') CheckUniqueFilenames.hook(cov, '_check_include_omit_etc') - cov.config["run:plugins"] = ["tests.plugin1"] + cov.set_option("run:plugins", ["tests.plugin1"]) # Import the Python file, executing it. self.start_import_stop(cov, "simple") @@ -283,6 +301,7 @@ class GoodPluginTest(FileTracerTest): self.assertEqual(statements, [105, 106, 107, 205, 206, 207]) def make_render_and_caller(self): + """Make the render.py and caller.py files we need.""" # plugin2 emulates a dynamic tracing plugin: the caller's locals # are examined to determine the source file and line number. # The plugin is in tests/plugin2.py. @@ -334,7 +353,7 @@ class GoodPluginTest(FileTracerTest): cov = coverage.Coverage(omit=["*quux*"]) CheckUniqueFilenames.hook(cov, '_should_trace') CheckUniqueFilenames.hook(cov, '_check_include_omit_etc') - cov.config["run:plugins"] = ["tests.plugin2"] + cov.set_option("run:plugins", ["tests.plugin2"]) self.start_import_stop(cov, "caller") @@ -344,20 +363,20 @@ class GoodPluginTest(FileTracerTest): _, statements, missing, _ = cov.analysis("foo_7.html") self.assertEqual(statements, [1, 2, 3, 4, 5, 6, 7]) self.assertEqual(missing, [1, 2, 3, 6, 7]) - self.assertIn("foo_7.html", cov.data.summary()) + self.assertIn("foo_7.html", cov.data.line_counts()) _, statements, missing, _ = cov.analysis("bar_4.html") self.assertEqual(statements, [1, 2, 3, 4]) self.assertEqual(missing, [1, 4]) - self.assertIn("bar_4.html", cov.data.summary()) + self.assertIn("bar_4.html", cov.data.line_counts()) - self.assertNotIn("quux_5.html", cov.data.summary()) + self.assertNotIn("quux_5.html", cov.data.line_counts()) if env.PY2: _, statements, missing, _ = cov.analysis("uni_3.html") self.assertEqual(statements, [1, 2, 3]) self.assertEqual(missing, [1]) - self.assertIn("uni_3.html", cov.data.summary()) + self.assertIn("uni_3.html", cov.data.line_counts()) def test_plugin2_with_branch(self): self.make_render_and_caller() @@ -365,7 +384,7 @@ class GoodPluginTest(FileTracerTest): cov = coverage.Coverage(branch=True, omit=["*quux*"]) CheckUniqueFilenames.hook(cov, '_should_trace') CheckUniqueFilenames.hook(cov, '_check_include_omit_etc') - cov.config["run:plugins"] = ["tests.plugin2"] + cov.set_option("run:plugins", ["tests.plugin2"]) self.start_import_stop(cov, "caller") @@ -384,7 +403,7 @@ class GoodPluginTest(FileTracerTest): self.make_render_and_caller() cov = coverage.Coverage(branch=True, omit=["*quux*"]) - cov.config["run:plugins"] = ["tests.plugin2"] + cov.set_option("run:plugins", ["tests.plugin2"]) self.start_import_stop(cov, "caller") @@ -406,7 +425,7 @@ class GoodPluginTest(FileTracerTest): self.make_render_and_caller() cov = coverage.Coverage(branch=True, omit=["*quux*"]) - cov.config["run:plugins"] = ["tests.plugin2"] + cov.set_option("run:plugins", ["tests.plugin2"]) self.start_import_stop(cov, "caller") @@ -421,7 +440,7 @@ class GoodPluginTest(FileTracerTest): self.make_render_and_caller() cov = coverage.Coverage(branch=True, omit=["*quux*"]) - cov.config["run:plugins"] = ["tests.plugin2"] + cov.set_option("run:plugins", ["tests.plugin2"]) self.start_import_stop(cov, "caller") @@ -434,20 +453,70 @@ class GoodPluginTest(FileTracerTest): for snip in [ 'filename="bar_4.html" line-rate="0.5" name="bar_4.html"', 'filename="foo_7.html" line-rate="0.2857" name="foo_7.html"', - ]: + ]: self.assertIn(snip, xml) + def test_defer_to_python(self): + # A plugin that measures, but then wants built-in python reporting. + self.make_file("fairly_odd_plugin.py", """\ + # A plugin that claims all the odd lines are executed, and none of + # the even lines, and then punts reporting off to the built-in + # Python reporting. + import coverage.plugin + class Plugin(coverage.CoveragePlugin): + def file_tracer(self, filename): + return OddTracer(filename) + def file_reporter(self, filename): + return "python" + + class OddTracer(coverage.plugin.FileTracer): + def __init__(self, filename): + self.filename = filename + def source_filename(self): + return self.filename + def line_number_range(self, frame): + lineno = frame.f_lineno + if lineno % 2: + return (lineno, lineno) + else: + return (-1, -1) + + def coverage_init(reg, options): + reg.add_file_tracer(Plugin()) + """) + self.make_file("unsuspecting.py", """\ + a = 1 + b = 2 + c = 3 + d = 4 + e = 5 + f = 6 + """) + cov = coverage.Coverage(include=["unsuspecting.py"]) + cov.set_option("run:plugins", ["fairly_odd_plugin"]) + self.start_import_stop(cov, "unsuspecting") + + repout = StringIO() + total = cov.report(file=repout) + report = repout.getvalue().splitlines() + expected = [ + 'Name Stmts Miss Cover Missing', + '-----------------------------------------------', + 'unsuspecting.py 6 3 50% 2, 4, 6', + ] + self.assertEqual(report, expected) + self.assertEqual(total, 50) + class BadPluginTest(FileTracerTest): """Test error handling around plugins.""" - def run_bad_plugin(self, plugin_name, our_error=True): - """Run a file, and see that the plugin failed. + def run_plugin(self, module_name): + """Run a plugin with the given module_name. - `plugin_name` is the name of the plugin to use. + Uses a few fixed Python files. - `our_error` is True if the error reported to the user will be an - explicit error in our test code, marked with an # Oh noes! comment. + Returns the Coverage object. """ self.make_file("simple.py", """\ @@ -469,8 +538,26 @@ class BadPluginTest(FileTracerTest): """) cov = coverage.Coverage() - cov.config["run:plugins"] = [plugin_name] + cov.set_option("run:plugins", [module_name]) self.start_import_stop(cov, "simple") + return cov + + def run_bad_plugin(self, module_name, plugin_name, our_error=True, excmsg=None): + """Run a file, and see that the plugin failed. + + `module_name` and `plugin_name` is the module and name of the plugin to + use. + + `our_error` is True if the error reported to the user will be an + explicit error in our test code, marked with an '# Oh noes!' comment. + + `excmsg`, if provided, is text that should appear in the stderr. + + The plugin will be disabled, and we check that a warning is output + explaining why. + + """ + self.run_plugin(module_name) stderr = self.stderr() print(stderr) # for diagnosing test failures. @@ -481,18 +568,77 @@ class BadPluginTest(FileTracerTest): self.assertEqual(errors, 1) # There should be a warning explaining what's happening, but only one. - msg = "Disabling plugin %r due to an exception:" % plugin_name + # The message can be in two forms: + # Disabling plugin '...' due to previous exception + # or: + # Disabling plugin '...' due to an exception: + msg = "Disabling plugin '%s.%s' due to " % (module_name, plugin_name) warnings = stderr.count(msg) self.assertEqual(warnings, 1) + if excmsg: + self.assertIn(excmsg, stderr) + + def test_file_tracer_has_no_file_tracer_method(self): + self.make_file("bad_plugin.py", """\ + class Plugin(object): + pass + + def coverage_init(reg, options): + reg.add_file_tracer(Plugin()) + """) + self.run_bad_plugin("bad_plugin", "Plugin", our_error=False) + + def test_file_tracer_has_inherited_sourcefilename_method(self): + self.make_file("bad_plugin.py", """\ + import coverage + class Plugin(coverage.CoveragePlugin): + def file_tracer(self, filename): + # Just grab everything. + return FileTracer() + + class FileTracer(coverage.FileTracer): + pass + + def coverage_init(reg, options): + reg.add_file_tracer(Plugin()) + """) + self.run_bad_plugin( + "bad_plugin", "Plugin", our_error=False, + excmsg="Class 'bad_plugin.FileTracer' needs to implement source_filename()", + ) + + def test_plugin_has_inherited_filereporter_method(self): + self.make_file("bad_plugin.py", """\ + import coverage + class Plugin(coverage.CoveragePlugin): + def file_tracer(self, filename): + # Just grab everything. + return FileTracer() + + class FileTracer(coverage.FileTracer): + def source_filename(self): + return "foo.xxx" + + def coverage_init(reg, options): + reg.add_file_tracer(Plugin()) + """) + cov = self.run_plugin("bad_plugin") + expected_msg = "Plugin 'bad_plugin.Plugin' needs to implement file_reporter()" + with self.assertRaisesRegex(NotImplementedError, expected_msg): + cov.report() + def test_file_tracer_fails(self): self.make_file("bad_plugin.py", """\ import coverage.plugin class Plugin(coverage.plugin.CoveragePlugin): def file_tracer(self, filename): 17/0 # Oh noes! + + def coverage_init(reg, options): + reg.add_file_tracer(Plugin()) """) - self.run_bad_plugin("bad_plugin") + self.run_bad_plugin("bad_plugin", "Plugin") def test_file_tracer_returns_wrong(self): self.make_file("bad_plugin.py", """\ @@ -500,8 +646,11 @@ class BadPluginTest(FileTracerTest): class Plugin(coverage.plugin.CoveragePlugin): def file_tracer(self, filename): return 3.14159 + + def coverage_init(reg, options): + reg.add_file_tracer(Plugin()) """) - self.run_bad_plugin("bad_plugin", our_error=False) + self.run_bad_plugin("bad_plugin", "Plugin", our_error=False) def test_has_dynamic_source_filename_fails(self): self.make_file("bad_plugin.py", """\ @@ -513,8 +662,11 @@ class BadPluginTest(FileTracerTest): class BadFileTracer(coverage.plugin.FileTracer): def has_dynamic_source_filename(self): 23/0 # Oh noes! + + def coverage_init(reg, options): + reg.add_file_tracer(Plugin()) """) - self.run_bad_plugin("bad_plugin") + self.run_bad_plugin("bad_plugin", "Plugin") def test_source_filename_fails(self): self.make_file("bad_plugin.py", """\ @@ -526,8 +678,11 @@ class BadPluginTest(FileTracerTest): class BadFileTracer(coverage.plugin.FileTracer): def source_filename(self): 42/0 # Oh noes! + + def coverage_init(reg, options): + reg.add_file_tracer(Plugin()) """) - self.run_bad_plugin("bad_plugin") + self.run_bad_plugin("bad_plugin", "Plugin") def test_source_filename_returns_wrong(self): self.make_file("bad_plugin.py", """\ @@ -539,8 +694,11 @@ class BadPluginTest(FileTracerTest): class BadFileTracer(coverage.plugin.FileTracer): def source_filename(self): return 17.3 + + def coverage_init(reg, options): + reg.add_file_tracer(Plugin()) """) - self.run_bad_plugin("bad_plugin", our_error=False) + self.run_bad_plugin("bad_plugin", "Plugin", our_error=False) def test_dynamic_source_filename_fails(self): self.make_file("bad_plugin.py", """\ @@ -555,8 +713,11 @@ class BadPluginTest(FileTracerTest): return True def dynamic_source_filename(self, filename, frame): 101/0 # Oh noes! + + def coverage_init(reg, options): + reg.add_file_tracer(Plugin()) """) - self.run_bad_plugin("bad_plugin") + self.run_bad_plugin("bad_plugin", "Plugin") def test_line_number_range_returns_non_tuple(self): self.make_file("bad_plugin.py", """\ @@ -572,8 +733,11 @@ class BadPluginTest(FileTracerTest): def line_number_range(self, frame): return 42.23 + + def coverage_init(reg, options): + reg.add_file_tracer(Plugin()) """) - self.run_bad_plugin("bad_plugin", our_error=False) + self.run_bad_plugin("bad_plugin", "Plugin", our_error=False) def test_line_number_range_returns_triple(self): self.make_file("bad_plugin.py", """\ @@ -589,8 +753,11 @@ class BadPluginTest(FileTracerTest): def line_number_range(self, frame): return (1, 2, 3) + + def coverage_init(reg, options): + reg.add_file_tracer(Plugin()) """) - self.run_bad_plugin("bad_plugin", our_error=False) + self.run_bad_plugin("bad_plugin", "Plugin", our_error=False) def test_line_number_range_returns_pair_of_strings(self): self.make_file("bad_plugin.py", """\ @@ -606,5 +773,8 @@ class BadPluginTest(FileTracerTest): def line_number_range(self, frame): return ("5", "7") + + def coverage_init(reg, options): + reg.add_file_tracer(Plugin()) """) - self.run_bad_plugin("bad_plugin", our_error=False) + self.run_bad_plugin("bad_plugin", "Plugin", our_error=False) diff --git a/tests/test_process.py b/tests/test_process.py index 1ae8e922..55dc3b13 100644 --- a/tests/test_process.py +++ b/tests/test_process.py @@ -1,13 +1,19 @@ +# coding: utf8 +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Tests for process behavior of coverage.py.""" import glob import os import os.path +import re import sys import textwrap import coverage -from coverage import env +from coverage import env, CoverageData +from coverage.misc import output_encoding from tests.coveragetest import CoverageTest @@ -49,7 +55,8 @@ class ProcessTest(CoverageTest): self.assert_exists(".coverage") self.assertEqual(out, 'done\n') - def test_combine_parallel_data(self): + def make_b_or_c_py(self): + """Create b_or_c.py, used in a few of these tests.""" self.make_file("b_or_c.py", """\ import sys a = 1 @@ -61,9 +68,12 @@ class ProcessTest(CoverageTest): print('done') """) + def test_combine_parallel_data(self): + self.make_b_or_c_py() out = self.run_command("coverage run -p b_or_c.py b") self.assertEqual(out, 'done\n') self.assert_doesnt_exist(".coverage") + self.assertEqual(self.number_of_data_files(), 1) out = self.run_command("coverage run -p b_or_c.py c") self.assertEqual(out, 'done\n') @@ -83,19 +93,46 @@ class ProcessTest(CoverageTest): # executed. data = coverage.CoverageData() data.read_file(".coverage") - self.assertEqual(data.summary()['b_or_c.py'], 7) + self.assertEqual(data.line_counts()['b_or_c.py'], 7) + + def test_combine_parallel_data_with_a_corrupt_file(self): + self.make_b_or_c_py() + out = self.run_command("coverage run -p b_or_c.py b") + self.assertEqual(out, 'done\n') + self.assert_doesnt_exist(".coverage") + self.assertEqual(self.number_of_data_files(), 1) + + out = self.run_command("coverage run -p b_or_c.py c") + self.assertEqual(out, 'done\n') + self.assert_doesnt_exist(".coverage") + + # After two -p runs, there should be two .coverage.machine.123 files. + self.assertEqual(self.number_of_data_files(), 2) + + # Make a bogus data file. + self.make_file(".coverage.bad", "This isn't a coverage data file.") + + # Combine the parallel coverage data files into .coverage . + out = self.run_command("coverage combine") + self.assert_exists(".coverage") + self.assert_exists(".coverage.bad") + warning_regex = ( + r"Coverage.py warning: Couldn't read data from '.*\.coverage\.bad': " + r"CoverageException: Doesn't seem to be a coverage\.py data file" + ) + self.assertRegex(out, warning_regex) + + # After combining, those two should be the only data files. + self.assertEqual(self.number_of_data_files(), 2) + + # 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.line_counts()['b_or_c.py'], 7) def test_combine_parallel_data_in_two_steps(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_b_or_c_py() out = self.run_command("coverage run -p b_or_c.py b") self.assertEqual(out, 'done\n') @@ -107,7 +144,7 @@ class ProcessTest(CoverageTest): self.assert_exists(".coverage") self.assertEqual(self.number_of_data_files(), 1) - out = self.run_command("coverage run --append -p b_or_c.py c") + out = self.run_command("coverage run -p b_or_c.py c") self.assertEqual(out, 'done\n') self.assert_exists(".coverage") self.assertEqual(self.number_of_data_files(), 2) @@ -123,20 +160,68 @@ class ProcessTest(CoverageTest): # executed. data = coverage.CoverageData() data.read_file(".coverage") - self.assertEqual(data.summary()['b_or_c.py'], 7) + self.assertEqual(data.line_counts()['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') + def test_append_data(self): + self.make_b_or_c_py() + + out = self.run_command("coverage run b_or_c.py b") + self.assertEqual(out, 'done\n') + self.assert_exists(".coverage") + self.assertEqual(self.number_of_data_files(), 1) + + out = self.run_command("coverage run --append b_or_c.py c") + self.assertEqual(out, 'done\n') + self.assert_exists(".coverage") + 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.line_counts()['b_or_c.py'], 7) + + def test_append_data_with_different_file(self): + self.make_b_or_c_py() + + self.make_file(".coveragerc", """\ + [run] + data_file = .mycovdata """) + out = self.run_command("coverage run b_or_c.py b") + self.assertEqual(out, 'done\n') + self.assert_doesnt_exist(".coverage") + self.assert_exists(".mycovdata") + + out = self.run_command("coverage run --append b_or_c.py c") + self.assertEqual(out, 'done\n') + self.assert_doesnt_exist(".coverage") + self.assert_exists(".mycovdata") + + # Read the coverage file and see that b_or_c.py has all 7 lines + # executed. + data = coverage.CoverageData() + data.read_file(".mycovdata") + self.assertEqual(data.line_counts()['b_or_c.py'], 7) + + def test_append_can_create_a_data_file(self): + self.make_b_or_c_py() + + out = self.run_command("coverage run --append b_or_c.py b") + self.assertEqual(out, 'done\n') + self.assert_exists(".coverage") + self.assertEqual(self.number_of_data_files(), 1) + + # Read the coverage file and see that b_or_c.py has only 6 lines + # executed. + data = coverage.CoverageData() + data.read_file(".coverage") + self.assertEqual(data.line_counts()['b_or_c.py'], 6) + + def test_combine_with_rc(self): + self.make_b_or_c_py() + self.make_file(".coveragerc", """\ [run] parallel = true @@ -165,7 +250,7 @@ class ProcessTest(CoverageTest): # executed. data = coverage.CoverageData() data.read_file(".coverage") - self.assertEqual(data.summary()['b_or_c.py'], 7) + self.assertEqual(data.line_counts()['b_or_c.py'], 7) # Reporting should still work even with the .rc file out = self.run_command("coverage report") @@ -219,13 +304,30 @@ class ProcessTest(CoverageTest): # files have been combined together. data = coverage.CoverageData() data.read_file(".coverage") - summary = data.summary(fullpath=True) + summary = data.line_counts(fullpath=True) self.assertEqual(len(summary), 1) actual = os.path.normcase(os.path.abspath(list(summary.keys())[0])) expected = os.path.normcase(os.path.abspath('src/x.py')) self.assertEqual(actual, expected) self.assertEqual(list(summary.values())[0], 6) + def test_erase_parallel(self): + self.make_file(".coveragerc", """\ + [run] + data_file = data.dat + parallel = True + """) + self.make_file("data.dat") + self.make_file("data.dat.fooey") + self.make_file("data.dat.gooey") + self.make_file(".coverage") + + self.run_command("coverage erase") + self.assert_doesnt_exist("data.dat") + self.assert_doesnt_exist("data.dat.fooey") + self.assert_doesnt_exist("data.dat.gooey") + self.assert_exists(".coverage") + def test_missing_source_file(self): # Check what happens if the source is missing when reporting happens. self.make_file("fleeting.py", """\ @@ -337,6 +439,26 @@ class ProcessTest(CoverageTest): out_py = self.run_command("python -m tests.try_execfile") self.assertMultiLineEqual(out_cov, out_py) + def test_coverage_run_dir_is_like_python_dir(self): + tryfile = os.path.join(HERE, "try_execfile.py") + with open(tryfile) as f: + self.make_file("with_main/__main__.py", f.read()) + out_cov = self.run_command("coverage run with_main") + out_py = self.run_command("python with_main") + + # The coverage.py results are not identical to the Python results, and + # I don't know why. For now, ignore those failures. If someone finds + # a real problem with the discrepancies, we can work on it some more. + ignored = r"__file__|__loader__|__package__" + # PyPy includes the current directory in the path when running a + # directory, while CPython and coverage.py do not. Exclude that from + # the comparison also... + if env.PYPY: + ignored += "|"+re.escape(os.getcwd()) + out_cov = remove_matching_lines(out_cov, ignored) + out_py = remove_matching_lines(out_py, ignored) + self.assertMultiLineEqual(out_cov, out_py) + def test_coverage_run_dashm_equal_to_doubledashsource(self): """regression test for #328 @@ -397,7 +519,7 @@ class ProcessTest(CoverageTest): def test_coverage_run_dashm_is_like_python_dashm_with__main__207(self): if sys.version_info < (2, 7): - # Coverage isn't bug-for-bug compatible in the behavior of -m for + # Coverage.py isn't bug-for-bug compatible in the behavior of -m for # Pythons < 2.7 self.skip("-m doesn't work the same < Python 2.7") # https://bitbucket.org/ned/coveragepy/issue/207 @@ -447,7 +569,7 @@ class ProcessTest(CoverageTest): # executed. data = coverage.CoverageData() data.read_file(".coverage") - self.assertEqual(data.summary()['fork.py'], 9) + self.assertEqual(data.line_counts()['fork.py'], 9) def test_warnings(self): self.make_file("hello.py", """\ @@ -531,6 +653,21 @@ class ProcessTest(CoverageTest): self.assertIn("Trace function changed", out) + def test_note(self): + self.make_file(".coveragerc", """\ + [run] + data_file = mydata.dat + note = These are musical notes: ♫𝅗𝅥♩ + """) + self.make_file("simple.py", """print('hello')""") + self.run_command("coverage run simple.py") + + data = CoverageData() + data.read_file("mydata.dat") + infos = data.run_infos() + self.assertEqual(len(infos), 1) + self.assertEqual(infos[0]['note'], u"These are musical notes: ♫𝅗𝅥♩") + def test_fullcoverage(self): # pragma: not covered if env.PY2: # This doesn't work on Python 2. self.skip("fullcoverage doesn't work on Python 2.") @@ -558,7 +695,7 @@ class ProcessTest(CoverageTest): # The actual number of executed lines in os.py when it's # imported is 120 or so. Just running os.getenv executes # about 5. - self.assertGreater(data.summary()['os.py'], 50) + self.assertGreater(data.line_counts()['os.py'], 50) def test_deprecation_warnings(self): # Test that coverage doesn't trigger deprecation warnings. @@ -593,8 +730,7 @@ class ProcessTest(CoverageTest): out = self.run_command("python run_twice.py") self.assertEqual( out, - "Coverage.py warning: " - "Module foo was previously imported, but not measured.\n" + "Coverage.py warning: Module foo was previously imported, but not measured.\n" ) @@ -621,6 +757,17 @@ class AliasedCommandTest(CoverageTest): out = self.run_command(cmd) self.assertIn("Code coverage for Python", out) + def test_aliases_used_in_messages(self): + cmds = [ + "coverage", + "coverage%d" % sys.version_info[0], + "coverage-%d.%d" % sys.version_info[:2], + ] + for cmd in cmds: + out = self.run_command("%s foobar" % cmd) + self.assertIn("Unknown command: 'foobar'", out) + self.assertIn("Use '%s help' for help" % cmd, out) + class PydocTest(CoverageTest): """Test that pydoc can get our information.""" @@ -704,6 +851,127 @@ class FailUnderTest(CoverageTest): self.assertEqual(st, 2) +class FailUnderNoFilesTest(CoverageTest): + """Test that nothing to report results in an error exit status.""" + def setUp(self): + super(FailUnderNoFilesTest, self).setUp() + self.make_file(".coveragerc", "[report]\nfail_under = 99\n") + + def test_report(self): + st, out = self.run_command_status("coverage report") + self.assertIn('No data to report.', out) + self.assertEqual(st, 1) + + def test_xml(self): + st, out = self.run_command_status("coverage xml") + self.assertIn('No data to report.', out) + self.assertEqual(st, 1) + + def test_html(self): + st, out = self.run_command_status("coverage html") + self.assertIn('No data to report.', out) + self.assertEqual(st, 1) + + +class FailUnderEmptyFilesTest(CoverageTest): + """Test that empty files produce the proper fail_under exit status.""" + def setUp(self): + super(FailUnderEmptyFilesTest, self).setUp() + + self.make_file(".coveragerc", "[report]\nfail_under = 99\n") + self.make_file("empty.py", "") + st, _ = self.run_command_status("coverage run empty.py") + self.assertEqual(st, 0) + + def test_report(self): + st, _ = self.run_command_status("coverage report") + self.assertEqual(st, 2) + + def test_xml(self): + st, _ = self.run_command_status("coverage xml") + self.assertEqual(st, 2) + + def test_html(self): + st, _ = self.run_command_status("coverage html") + self.assertEqual(st, 2) + + +class UnicodeFilePathsTest(CoverageTest): + """Tests of using non-ascii characters in the names of files.""" + + def test_accented_dot_py(self): + # Make a file with a non-ascii character in the filename. + self.make_file(u"h\xe2t.py", "print('accented')") + out = self.run_command(u"coverage run h\xe2t.py") + self.assertEqual(out, "accented\n") + + # The HTML report uses ascii-encoded HTML entities. + out = self.run_command("coverage html") + self.assertEqual(out, "") + self.assert_exists(u"htmlcov/h\xe2t_py.html") + with open("htmlcov/index.html") as indexf: + index = indexf.read() + self.assertIn('<a href="hât_py.html">hât.py</a>', index) + + # The XML report is always UTF8-encoded. + out = self.run_command("coverage xml") + self.assertEqual(out, "") + with open("coverage.xml", "rb") as xmlf: + xml = xmlf.read() + self.assertIn(u' filename="h\xe2t.py"'.encode('utf8'), xml) + self.assertIn(u' name="h\xe2t.py"'.encode('utf8'), xml) + + report_expected = ( + u"Name Stmts Miss Cover\n" + u"----------------------------\n" + u"h\xe2t.py 1 0 100%\n" + ) + + if env.PY2: + report_expected = report_expected.encode(output_encoding()) + + out = self.run_command("coverage report") + self.assertEqual(out, report_expected) + + def test_accented_directory(self): + # Make a file with a non-ascii character in the directory name. + self.make_file(u"\xe2/accented.py", "print('accented')") + out = self.run_command(u"coverage run \xe2/accented.py") + self.assertEqual(out, "accented\n") + + # The HTML report uses ascii-encoded HTML entities. + out = self.run_command("coverage html") + self.assertEqual(out, "") + self.assert_exists(u"htmlcov/\xe2_accented_py.html") + with open("htmlcov/index.html") as indexf: + index = indexf.read() + self.assertIn('<a href="â_accented_py.html">â%saccented.py</a>' % os.sep, index) + + # The XML report is always UTF8-encoded. + out = self.run_command("coverage xml") + self.assertEqual(out, "") + with open("coverage.xml", "rb") as xmlf: + xml = xmlf.read() + self.assertIn(u' filename="\xe2/accented.py"'.encode('utf8'), xml) + self.assertIn(u' name="accented.py"'.encode('utf8'), xml) + self.assertIn( + u'<package branch-rate="0" complexity="0" line-rate="1" name="\xe2">'.encode('utf8'), + xml + ) + + report_expected = ( + u"Name Stmts Miss Cover\n" + u"-----------------------------------\n" + u"\xe2%saccented.py 1 0 100%%\n" % os.sep + ) + + if env.PY2: + report_expected = report_expected.encode(output_encoding()) + + out = self.run_command("coverage report") + self.assertEqual(out, report_expected) + + def possible_pth_dirs(): """Produce a sequence of directories for trying to write .pth files.""" # First look through sys.path, and we find a .pth file, then it's a good @@ -715,12 +983,12 @@ def possible_pth_dirs(): # If we're still looking, then try the Python library directory. # https://bitbucket.org/ned/coveragepy/issue/339/pth-test-malfunctions - import distutils.sysconfig + import distutils.sysconfig # pylint: disable=import-error yield distutils.sysconfig.get_python_lib() class ProcessCoverageMixin(object): - """Set up a .pth file that causes all sub-processes to be coverage'd""" + """Set up a .pth file to coverage-measure all sub-processes.""" def setUp(self): super(ProcessCoverageMixin, self).setUp() @@ -746,9 +1014,7 @@ class ProcessStartupTest(ProcessCoverageMixin, CoverageTest): def test_subprocess_with_pth_files(self): # pragma: not covered if env.METACOV: - self.skip( - "Can't test sub-process pth file suppport during metacoverage" - ) + self.skip("Can't test sub-process pth file suppport during metacoverage") # Main will run sub.py self.make_file("main.py", """\ @@ -775,7 +1041,7 @@ class ProcessStartupTest(ProcessCoverageMixin, CoverageTest): self.assert_exists(".mycovdata") data = coverage.CoverageData() data.read_file(".mycovdata") - self.assertEqual(data.summary()['sub.py'], 2) + self.assertEqual(data.line_counts()['sub.py'], 2) class ProcessStartupWithSourceTest(ProcessCoverageMixin, CoverageTest): @@ -795,18 +1061,32 @@ class ProcessStartupWithSourceTest(ProcessCoverageMixin, CoverageTest): def assert_pth_and_source_work_together( self, dashm, package, source ): # pragma: not covered + """Run the test for a particular combination of factors. + + The arguments are all strings: + + * `dashm`: Either "" (run the program as a file) or "-m" (run the + program as a module). + + * `package`: Either "" (put the source at the top level) or a + package name to use to hold the source. + + * `source`: Either "main" or "sub", which file to use as the + ``--source`` argument. + + """ if env.METACOV: - self.skip( - "Can't test sub-process pth file suppport during metacoverage" - ) + self.skip("Can't test sub-process pth file suppport during metacoverage") def fullname(modname): + """What is the full module name for `modname` for this test?""" if package and dashm: return '.'.join((package, modname)) else: return modname def path(basename): + """Where should `basename` be created for this test?""" return os.path.join(package, basename) # Main will run sub.py. @@ -829,13 +1109,11 @@ class ProcessStartupWithSourceTest(ProcessCoverageMixin, CoverageTest): self.set_environ("COVERAGE_PROCESS_START", "coverage.ini") if dashm: - cmd = (sys.executable, dashm, fullname('main')) + cmd = "python -m %s" % fullname('main') else: - cmd = (sys.executable, path('main.py')) + cmd = "python %s" % path('main.py') - # TODO: can we use run_command here instead of Popen? - from subprocess import Popen - Popen(cmd).wait() + self.run_command(cmd) with open("out.txt") as f: self.assertEqual(f.read(), "Hello, world!") @@ -844,7 +1122,7 @@ class ProcessStartupWithSourceTest(ProcessCoverageMixin, CoverageTest): self.assert_exists(".coverage") data = coverage.CoverageData() data.read_file(".coverage") - summary = data.summary() + summary = data.line_counts() print(summary) self.assertEqual(summary[source + '.py'], 2) self.assertEqual(len(summary), 1) @@ -872,3 +1150,9 @@ class ProcessStartupWithSourceTest(ProcessCoverageMixin, CoverageTest): def test_script_pkg_sub(self): self.assert_pth_and_source_work_together('', 'pkg', 'sub') + + +def remove_matching_lines(text, pat): + """Return `text` with all lines matching `pat` removed.""" + lines = [l for l in text.splitlines(True) if not re.search(pat, l)] + return "".join(lines) diff --git a/tests/test_python.py b/tests/test_python.py index f2c18a10..ee1e1f95 100644 --- a/tests/test_python.py +++ b/tests/test_python.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Tests of coverage/python.py""" import os @@ -17,7 +20,7 @@ class GetZipBytesTest(CoverageTest): # See igor.py, do_zipmods, for the text of these files. zip_file = "tests/zipmods.zip" sys.path.append(zip_file) # So we can import the files. - for encoding in ["utf8", "gb2312", "hebrew", "shift_jis"]: + for encoding in ["utf8", "gb2312", "hebrew", "shift_jis", "cp1252"]: filename = zip_file + "/encoded_" + encoding + ".py" filename = filename.replace("/", os.sep) zip_data = get_zip_bytes(filename) diff --git a/tests/test_results.py b/tests/test_results.py index 4ce048b6..54c2f6d7 100644 --- a/tests/test_results.py +++ b/tests/test_results.py @@ -1,11 +1,14 @@ -"""Tests for Coverage.py's results analysis.""" +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +"""Tests for coverage.py's results analysis.""" from coverage.results import Numbers from tests.coveragetest import CoverageTest class NumbersTest(CoverageTest): - """Tests for Coverage.py's numeric measurement summaries.""" + """Tests for coverage.py's numeric measurement summaries.""" run_in_temp_dir = False diff --git a/tests/test_summary.py b/tests/test_summary.py index c7327f1f..56c0b831 100644 --- a/tests/test_summary.py +++ b/tests/test_summary.py @@ -1,3 +1,7 @@ +# coding: utf8 +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Test text-based summary reporting for coverage.py""" import glob @@ -10,6 +14,7 @@ import sys import coverage from coverage import env from coverage.backward import StringIO +from coverage.misc import output_encoding from tests.coveragetest import CoverageTest @@ -21,16 +26,20 @@ class SummaryTest(CoverageTest): def setUp(self): super(SummaryTest, self).setUp() + # Parent class saves and restores sys.path, we can just modify it. + sys.path.append(self.nice_file(HERE, 'modules')) + + def make_mycode(self): + """Make the mycode.py file when needed.""" self.make_file("mycode.py", """\ import covmod1 import covmodzip1 a = 1 print('done') """) - # Parent class saves and restores sys.path, we can just modify it. - sys.path.append(self.nice_file(HERE, 'modules')) def test_report(self): + self.make_mycode() out = self.run_command("coverage run mycode.py") self.assertEqual(out, 'done\n') report = self.report_from_command("coverage report") @@ -38,19 +47,20 @@ class SummaryTest(CoverageTest): # Name Stmts Miss Cover # ------------------------------------------------------------------ # c:/ned/coverage/tests/modules/covmod1.py 2 0 100% - # c:/ned/coverage/tests/zipmods.zip/covmodzip1.py 2 0 100% + # c:/ned/coverage/tests/zipmods.zip/covmodzip1.py 3 0 100% # mycode.py 4 0 100% # ------------------------------------------------------------------ - # TOTAL 8 0 100% + # TOTAL 9 0 100% self.assertNotIn("/coverage/__init__/", report) self.assertIn("/tests/modules/covmod1.py ", report) self.assertIn("/tests/zipmods.zip/covmodzip1.py ", report) self.assertIn("mycode.py ", report) - self.assertEqual(self.last_line_squeezed(report), "TOTAL 8 0 100%") + self.assertEqual(self.last_line_squeezed(report), "TOTAL 9 0 100%") def test_report_just_one(self): # Try reporting just one module + self.make_mycode() self.run_command("coverage run mycode.py") report = self.report_from_command("coverage report mycode.py") @@ -67,6 +77,7 @@ class SummaryTest(CoverageTest): def test_report_wildcard(self): # Try reporting using wildcards to get the modules. + self.make_mycode() self.run_command("coverage run mycode.py") report = self.report_from_command("coverage report my*.py") @@ -83,10 +94,9 @@ class SummaryTest(CoverageTest): def test_report_omitting(self): # Try reporting while omitting some modules + self.make_mycode() self.run_command("coverage run mycode.py") - report = self.report_from_command( - "coverage report --omit '%s/*'" % HERE - ) + report = self.report_from_command("coverage report --omit '%s/*'" % HERE) # Name Stmts Miss Cover # ------------------------------- @@ -101,6 +111,7 @@ class SummaryTest(CoverageTest): def test_report_including(self): # Try reporting while including some modules + self.make_mycode() self.run_command("coverage run mycode.py") report = self.report_from_command("coverage report --include=mycode*") @@ -133,8 +144,7 @@ class SummaryTest(CoverageTest): self.assertEqual(self.line_count(report), 3) self.assertIn("mybranch.py ", report) - self.assertEqual(self.last_line_squeezed(report), - "mybranch.py 5 0 2 1 86%") + self.assertEqual(self.last_line_squeezed(report), "mybranch.py 5 0 2 1 86%") def test_report_show_missing(self): self.make_file("mymissing.py", """\ @@ -245,19 +255,26 @@ class SummaryTest(CoverageTest): """) out = self.run_command("coverage run main.py") self.assertEqual(out, "z\n") - report = self.report_from_command("coverage report --skip-covered") + report = self.report_from_command("coverage report --skip-covered --fail-under=70") # Name Stmts Miss Cover # ------------------------------------ # not_covered.py 2 1 50% + # ------------------------------------ + # TOTAL 6 1 83% + # + # 1 file skipped due to complete coverage. - self.assertEqual(self.line_count(report), 3, report) + self.assertEqual(self.line_count(report), 7, report) squeezed = self.squeezed_lines(report) self.assertEqual(squeezed[2], "not_covered.py 2 1 50%") + self.assertEqual(squeezed[4], "TOTAL 6 1 83%") + self.assertEqual(squeezed[6], "1 file skipped due to complete coverage.") + self.assertEqual(self.last_command_status, 0) def test_report_skip_covered_branches(self): self.make_file("main.py", """ - import not_covered + import not_covered, covered def normal(z): if z: @@ -271,6 +288,11 @@ class SummaryTest(CoverageTest): print("n") not_covered(True) """) + self.make_file("covered.py", """ + def foo(): + pass + foo() + """) out = self.run_command("coverage run --branch main.py") self.assertEqual(out, "n\nz\n") report = self.report_from_command("coverage report --skip-covered") @@ -278,10 +300,16 @@ class SummaryTest(CoverageTest): # Name Stmts Miss Branch BrPart Cover # -------------------------------------------------- # not_covered.py 4 0 2 1 83% + # -------------------------------------------------- + # TOTAL 13 0 4 1 94% + # + # 2 files skipped due to complete coverage. - self.assertEqual(self.line_count(report), 3, report) + self.assertEqual(self.line_count(report), 7, report) squeezed = self.squeezed_lines(report) self.assertEqual(squeezed[2], "not_covered.py 4 0 2 1 83%") + self.assertEqual(squeezed[4], "TOTAL 13 0 4 1 94%") + self.assertEqual(squeezed[6], "2 files skipped due to complete coverage.") def test_report_skip_covered_branches_with_totals(self): self.make_file("main.py", """ @@ -313,41 +341,102 @@ class SummaryTest(CoverageTest): # also_not_run.py 2 1 0 0 50% # not_covered.py 4 0 2 1 83% # -------------------------------------------------- - # TOTAL 6 1 2 1 75% + # TOTAL 13 1 4 1 88% + # + # 1 file skipped due to complete coverage. - self.assertEqual(self.line_count(report), 6, report) + self.assertEqual(self.line_count(report), 8, report) squeezed = self.squeezed_lines(report) self.assertEqual(squeezed[2], "also_not_run.py 2 1 0 0 50%") self.assertEqual(squeezed[3], "not_covered.py 4 0 2 1 83%") - self.assertEqual(squeezed[5], "TOTAL 6 1 2 1 75%") + self.assertEqual(squeezed[5], "TOTAL 13 1 4 1 88%") + self.assertEqual(squeezed[7], "1 file skipped due to complete coverage.") + + def test_report_skip_covered_all_files_covered(self): + self.make_file("main.py", """ + def foo(): + pass + foo() + """) + out = self.run_command("coverage run --branch main.py") + self.assertEqual(out, "") + report = self.report_from_command("coverage report --skip-covered") + + # Name Stmts Miss Branch BrPart Cover + # ------------------------------------------- + # + # 1 file skipped due to complete coverage. + + self.assertEqual(self.line_count(report), 4, report) + squeezed = self.squeezed_lines(report) + self.assertEqual(squeezed[3], "1 file skipped due to complete coverage.") + + def test_report_skip_covered_no_data(self): + report = self.report_from_command("coverage report --skip-covered") + + # Name Stmts Miss Branch BrPart Cover + # ------------------------------------------- + # No data to report. + + self.assertEqual(self.line_count(report), 3, report) + squeezed = self.squeezed_lines(report) + self.assertEqual(squeezed[2], "No data to report.") def test_dotpy_not_python(self): # We run a .py file, and when reporting, we can't parse it as Python. # We should get an error message in the report. + self.make_mycode() self.run_command("coverage run mycode.py") self.make_file("mycode.py", "This isn't python at all!") report = self.report_from_command("coverage report mycode.py") - # pylint: disable=line-too-long # Name Stmts Miss Cover # ---------------------------- - # mycode NotPython: Couldn't parse '/tmp/test_cover/63354509363/mycode.py' as Python source: 'invalid syntax' at line 1 + # mycode NotPython: Couldn't parse '...' as Python source: 'invalid syntax' at line 1 + # No data to report. - last = self.last_line_squeezed(report) + last = self.squeezed_lines(report)[-2] # The actual file name varies run to run. last = re.sub(r"parse '.*mycode.py", "parse 'mycode.py", last) # The actual error message varies version to version last = re.sub(r": '.*' at", ": 'error' at", last) - self.assertEqual(last, - "mycode.py NotPython: " - "Couldn't parse 'mycode.py' as Python source: " - "'error' at line 1" - ) + self.assertEqual( + last, + "mycode.py NotPython: Couldn't parse 'mycode.py' as Python source: 'error' at line 1" + ) + + def test_accenteddotpy_not_python(self): + # We run a .py file with a non-ascii name, and when reporting, we can't + # parse it as Python. We should get an error message in the report. + + self.make_file(u"accented\xe2.py", "print('accented')") + self.run_command(u"coverage run accented\xe2.py") + self.make_file(u"accented\xe2.py", "This isn't python at all!") + report = self.report_from_command(u"coverage report accented\xe2.py") + + # Name Stmts Miss Cover + # ---------------------------- + # xxxx NotPython: Couldn't parse '...' as Python source: 'invalid syntax' at line 1 + # No data to report. + + last = self.squeezed_lines(report)[-2] + # The actual file name varies run to run. + last = re.sub(r"parse '.*(accented.*?\.py)", r"parse '\1", last) + # The actual error message varies version to version + last = re.sub(r": '.*' at", ": 'error' at", last) + expected = ( + u"accented\xe2.py NotPython: " + u"Couldn't parse 'accented\xe2.py' as Python source: 'error' at line 1" + ) + if env.PY2: + expected = expected.encode(output_encoding()) + self.assertEqual(last, expected) def test_dotpy_not_python_ignored(self): # We run a .py file, and when reporting, we can't parse it as Python, # but we've said to ignore errors, so there's no error reported. + self.make_mycode() self.run_command("coverage run mycode.py") self.make_file("mycode.py", "This isn't python at all!") report = self.report_from_command("coverage report -i mycode.py") @@ -355,7 +444,8 @@ class SummaryTest(CoverageTest): # Name Stmts Miss Cover # ---------------------------- - self.assertEqual(self.line_count(report), 2) + self.assertEqual(self.line_count(report), 3) + self.assertIn('No data to report.', report) def test_dothtml_not_python(self): # We run a .html file, and when reporting, we can't parse it as @@ -370,8 +460,10 @@ class SummaryTest(CoverageTest): # Name Stmts Miss Cover # ---------------------------- + # No data to report. - self.assertEqual(self.line_count(report), 2) + self.assertEqual(self.line_count(report), 3) + self.assertIn('No data to report.', report) def get_report(self, cov): """Get the report from `cov`, and canonicalize it.""" @@ -393,7 +485,7 @@ class SummaryTest(CoverageTest): self.make_file("main.py", """\ print("y") """) - cov = coverage.coverage(branch=True, source=["."]) + cov = coverage.Coverage(branch=True, source=["."]) cov.start() import main # pragma: nested # pylint: disable=import-error,unused-variable cov.stop() # pragma: nested @@ -402,7 +494,7 @@ class SummaryTest(CoverageTest): def run_TheCode_and_report_it(self): """A helper for the next few tests.""" - cov = coverage.coverage() + cov = coverage.Coverage() cov.start() import TheCode # pragma: nested # pylint: disable=import-error,unused-variable cov.stop() # pragma: nested @@ -437,7 +529,7 @@ class SummaryTest(CoverageTest): self.make_file("mod.pyw", """\ print("In mod.pyw") """) - cov = coverage.coverage() + cov = coverage.Coverage() cov.start() import start # pragma: nested # pylint: disable=import-error,unused-variable cov.stop() # pragma: nested @@ -457,7 +549,7 @@ class SummaryTest(CoverageTest): py_compile.compile("mod.py") # Run the program. - cov = coverage.coverage() + cov = coverage.Coverage() cov.start() import main # pragma: nested # pylint: disable=import-error,unused-variable cov.stop() # pragma: nested @@ -487,7 +579,7 @@ class SummaryTest(CoverageTest): os.rename(pycs[0], "mod.pyc") # Run the program. - cov = coverage.coverage() + cov = coverage.Coverage() cov.start() import main # pragma: nested # pylint: disable=import-error,unused-variable cov.stop() # pragma: nested @@ -515,7 +607,7 @@ class SummaryTest2(CoverageTest): def test_empty_files(self): # Shows that empty files like __init__.py are listed as having zero # statements, not one statement. - cov = coverage.coverage() + cov = coverage.Coverage() cov.start() import usepkgs # pragma: nested # pylint: disable=import-error,unused-variable cov.stop() # pragma: nested @@ -525,7 +617,7 @@ class SummaryTest2(CoverageTest): report = repout.getvalue().replace('\\', '/') report = re.sub(r"\s+", " ", report) - self.assertIn("tests/modules/pkg1/__init__.py 1 0 100%", report) + self.assertIn("tests/modules/pkg1/__init__.py 2 0 100%", report) self.assertIn("tests/modules/pkg2/__init__.py 0 0 100%", report) @@ -544,7 +636,7 @@ class ReportingReturnValueTest(CoverageTest): g = 7 """) - cov = coverage.coverage() + cov = coverage.Coverage() self.start_import_stop(cov, "doit") return cov diff --git a/tests/test_templite.py b/tests/test_templite.py index 2b64e4e3..2f9b2dbd 100644 --- a/tests/test_templite.py +++ b/tests/test_templite.py @@ -1,4 +1,7 @@ # -*- coding: utf8 -*- +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Tests for coverage.templite.""" import re diff --git a/tests/test_testing.py b/tests/test_testing.py index 08ff257d..9fc7f11d 100644 --- a/tests/test_testing.py +++ b/tests/test_testing.py @@ -1,14 +1,20 @@ # -*- coding: utf-8 -*- +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Tests that our test infrastructure is really working!""" import datetime import os import sys +import coverage from coverage.backunittest import TestCase from coverage.backward import to_bytes +from coverage.files import actual_path +from coverage.test_helpers import EnvironmentAwareMixin, TempDirMixin -from tests.coveragetest import TempDirMixin, CoverageTest +from tests.coveragetest import CoverageTest class TestingTest(TestCase): @@ -60,9 +66,48 @@ class TempDirMixinTest(TempDirMixin, TestCase): self.assertEqual(text, to_bytes("tabblo: «ταБЬℓσ»")) +class EnvironmentAwareMixinTest(EnvironmentAwareMixin, TestCase): + """Tests of test_helpers.EnvironmentAwareMixin.""" + + def test_setting_and_cleaning_env_vars(self): + # The before state. + # Not sure what environment variables are available in all of our + # different testing environments, so try a bunch. + for envvar in ["HOME", "HOMEDIR", "USER", "SYSTEMDRIVE", "TEMP"]: # pragma: part covered + if envvar in os.environ: + original_text = os.environ[envvar] + new_text = "Some Strange Text" + break + # pylint: disable=undefined-loop-variable + self.assertNotEqual(original_text, new_text) + self.assertNotIn("XYZZY_PLUGH", os.environ) + + # Change the environment. + self.set_environ(envvar, new_text) + self.set_environ("XYZZY_PLUGH", "Vogon") + + self.assertEqual(os.environ[envvar], new_text) + self.assertEqual(os.environ["XYZZY_PLUGH"], "Vogon") + + # Do the clean ups early. + self.doCleanups() + + # The environment should be restored. + self.assertEqual(os.environ[envvar], original_text) + self.assertNotIn("XYZZY_PLUGH", os.environ) + + class CoverageTestTest(CoverageTest): """Test the methods in `CoverageTest`.""" + def test_arcz_to_arcs(self): + self.assertEqual(self.arcz_to_arcs(".1 12 2."), [(-1, 1), (1, 2), (2, -1)]) + self.assertEqual(self.arcz_to_arcs("-11 12 2-5"), [(-1, 1), (1, 2), (2, -5)]) + self.assertEqual( + self.arcz_to_arcs("-QA CB IT Z-A"), + [(-26, 10), (12, 11), (18, 29), (35, -10)] + ) + def test_file_exists(self): self.make_file("whoville.txt", "We are here!") self.assert_exists("whoville.txt") @@ -102,6 +147,44 @@ class CoverageTestTest(CoverageTest): with self.assertRaises(AssertionError): self.assert_recent_datetime(now_delta(1), seconds=120) + def test_assert_warnings(self): + cov = coverage.Coverage() + + # Make a warning, it should catch it properly. + with self.assert_warnings(cov, ["Hello there!"]): + cov._warn("Hello there!") + + # The expected warnings are regexes. + with self.assert_warnings(cov, ["Hello.*!"]): + cov._warn("Hello there!") + + # There can be a bunch of actual warnings. + with self.assert_warnings(cov, ["Hello.*!"]): + cov._warn("You there?") + cov._warn("Hello there!") + + # There can be a bunch of expected warnings. + with self.assert_warnings(cov, ["Hello.*!", "You"]): + cov._warn("You there?") + cov._warn("Hello there!") + + # But if there are a bunch of expected warnings, they have to all happen. + warn_regex = r"Didn't find warning 'You' in \['Hello there!'\]" + with self.assertRaisesRegex(AssertionError, warn_regex): + with self.assert_warnings(cov, ["Hello.*!", "You"]): + cov._warn("Hello there!") + + # Make a different warning than expected, it should raise an assertion. + warn_regex = r"Didn't find warning 'Not me' in \['Hello there!'\]" + with self.assertRaisesRegex(AssertionError, warn_regex): + with self.assert_warnings(cov, ["Not me"]): + cov._warn("Hello there!") + + # assert_warnings shouldn't hide a real exception. + with self.assertRaises(ZeroDivisionError): + with self.assert_warnings(cov, ["Hello there!"]): + raise ZeroDivisionError("oops") + def test_sub_python_is_this_python(self): # Try it with a Python command. os.environ['COV_FOOBAR'] = 'XYZZY' @@ -112,17 +195,17 @@ class CoverageTestTest(CoverageTest): print(os.environ['COV_FOOBAR']) """) out = self.run_command("python showme.py").splitlines() - self.assertEqual(out[0], sys.executable) + self.assertEqual(actual_path(out[0]), actual_path(sys.executable)) self.assertEqual(out[1], os.__file__) self.assertEqual(out[2], 'XYZZY') # Try it with a "coverage debug sys" command. out = self.run_command("coverage debug sys").splitlines() # "environment: COV_FOOBAR = XYZZY" or "COV_FOOBAR = XYZZY" - executable = next(l for l in out if "executable:" in l) + executable = next(l for l in out if "executable:" in l) # pragma: part covered executable = executable.split(":", 1)[1].strip() self.assertTrue(same_python_executable(executable, sys.executable)) - environ = next(l for l in out if "COV_FOOBAR" in l) + environ = next(l for l in out if "COV_FOOBAR" in l) # pragma: part covered _, _, environ = environ.rpartition(":") self.assertEqual(environ.strip(), "COV_FOOBAR = XYZZY") diff --git a/tests/test_xml.py b/tests/test_xml.py index b9b36efb..60cdd71d 100644 --- a/tests/test_xml.py +++ b/tests/test_xml.py @@ -1,11 +1,18 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Tests for XML reports from coverage.py.""" import os +import os.path import re import coverage +from coverage.files import abs_file from tests.coveragetest import CoverageTest +from tests.goldtest import CoverageGoldTest +from tests.goldtest import change_dir, compare class XmlTestHelpers(CoverageTest): @@ -21,7 +28,7 @@ class XmlTestHelpers(CoverageTest): self.make_file("sub/__init__.py") self.make_file("sub/doit.py", "print('doit!')") self.make_file("main.py", "import sub.doit") - cov = coverage.coverage() + cov = coverage.Coverage() self.start_import_stop(cov, "main") return cov @@ -30,7 +37,7 @@ class XmlTestHelpers(CoverageTest): Makes `width` directories, named d0 .. d{width-1}. Each directory has __init__.py, and `width` files, named f0.py .. f{width-1}.py. Each - directory also has `width` subdirectories, in the same fashion, until + directory also has `width` sub-directories, in the same fashion, until a depth of `depth` is reached. """ @@ -88,7 +95,7 @@ class XmlReportTest(XmlTestHelpers, CoverageTest): # Written while investigating a bug, might as well keep it. # https://bitbucket.org/ned/coveragepy/issue/208 self.make_file("innocuous.py", "a = 4") - cov = coverage.coverage() + cov = coverage.Coverage() self.start_import_stop(cov, "innocuous") os.remove("innocuous.py") cov.xml_report(ignore_errors=True) @@ -120,7 +127,7 @@ class XmlReportTest(XmlTestHelpers, CoverageTest): # Used to raise a zero division error: # https://bitbucket.org/ned/coveragepy/issue/250 self.make_file("empty.py", "") - cov = coverage.coverage() + cov = coverage.Coverage() empty = self.start_import_stop(cov, "empty") cov.xml_report([empty], outfile="-") xml = self.stdout() @@ -136,6 +143,47 @@ class XmlReportTest(XmlTestHelpers, CoverageTest): init_line = re_line(xml, 'filename="sub/__init__.py"') self.assertIn('line-rate="1"', init_line) + def assert_source(self, xml, src): + """Assert that the XML has a <source> element with `src`.""" + src = abs_file(src) + self.assertRegex(xml, r'<source>\s*{0}\s*</source>'.format(re.escape(src))) + + def test_curdir_source(self): + # With no source= option, the XML report should explain that the source + # is in the current directory. + cov = self.run_doit() + cov.xml_report(outfile="-") + xml = self.stdout() + self.assert_source(xml, ".") + self.assertEqual(xml.count('<source>'), 1) + + def test_deep_source(self): + # When using source=, the XML report needs to mention those directories + # in the <source> elements. + # https://bitbucket.org/ned/coveragepy/issues/439/incorrect-cobertura-file-sources-generated + self.make_file("src/main/foo.py", "a = 1") + self.make_file("also/over/there/bar.py", "b = 2") + cov = coverage.Coverage(source=["src/main", "also/over/there", "not/really"]) + cov.start() + mod_foo = self.import_local_file("foo", "src/main/foo.py") + mod_bar = self.import_local_file("bar", "also/over/there/bar.py") + cov.stop() + cov.xml_report([mod_foo, mod_bar], outfile="-") + xml = self.stdout() + + self.assert_source(xml, "src/main") + self.assert_source(xml, "also/over/there") + self.assertEqual(xml.count('<source>'), 2) + + self.assertIn( + '<class branch-rate="0" complexity="0" filename="foo.py" line-rate="1" name="foo.py">', + xml + ) + self.assertIn( + '<class branch-rate="0" complexity="0" filename="bar.py" line-rate="1" name="bar.py">', + xml + ) + class XmlPackageStructureTest(XmlTestHelpers, CoverageTest): """Tests about the package structure reported in the coverage.xml file.""" @@ -160,7 +208,7 @@ class XmlPackageStructureTest(XmlTestHelpers, CoverageTest): self.make_file("main.py", """\ from d0.d0 import f0 """) - cov = coverage.coverage(source=".") + cov = coverage.Coverage(source=".") self.start_import_stop(cov, "main") self.assert_package_and_class_tags(cov, """\ <package name="."> @@ -178,10 +226,10 @@ class XmlPackageStructureTest(XmlTestHelpers, CoverageTest): self.make_file("main.py", """\ from d0.d0 import f0 """) - cov = coverage.coverage(source=".") + cov = coverage.Coverage(source=".") self.start_import_stop(cov, "main") - cov.config["xml:package_depth"] = 1 + cov.set_option("xml:package_depth", 1) self.assert_package_and_class_tags(cov, """\ <package name="."> <class filename="main.py" name="main.py"> @@ -194,7 +242,7 @@ class XmlPackageStructureTest(XmlTestHelpers, CoverageTest): <class filename="d0/f0.py" name="f0.py"> """) - cov.config["xml:package_depth"] = 2 + cov.set_option("xml:package_depth", 2) self.assert_package_and_class_tags(cov, """\ <package name="."> <class filename="main.py" name="main.py"> @@ -208,7 +256,7 @@ class XmlPackageStructureTest(XmlTestHelpers, CoverageTest): <class filename="d0/d0/f0.py" name="f0.py"> """) - cov.config["xml:package_depth"] = 3 + cov.set_option("xml:package_depth", 3) self.assert_package_and_class_tags(cov, """\ <package name="."> <class filename="main.py" name="main.py"> @@ -249,3 +297,67 @@ def clean(text, scrub=None): text = re.sub(r"(?m)^\s+", "", text) text = re.sub(r"\\", "/", text) return text + + +class XmlGoldTest(CoverageGoldTest): + """Tests of XML reporting that use gold files.""" + + # TODO: this should move out of html. + root_dir = 'tests/farm/html' + + def test_a_xml_1(self): + self.output_dir("out/xml_1") + + with change_dir("src"): + # pylint: disable=import-error + cov = coverage.Coverage() + cov.start() + import a # pragma: nested + cov.stop() # pragma: nested + cov.xml_report(a, outfile="../out/xml_1/coverage.xml") + source_path = coverage.files.relative_directory().rstrip(r"\/") + + compare("gold_x_xml", "out/xml_1", scrubs=[ + (r' timestamp="\d+"', ' timestamp="TIMESTAMP"'), + (r' version="[-.\w]+"', ' version="VERSION"'), + (r'<source>\s*.*?\s*</source>', '<source>%s</source>' % source_path), + (r'/coverage.readthedocs.org/?[-.\w/]*', '/coverage.readthedocs.org/VER'), + ]) + + def test_a_xml_2(self): + self.output_dir("out/xml_2") + + with change_dir("src"): + # pylint: disable=import-error + cov = coverage.Coverage(config_file="run_a_xml_2.ini") + cov.start() + import a # pragma: nested + cov.stop() # pragma: nested + cov.xml_report(a) + source_path = coverage.files.relative_directory().rstrip(r"\/") + + compare("gold_x_xml", "out/xml_2", scrubs=[ + (r' timestamp="\d+"', ' timestamp="TIMESTAMP"'), + (r' version="[-.\w]+"', ' version="VERSION"'), + (r'<source>\s*.*?\s*</source>', '<source>%s</source>' % source_path), + (r'/coverage.readthedocs.org/?[-.\w/]*', '/coverage.readthedocs.org/VER'), + ]) + + def test_y_xml_branch(self): + self.output_dir("out/y_xml_branch") + + with change_dir("src"): + # pylint: disable=import-error + cov = coverage.Coverage(branch=True) + cov.start() + import y # pragma: nested + cov.stop() # pragma: nested + cov.xml_report(y, outfile="../out/y_xml_branch/coverage.xml") + source_path = coverage.files.relative_directory().rstrip(r"\/") + + compare("gold_y_xml_branch", "out/y_xml_branch", scrubs=[ + (r' timestamp="\d+"', ' timestamp="TIMESTAMP"'), + (r' version="[-.\w]+"', ' version="VERSION"'), + (r'<source>\s*.*?\s*</source>', '<source>%s</source>' % source_path), + (r'/coverage.readthedocs.org/?[-.\w/]*', '/coverage.readthedocs.org/VER'), + ]) diff --git a/tests/try_execfile.py b/tests/try_execfile.py index e0b79b48..70905071 100644 --- a/tests/try_execfile.py +++ b/tests/try_execfile.py @@ -1,3 +1,6 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Test file for run_python_file. This file is executed two ways:: diff --git a/tox-new.ini b/tox-new.ini new file mode 100644 index 00000000..aaca6a4d --- /dev/null +++ b/tox-new.ini @@ -0,0 +1,63 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +# An experiment in using tox to install the sdist, and do the pytracer/ctracer +# split. Doesn't yet work because the working tree is in the import path, so +# "import coverage" finds the working tree instead of the sdist-installed code. +# This can be fixed one of two ways: +# +# 1. By changing to a "src" layout, so that "import coverage" won't work in the +# working tree, or +# +# 2. By removing the "__init__.py" from the tests directory, so that nose won't +# add the working tree to the path. This will also mean changing a number of +# import statements in the tests directory. + +[tox] +envlist = py{26,27,33,34,35}-{c,py}tracer, pypy{24,26,3_24}-pytracer +skip_missing_interpreters = True + +[testenv] +commands = + # Create tests/zipmods.zip, install the egg1 egg + python igor.py zip_mods install_egg + + # Remove the C extension so that we can test the PyTracer + pytracer: python igor.py remove_extension + pytracer: python igor.py test_with_tracer py {posargs} + + ctracer: python igor.py test_with_tracer c {posargs} + +deps = + # https://requires.io/github/nedbat/coveragepy/requirements/ + nose==1.3.7 + mock==1.3.0 + PyContracts==1.7.6 + py26: unittest2==1.1.0 + py{26,27}: gevent==1.0.2 + py{26,27}: eventlet==0.17.4 + py{26,27,33,34,35}: greenlet==0.4.9 + +passenv = COVERAGE_* + +[testenv:pypy] +basepython = pypy + +[testenv:pypy24] +basepython = pypy2.4 + +[testenv:pypy26] +basepython = pypy2.6 + +[testenv:pypy3_24] +basepython = pypy3-2.4 + + +# Yes, pep8 will read its settings from tox.ini! +[pep8] +# E265: block comment should start with '# ' +# E301 expected 1 blank line, found 0 +# E401 multiple imports on one line +# The rest are the default ignored warnings. +ignore = E265,E123,E133,E226,E241,E242,E301,E401 +max-line-length = 100 @@ -1,50 +1,74 @@ -# Tox (http://tox.testrun.org/) is a tool for running tests -# in multiple virtualenvs. This configuration file will run the -# test suite on all supported python versions. To use it, "pip install tox" -# and then run "tox" from this directory. +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt [tox] -envlist = py26, py27, py33, py34, py35, pypy24, pypy3_24 +envlist = py{26,27,33,34,35}, pypy{24,26,40,3_24}, doc skip_missing_interpreters = True [testenv] +usedevelop = True + +deps = + # https://requires.io/github/nedbat/coveragepy/requirements/ + nose==1.3.7 + mock==1.3.0 + PyContracts==1.7.9 + py26: unittest2==1.1.0 + py{26,27,33,34,35}: gevent==1.1rc1 + py{26,27,33,34}: eventlet==0.17.4 + py{26,27,33,34,35}: greenlet==0.4.9 + +passenv = * +setenv = + pypy,pypy{24,26,40,3_24}: COVERAGE_NO_EXTENSION=no C extension under PyPy + commands = - {envpython} setup.py --quiet clean develop + python setup.py --quiet clean develop # Create tests/zipmods.zip # Install the egg1 egg # Remove the C extension so that we can test the PyTracer - {envpython} igor.py zip_mods install_egg remove_extension + python igor.py zip_mods install_egg remove_extension # Test with the PyTracer - {envpython} igor.py test_with_tracer py {posargs} + python igor.py test_with_tracer py {posargs} # Build the C extension and test with the CTracer - {envpython} setup.py --quiet build_ext --inplace - {envpython} igor.py test_with_tracer c {posargs} - -deps = - nose - mock - py26: unittest2 - py26,py27: gevent - py26,py27: eventlet - py26,py27,py33,py34,py35: greenlet - -setenv = - pypy24,pypy3_24: COVERAGE_NO_EXTENSION=no C extensions under PyPy + python setup.py --quiet build_ext --inplace + python igor.py test_with_tracer c {posargs} -usedevelop = True +[testenv:pypy] +basepython = pypy [testenv:pypy24] basepython = pypy2.4 +[testenv:pypy26] +basepython = pypy2.6 + [testenv:pypy3_24] basepython = pypy3-2.4 +[testenv:pypy40] +basepython = pypy4.0 + +[testenv:doc] +# Build the docs so we know if they are successful. We build twice: once with +# -q to get all warnings, and once with -QW to get a success/fail status +# return. +deps = -rdoc/requirements.pip +commands = + sphinx-build -aEnq doc doc/_build/html + sphinx-build -aEnQW doc doc/_build/html + rst2html.py --strict CHANGES.rst doc/_build/trash + rst2html.py --strict README.rst doc/_build/trash # Yes, pep8 will read its settings from tox.ini! [pep8] -# E265: block comment should start with '# ' +# E265 block comment should start with '# ' +# E266 too many leading '#' for block comment +# E301 expected 1 blank line, found 0 +# E401 multiple imports on one line # The rest are the default ignored warnings. -ignore = E265,E123,E133,E226,E241,E242 +ignore = E265,E266,E123,E133,E226,E241,E242,E301,E401 +max-line-length = 100 diff --git a/tox_wheels.ini b/tox_wheels.ini new file mode 100644 index 00000000..f956183d --- /dev/null +++ b/tox_wheels.ini @@ -0,0 +1,13 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +[tox] +envlist = py{26,27,33,34,35} +toxworkdir = {toxinidir}/.tox_kits + +[testenv] +deps = + -rrequirements/wheel.pip + +commands = + python setup.py bdist_wheel {posargs} diff --git a/tox_winkits.ini b/tox_winkits.ini deleted file mode 100644 index 54e8779d..00000000 --- a/tox_winkits.ini +++ /dev/null @@ -1,7 +0,0 @@ -[tox] -envlist = py26, py27, py33, py34 -toxworkdir = {toxinidir}/.tox_kits - -[testenv] -commands = - {envpython} setup.py bdist_wininst {posargs} |
