Commits

holger krekel  committed 4e80126

remove all code from py-trunk and prepare a package that
requires the now split out pytest, pylib, pycmd packages.

  • Participants
  • Parent commits 4da2f29

Comments (0)

Files changed (308)

File AUTHORS

-Holger Krekel, holger at merlinux eu
-Benjamin Peterson, benjamin at python org
-Ronny Pfannschmidt, Ronny.Pfannschmidt at gmx de
-Guido Wesdorp, johnny at johnnydebris net 
-Samuele Pedroni, pedronis at openend se 
-Carl Friedrich Bolz, cfbolz at gmx de
-Armin Rigo, arigo at tunes org 
-Maciek Fijalkowski, fijal at genesilico pl
-Brian Dorsey, briandorsey at gmail com 
-merlinux GmbH, Germany, office at merlinux eu
-
-Contributors include:: 
-
-Ross Lawley
-Ralf Schmitt
-Chris Lamb 
-Harald Armin Massa
-Martijn Faassen
-Ian Bicking 
-Jan Balster
-Grig Gheorghiu
-Bob Ippolito
-Christian Tismer

File CHANGELOG

-
-Changes between 1.3.4 and 1.4.0.dev0
-==================================================
-
-- fix issue126 - introduce py.test.set_trace() to trace execution via
-  PDB during the running of tests even if capturing is ongoing.
-- fix issue123 - new "python -m py.test" invocation for py.test
-  (requires Python 2.5 or above)
-- fix issue124 - make reporting more resilient against tests opening
-  files on filedescriptor 1 (stdout).
-- fix issue109 - sibling conftest.py files will not be loaded.
-  (and Directory collectors cannot be customized anymore from a Directory's
-  conftest.py - this needs to happen at least one level up).
-- introduce (customizable) assertion failure representations and enhance
-  output on assertion failures for comparisons and other cases (Floris Bruynooghe)
-- nose-plugin: pass through type-signature failures in setup/teardown
-  functions instead of not calling them (Ed Singleton)
-- major refactoring of internal collection handling
-- majorly reduce py.test core code, shift function/python testing to own plugin
-- fix issue88 (finding custom test nodes from command line arg)
-- introduce py.builtin.any()
-
-Changes between 1.3.3 and 1.3.4
-==================================================
-
-- fix issue111: improve install documentation for windows
-- fix issue119: fix custom collectability of __init__.py as a module
-- fix issue116: --doctestmodules work with __init__.py files as well
-- fix issue115: unify internal exception passthrough/catching/GeneratorExit
-- fix issue118: new --tb=native for presenting cpython-standard exceptions
-
-Changes between 1.3.2 and 1.3.3
-==================================================
-
-- fix issue113: assertion representation problem with triple-quoted strings
-  (and possibly other cases)
-- make conftest loading detect that a conftest file with the same
-  content was already loaded, avoids surprises in nested directory structures
-  which can be produced e.g. by Hudson. It probably removes the need to use
-  --confcutdir in most cases.
-- fix terminal coloring for win32
-  (thanks Michael Foord for reporting)
-- fix weirdness: make terminal width detection work on stdout instead of stdin
-  (thanks Armin Ronacher for reporting)
-- remove trailing whitespace in all py/text distribution files
-
-Changes between 1.3.1 and 1.3.2
-==================================================
-
-New features
-++++++++++++++++++
-
-- fix issue103:  introduce py.test.raises as context manager, examples::
-
-    with py.test.raises(ZeroDivisionError):
-        x = 0
-        1 / x
-
-    with py.test.raises(RuntimeError) as excinfo:
-        call_something()
-
-    # you may do extra checks on excinfo.value|type|traceback here
-
-  (thanks Ronny Pfannschmidt)
-
-- Funcarg factories can now dynamically apply a marker to a
-  test invocation.  This is for example useful if a factory
-  provides parameters to a test which are expected-to-fail::
-
-    def pytest_funcarg__arg(request):
-        request.applymarker(py.test.mark.xfail(reason="flaky config"))
-        ...
-
-    def test_function(arg):
-        ...
-
-- improved error reporting on collection and import errors. This makes
-  use of a more general mechanism, namely that for custom test item/collect
-  nodes ``node.repr_failure(excinfo)`` is now uniformly called so that you can
-  override it to return a string error representation of your choice
-  which is going to be reported as a (red) string.
-
-- introduce '--junitprefix=STR' option to prepend a prefix
-  to all reports in the junitxml file.
-
-Bug fixes / Maintenance
-++++++++++++++++++++++++++
-
-- make tests and the ``pytest_recwarn`` plugin in particular fully compatible
-  to Python2.7 (if you use the ``recwarn`` funcarg warnings will be enabled so that
-  you can properly check for their existence in a cross-python manner).
-- refine --pdb: ignore xfailed tests, unify its TB-reporting and
-  don't display failures again at the end.
-- fix assertion interpretation with the ** operator (thanks Benjamin Peterson)
-- fix issue105 assignment on the same line as a failing assertion (thanks Benjamin Peterson)
-- fix issue104 proper escaping for test names in junitxml plugin (thanks anonymous)
-- fix issue57 -f|--looponfail to work with xpassing tests (thanks Ronny)
-- fix issue92 collectonly reporter and --pastebin (thanks Benjamin Peterson)
-- fix py.code.compile(source) to generate unique filenames
-- fix assertion re-interp problems on PyPy, by defering code
-  compilation to the (overridable) Frame.eval class. (thanks Amaury Forgeot)
-- fix py.path.local.pyimport() to work with directories
-- streamline py.path.local.mkdtemp implementation and usage
-- don't print empty lines when showing junitxml-filename
-- add optional boolean ignore_errors parameter to py.path.local.remove
-- fix terminal writing on win32/python2.4
-- py.process.cmdexec() now tries harder to return properly encoded unicode objects
-  on all python versions
-- install plain py.test/py.which scripts also for Jython, this helps to
-  get canonical script paths in virtualenv situations
-- make path.bestrelpath(path) return ".", note that when calling
-  X.bestrelpath the assumption is that X is a directory.
-- make initial conftest discovery ignore "--" prefixed arguments
-- fix resultlog plugin when used in an multicpu/multihost xdist situation
-  (thanks Jakub Gustak)
-- perform distributed testing related reporting in the xdist-plugin
-  rather than having dist-related code in the generic py.test
-  distribution
-- fix homedir detection on Windows
-- ship distribute_setup.py version 0.6.13
-
-Changes between 1.3.0 and 1.3.1
-==================================================
-
-New features
-++++++++++++++++++
-
-- issue91: introduce new py.test.xfail(reason) helper
-  to imperatively mark a test as expected to fail. Can
-  be used from within setup and test functions. This is
-  useful especially for parametrized tests when certain
-  configurations are expected-to-fail.  In this case the
-  declarative approach with the @py.test.mark.xfail cannot
-  be used as it would mark all configurations as xfail.
-
-- issue102: introduce new --maxfail=NUM option to stop
-  test runs after NUM failures.  This is a generalization
-  of the '-x' or '--exitfirst' option which is now equivalent
-  to '--maxfail=1'.  Both '-x' and '--maxfail' will
-  now also print a line near the end indicating the Interruption.
-
-- issue89: allow py.test.mark decorators to be used on classes
-  (class decorators were introduced with python2.6) and
-  also allow to have multiple markers applied at class/module level
-  by specifying a list.
-
-- improve and refine letter reporting in the progress bar:
-  .  pass
-  f  failed test
-  s  skipped tests (reminder: use for dependency/platform mismatch only)
-  x  xfailed test (test that was expected to fail)
-  X  xpassed test (test that was expected to fail but passed)
-
-  You can use any combination of 'fsxX' with the '-r' extended
-  reporting option. The xfail/xpass results will show up as
-  skipped tests in the junitxml output - which also fixes
-  issue99.
-
-- make py.test.cmdline.main() return the exitstatus instead of raising
-  SystemExit and also allow it to be called multiple times.  This of
-  course requires that your application and tests are properly teared
-  down and don't have global state.
-
-Fixes / Maintenance
-++++++++++++++++++++++
-
-- improved traceback presentation:
-  - improved and unified reporting for "--tb=short" option
-  - Errors during test module imports are much shorter, (using --tb=short style)
-  - raises shows shorter more relevant tracebacks
-  - --fulltrace now more systematically makes traces longer / inhibits cutting
-
-- improve support for raises and other dynamically compiled code by
-  manipulating python's linecache.cache instead of the previous
-  rather hacky way of creating custom code objects.  This makes
-  it seemlessly work on Jython and PyPy where it previously didn't.
-
-- fix issue96: make capturing more resilient against Control-C
-  interruptions (involved somewhat substantial refactoring
-  to the underlying capturing functionality to avoid race
-  conditions).
-
-- fix chaining of conditional skipif/xfail decorators - so it works now
-  as expected to use multiple @py.test.mark.skipif(condition) decorators,
-  including specific reporting which of the conditions lead to skipping.
-
-- fix issue95: late-import zlib so that it's not required
-  for general py.test startup.
-
-- fix issue94: make reporting more robust against bogus source code
-  (and internally be more careful when presenting unexpected byte sequences)
-
-
-Changes between 1.2.1 and 1.3.0
-==================================================
-
-- deprecate --report option in favour of a new shorter and easier to
-  remember -r option: it takes a string argument consisting of any
-  combination of 'xfsX' characters.  They relate to the single chars
-  you see during the dotted progress printing and will print an extra line
-  per test at the end of the test run.  This extra line indicates the exact
-  position or test ID that you directly paste to the py.test cmdline in order
-  to re-run a particular test.
-
-- allow external plugins to register new hooks via the new
-  pytest_addhooks(pluginmanager) hook.  The new release of
-  the pytest-xdist plugin for distributed and looponfailing
-  testing requires this feature.
-
-- add a new pytest_ignore_collect(path, config) hook to allow projects and
-  plugins to define exclusion behaviour for their directory structure -
-  for example you may define in a conftest.py this method::
-
-        def pytest_ignore_collect(path):
-            return path.check(link=1)
-
-  to prevent even a collection try of any tests in symlinked dirs.
-
-- new pytest_pycollect_makemodule(path, parent) hook for
-  allowing customization of the Module collection object for a
-  matching test module.
-
-- extend and refine xfail mechanism:
-  ``@py.test.mark.xfail(run=False)`` do not run the decorated test
-  ``@py.test.mark.xfail(reason="...")`` prints the reason string in xfail summaries
-  specifiying ``--runxfail`` on command line virtually ignores xfail markers
-
-- expose (previously internal) commonly useful methods:
-  py.io.get_terminal_with() -> return terminal width
-  py.io.ansi_print(...) -> print colored/bold text on linux/win32
-  py.io.saferepr(obj) -> return limited representation string
-
-- expose test outcome related exceptions as py.test.skip.Exception,
-  py.test.raises.Exception etc., useful mostly for plugins
-  doing special outcome interpretation/tweaking
-
-- (issue85) fix junitxml plugin to handle tests with non-ascii output
-
-- fix/refine python3 compatibility (thanks Benjamin Peterson)
-
-- fixes for making the jython/win32 combination work, note however:
-  jython2.5.1/win32 does not provide a command line launcher, see
-  http://bugs.jython.org/issue1491 . See pylib install documentation
-  for how to work around.
-
-- fixes for handling of unicode exception values and unprintable objects
-
-- (issue87) fix unboundlocal error in assertionold code
-
-- (issue86) improve documentation for looponfailing
-
-- refine IO capturing: stdin-redirect pseudo-file now has a NOP close() method
-
-- ship distribute_setup.py version 0.6.10
-
-- added links to the new capturelog and coverage plugins
-
-
-Changes between 1.2.1 and 1.2.0
-=====================================
-
-- refined usage and options for "py.cleanup"::
-
-    py.cleanup     # remove "*.pyc" and "*$py.class" (jython) files
-    py.cleanup -e .swp -e .cache # also remove files with these extensions
-    py.cleanup -s  # remove "build" and "dist" directory next to setup.py files
-    py.cleanup -d  # also remove empty directories
-    py.cleanup -a  # synonym for "-s -d -e 'pip-log.txt'"
-    py.cleanup -n  # dry run, only show what would be removed
-
-- add a new option "py.test --funcargs" which shows available funcargs
-  and their help strings (docstrings on their respective factory function)
-  for a given test path
-
-- display a short and concise traceback if a funcarg lookup fails
-
-- early-load "conftest.py" files in non-dot first-level sub directories.
-  allows to conveniently keep and access test-related options in a ``test``
-  subdir and still add command line options.
-
-- fix issue67: new super-short traceback-printing option: "--tb=line" will print a single line for each failing (python) test indicating its filename, lineno and the failure value
-
-- fix issue78: always call python-level teardown functions even if the
-  according setup failed.  This includes refinements for calling setup_module/class functions
-  which will now only be called once instead of the previous behaviour where they'd be called
-  multiple times if they raise an exception (including a Skipped exception).  Any exception
-  will be re-corded and associated with all tests in the according module/class scope.
-
-- fix issue63: assume <40 columns to be a bogus terminal width, default to 80
-
-- fix pdb debugging to be in the correct frame on raises-related errors
-
-- update apipkg.py to fix an issue where recursive imports might
-  unnecessarily break importing
-
-- fix plugin links
-
-Changes between 1.2 and 1.1.1
-=====================================
-
-- moved dist/looponfailing from py.test core into a new
-  separately released pytest-xdist plugin.
-
-- new junitxml plugin: --junitxml=path will generate a junit style xml file
-  which is processable e.g. by the Hudson CI system.
-
-- new option: --genscript=path will generate a standalone py.test script
-  which will not need any libraries installed.  thanks to Ralf Schmitt.
-
-- new option: --ignore will prevent specified path from collection.
-  Can be specified multiple times.
-
-- new option: --confcutdir=dir will make py.test only consider conftest
-  files that are relative to the specified dir.
-
-- new funcarg: "pytestconfig" is the pytest config object for access
-  to command line args and can now be easily used in a test.
-
-- install 'py.test' and `py.which` with a ``-$VERSION`` suffix to
-  disambiguate between Python3, python2.X, Jython and PyPy installed versions.
-
-- new "pytestconfig" funcarg allows access to test config object
-
-- new "pytest_report_header" hook can return additional lines
-  to be displayed at the header of a test run.
-
-- (experimental) allow "py.test path::name1::name2::..." for pointing
-  to a test within a test collection directly.  This might eventually
-  evolve as a full substitute to "-k" specifications.
-
-- streamlined plugin loading: order is now as documented in
-  customize.html: setuptools, ENV, commandline, conftest.
-  also setuptools entry point names are turned to canonical namees ("pytest_*")
-
-- automatically skip tests that need 'capfd' but have no os.dup
-
-- allow pytest_generate_tests to be defined in classes as well
-
-- deprecate usage of 'disabled' attribute in favour of pytestmark
-- deprecate definition of Directory, Module, Class and Function nodes
-  in conftest.py files.  Use pytest collect hooks instead.
-
-- collection/item node specific runtest/collect hooks are only called exactly
-  on matching conftest.py files, i.e. ones which are exactly below
-  the filesystem path of an item
-
-- change: the first pytest_collect_directory hook to return something
-  will now prevent further hooks to be called.
-
-- change: figleaf plugin now requires --figleaf to run.  Also
-  change its long command line options to be a bit shorter (see py.test -h).
-
-- change: pytest doctest plugin is now enabled by default and has a
-  new option --doctest-glob to set a pattern for file matches.
-
-- change: remove internal py._* helper vars, only keep py._pydir
-
-- robustify capturing to survive if custom pytest_runtest_setup
-  code failed and prevented the capturing setup code from running.
-
-- make py.test.* helpers provided by default plugins visible early -
-  works transparently both for pydoc and for interactive sessions
-  which will regularly see e.g. py.test.mark and py.test.importorskip.
-
-- simplify internal plugin manager machinery
-- simplify internal collection tree by introducing a RootCollector node
-
-- fix assert reinterpreation that sees a call containing "keyword=..."
-
-- fix issue66: invoke pytest_sessionstart and pytest_sessionfinish
-  hooks on slaves during dist-testing, report module/session teardown
-  hooks correctly.
-
-- fix issue65: properly handle dist-testing if no
-  execnet/py lib installed remotely.
-
-- skip some install-tests if no execnet is available
-
-- fix docs, fix internal bin/ script generation
-
-
-Changes between 1.1.1 and 1.1.0
-=====================================
-
-- introduce automatic plugin registration via 'pytest11'
-  entrypoints via setuptools' pkg_resources.iter_entry_points
-
-- fix py.test dist-testing to work with execnet >= 1.0.0b4
-
-- re-introduce py.test.cmdline.main() for better backward compatibility
-
-- svn paths: fix a bug with path.check(versioned=True) for svn paths,
-  allow '%' in svn paths, make svnwc.update() default to interactive mode
-  like in 1.0.x and add svnwc.update(interactive=False) to inhibit interaction.
-
-- refine distributed tarball to contain test and no pyc files
-
-- try harder to have deprecation warnings for py.compat.* accesses
-  report a correct location
-
-Changes between 1.1.0 and 1.0.2
-=====================================
-
-* adjust and improve docs
-
-* remove py.rest tool and internal namespace - it was
-  never really advertised and can still be used with
-  the old release if needed.  If there is interest
-  it could be revived into its own tool i guess.
-
-* fix issue48 and issue59: raise an Error if the module
-  from an imported test file does not seem to come from
-  the filepath - avoids "same-name" confusion that has
-  been reported repeatedly
-
-* merged Ronny's nose-compatibility hacks: now
-  nose-style setup_module() and setup() functions are
-  supported
-
-* introduce generalized py.test.mark function marking
-
-* reshuffle / refine command line grouping
-
-* deprecate parser.addgroup in favour of getgroup which creates option group
-
-* add --report command line option that allows to control showing of skipped/xfailed sections
-
-* generalized skipping: a new way to mark python functions with skipif or xfail
-  at function, class and modules level based on platform or sys-module attributes.
-
-* extend py.test.mark decorator to allow for positional args
-
-* introduce and test "py.cleanup -d" to remove empty directories
-
-* fix issue #59 - robustify unittest test collection
-
-* make bpython/help interaction work by adding an __all__ attribute
-  to ApiModule, cleanup initpkg
-
-* use MIT license for pylib, add some contributors
-
-* remove py.execnet code and substitute all usages with 'execnet' proper
-
-* fix issue50 - cached_setup now caches more to expectations
-  for test functions with multiple arguments.
-
-* merge Jarko's fixes, issue #45 and #46
-
-* add the ability to specify a path for py.lookup to search in
-
-* fix a funcarg cached_setup bug probably only occuring
-  in distributed testing and "module" scope with teardown.
-
-* many fixes and changes for making the code base python3 compatible,
-  many thanks to Benjamin Peterson for helping with this.
-
-* consolidate builtins implementation to be compatible with >=2.3,
-  add helpers to ease keeping 2 and 3k compatible code
-
-* deprecate py.compat.doctest|subprocess|textwrap|optparse
-
-* deprecate py.magic.autopath, remove py/magic directory
-
-* move pytest assertion handling to py/code and a pytest_assertion
-  plugin, add "--no-assert" option, deprecate py.magic namespaces
-  in favour of (less) py.code ones.
-
-* consolidate and cleanup py/code classes and files
-
-* cleanup py/misc, move tests to bin-for-dist
-
-* introduce delattr/delitem/delenv methods to py.test's monkeypatch funcarg
-
-* consolidate py.log implementation, remove old approach.
-
-* introduce py.io.TextIO and py.io.BytesIO for distinguishing between
-  text/unicode and byte-streams (uses underlying standard lib io.*
-  if available)
-
-* make py.unittest_convert helper script available which converts "unittest.py"
-  style files into the simpler assert/direct-test-classes py.test/nosetests
-  style.  The script was written by Laura Creighton.
-
-* simplified internal localpath implementation
-
-Changes between 1.0.1 and 1.0.2
-=====================================
-
-* fixing packaging issues, triggered by fedora redhat packaging,
-  also added doc, examples and contrib dirs to the tarball.
-
-* added a documentation link to the new django plugin.
-
-Changes between 1.0.0 and 1.0.1
-=====================================
-
-* added a 'pytest_nose' plugin which handles nose.SkipTest,
-  nose-style function/method/generator setup/teardown and
-  tries to report functions correctly.
-
-* capturing of unicode writes or encoded strings to sys.stdout/err
-  work better, also terminalwriting was adapted and somewhat
-  unified between windows and linux.
-
-* improved documentation layout and content a lot
-
-* added a "--help-config" option to show conftest.py / ENV-var names for
-  all longopt cmdline options, and some special conftest.py variables.
-  renamed 'conf_capture' conftest setting to 'option_capture' accordingly.
-
-* fix issue #27: better reporting on non-collectable items given on commandline
-  (e.g. pyc files)
-
-* fix issue #33: added --version flag (thanks Benjamin Peterson)
-
-* fix issue #32: adding support for "incomplete" paths to wcpath.status()
-
-* "Test" prefixed classes are *not* collected by default anymore if they
-  have an __init__ method
-
-* monkeypatch setenv() now accepts a "prepend" parameter
-
-* improved reporting of collection error tracebacks
-
-* simplified multicall mechanism and plugin architecture,
-  renamed some internal methods and argnames
-
-Changes between 1.0.0b9 and 1.0.0
-=====================================
-
-* more terse reporting try to show filesystem path relatively to current dir
-* improve xfail output a bit
-
-Changes between 1.0.0b8 and 1.0.0b9
-=====================================
-
-* cleanly handle and report final teardown of test setup
-
-* fix svn-1.6 compat issue with py.path.svnwc().versioned()
-  (thanks Wouter Vanden Hove)
-
-* setup/teardown or collection problems now show as ERRORs
-  or with big "E"'s in the progress lines.  they are reported
-  and counted separately.
-
-* dist-testing: properly handle test items that get locally
-  collected but cannot be collected on the remote side - often
-  due to platform/dependency reasons
-
-* simplified py.test.mark API - see keyword plugin documentation
-
-* integrate better with logging: capturing now by default captures
-  test functions and their immediate setup/teardown in a single stream
-
-* capsys and capfd funcargs now have a readouterr() and a close() method
-  (underlyingly py.io.StdCapture/FD objects are used which grew a
-  readouterr() method as well to return snapshots of captured out/err)
-
-* make assert-reinterpretation work better with comparisons not
-  returning bools (reported with numpy from thanks maciej fijalkowski)
-
-* reworked per-test output capturing into the pytest_iocapture.py plugin
-  and thus removed capturing code from config object
-
-* item.repr_failure(excinfo) instead of item.repr_failure(excinfo, outerr)
-
-
-Changes between 1.0.0b7 and 1.0.0b8
-=====================================
-
-* pytest_unittest-plugin is now enabled by default
-
-* introduced pytest_keyboardinterrupt hook and
-  refined pytest_sessionfinish hooked, added tests.
-
-* workaround a buggy logging module interaction ("closing already closed
-  files").  Thanks to Sridhar Ratnakumar for triggering.
-
-* if plugins use "py.test.importorskip" for importing
-  a dependency only a warning will be issued instead
-  of exiting the testing process.
-
-* many improvements to docs:
-  - refined funcargs doc , use the term "factory" instead of "provider"
-  - added a new talk/tutorial doc page
-  - better download page
-  - better plugin docstrings
-  - added new plugins page and automatic doc generation script
-
-* fixed teardown problem related to partially failing funcarg setups
-  (thanks MrTopf for reporting), "pytest_runtest_teardown" is now
-  always invoked even if the "pytest_runtest_setup" failed.
-
-* tweaked doctest output for docstrings in py modules,
-  thanks Radomir.
-
-Changes between 1.0.0b3 and 1.0.0b7
-=============================================
-
-* renamed py.test.xfail back to py.test.mark.xfail to avoid
-  two ways to decorate for xfail
-
-* re-added py.test.mark decorator for setting keywords on functions
-  (it was actually documented so removing it was not nice)
-
-* remove scope-argument from request.addfinalizer() because
-  request.cached_setup has the scope arg. TOOWTDI.
-
-* perform setup finalization before reporting failures
-
-* apply modified patches from Andreas Kloeckner to allow
-  test functions to have no func_code (#22) and to make
-  "-k" and function keywords work  (#20)
-
-* apply patch from Daniel Peolzleithner (issue #23)
-
-* resolve issue #18, multiprocessing.Manager() and
-  redirection clash
-
-* make __name__ == "__channelexec__" for remote_exec code
-
-Changes between 1.0.0b1 and 1.0.0b3
-=============================================
-
-* plugin classes are removed: one now defines
-  hooks directly in conftest.py or global pytest_*.py
-  files.
-
-* added new pytest_namespace(config) hook that allows
-  to inject helpers directly to the py.test.* namespace.
-
-* documented and refined many hooks
-
-* added new style of generative tests via
-  pytest_generate_tests hook that integrates
-  well with function arguments.
-
-
-Changes between 0.9.2 and 1.0.0b1
-=============================================
-
-* introduced new "funcarg" setup method,
-  see doc/test/funcarg.txt
-
-* introduced plugin architecuture and many
-  new py.test plugins, see
-  doc/test/plugins.txt
-
-* teardown_method is now guaranteed to get
-  called after a test method has run.
-
-* new method: py.test.importorskip(mod,minversion)
-  will either import or call py.test.skip()
-
-* completely revised internal py.test architecture
-
-* new py.process.ForkedFunc object allowing to
-  fork execution of a function to a sub process
-  and getting a result back.
-
-XXX lots of things missing here XXX
-
-Changes between 0.9.1 and 0.9.2
-===============================
-
-* refined installation and metadata, created new setup.py,
-  now based on setuptools/ez_setup (thanks to Ralf Schmitt
-  for his support).
-
-* improved the way of making py.* scripts available in
-  windows environments, they are now added to the
-  Scripts directory as ".cmd" files.
-
-* py.path.svnwc.status() now is more complete and
-  uses xml output from the 'svn' command if available
-  (Guido Wesdorp)
-
-* fix for py.path.svn* to work with svn 1.5
-  (Chris Lamb)
-
-* fix path.relto(otherpath) method on windows to
-  use normcase for checking if a path is relative.
-
-* py.test's traceback is better parseable from editors
-  (follows the filenames:LINENO: MSG convention)
-  (thanks to Osmo Salomaa)
-
-* fix to javascript-generation, "py.test --runbrowser"
-  should work more reliably now
-
-* removed previously accidentally added
-  py.test.broken and py.test.notimplemented helpers.
-
-* there now is a py.__version__ attribute
-
-Changes between 0.9.0 and 0.9.1
-===============================
-
-This is a fairly complete list of changes between 0.9 and 0.9.1, which can
-serve as a reference for developers.
-
-* allowing + signs in py.path.svn urls [39106]
-* fixed support for Failed exceptions without excinfo in py.test [39340]
-* added support for killing processes for Windows (as well as platforms that
-  support os.kill) in py.misc.killproc [39655]
-* added setup/teardown for generative tests to py.test [40702]
-* added detection of FAILED TO LOAD MODULE to py.test [40703, 40738, 40739]
-* fixed problem with calling .remove() on wcpaths of non-versioned files in
-  py.path [44248]
-* fixed some import and inheritance issues in py.test [41480, 44648, 44655]
-* fail to run greenlet tests when pypy is available, but without stackless
-  [45294]
-* small fixes in rsession tests [45295]
-* fixed issue with 2.5 type representations in py.test [45483, 45484]
-* made that internal reporting issues displaying is done atomically in py.test
-  [45518]
-* made that non-existing files are igored by the py.lookup script [45519]
-* improved exception name creation in py.test [45535]
-* made that less threads are used in execnet [merge in 45539]
-* removed lock required for atomical reporting issue displaying in py.test
-  [45545]
-* removed globals from execnet [45541, 45547]
-* refactored cleanup mechanics, made that setDaemon is set to 1 to make atexit
-  get called in 2.5 (py.execnet) [45548]
-* fixed bug in joining threads in py.execnet's servemain [45549]
-* refactored py.test.rsession tests to not rely on exact output format anymore
-  [45646]
-* using repr() on test outcome [45647]
-* added 'Reason' classes for py.test.skip() [45648, 45649]
-* killed some unnecessary sanity check in py.test.collect [45655]
-* avoid using os.tmpfile() in py.io.fdcapture because on Windows it's only
-  usable by Administrators [45901]
-* added support for locking and non-recursive commits to py.path.svnwc [45994]
-* locking files in py.execnet to prevent CPython from segfaulting [46010]
-* added export() method to py.path.svnurl
-* fixed -d -x in py.test [47277]
-* fixed argument concatenation problem in py.path.svnwc [49423]
-* restore py.test behaviour that it exits with code 1 when there are failures
-  [49974]
-* don't fail on html files that don't have an accompanying .txt file [50606]
-* fixed 'utestconvert.py < input' [50645]
-* small fix for code indentation in py.code.source [50755]
-* fix _docgen.py documentation building [51285]
-* improved checks for source representation of code blocks in py.test [51292]
-* added support for passing authentication to py.path.svn* objects [52000,
-  52001]
-* removed sorted() call for py.apigen tests in favour of [].sort() to support
-  Python 2.3 [52481]

File ISSUES.txt

-checks / deprecations for next release
----------------------------------------------------------------
-tags: bug 1.4 core xdist
-
-* reportinfo -> location in hooks and items
-* check oejskit plugin compatibility
-* terminal reporting - dot-printing
-* some simple profiling 
-* move pytest_nose out of pylib because it implicitely extends
-  the protocol now - setup/teardown is called at module level.
-  consider making calling of setup/teardown configurable
-
-refine session initialization / fix custom collect crash
----------------------------------------------------------------
-tags: bug 1.4 core xdist
-
-When calling "py.test path/X" py.test can crash if the collection
-of that directory is skipped.  Calling "py.test path" will give
-proper output.  The reason is that for the very first colitems
-getinitialnodes() and a collection is done before the fully
-controlled session and pytest_make_collect_report protocol takes over.
-Try to remove the redundant getinitialnodes related logic and amend
-the session collect logic to care for this "initial" case as well.
-Apart from simplification a side effect the dsession's session
-and the core session probably converge some more.
-
-do early-teardown of test modules
------------------------------------------
-tags: feature 1.3
-
-currently teardowns are called when the next tests is setup
-except for the function/method level where interally
-"teardown_exact" tears down immediately.  Generalize
-this to perform the "neccessary" teardown compared to
-the "next" test item during teardown - this should
-get rid of some irritations because otherwise e.g.
-prints of teardown-code appear in the setup of the next test.
-
-consider and document __init__ file usage in test directories
----------------------------------------------------------------
-tags: bug 1.4 core
-
-Currently, a test module is imported with its fully qualified
-package path, determined by checking __init__ files upwards.
-This has the side effect that a source package at the root
-of the test dir could be imported as well.  This is somewhat
-convenient but complicates the picture for running tests against
-different versions of a package.  Also, implicit sys.path
-manipulations are problematic per-se.  Maybe factorting out
-a pytest_addsyspath hook which can be disabled from the command line
-makes sense.  In any case documentation/recommendations for
-certain scenarios makes sense.
-
-relax requirement to have tests/testing contain an __init__
-----------------------------------------------------------------
-tags: feature 1.4
-bb: http://bitbucket.org/hpk42/py-trunk/issue/64
-
-A local test run of a "tests" directory may work
-but a remote one fail because the tests directory
-does not contain an "__init__.py". Either give
-an error or make it work without the __init__.py
-i.e. port the nose-logic of unloading a test module.
-
-customize test function collection
--------------------------------------------------------
-tags: feature 1.4
-
-- introduce py.test.mark.nocollect for not considering a function for
-  test collection at all.  maybe also introduce a py.test.mark.test to
-  explicitely mark a function to become a tested one.  Lookup JUnit ways
-  of tagging tests.
-
-- allow an easy way to customize "test_", "Test" prefixes for file paths
-  and test function/class names. the current customizable Item requires
-  too much code/concepts to influence this collection matching.
-  maybe introduce pytest_pycollect_filters = {
-    'file': 'test*.py',
-    'function': 'test*',
-    'class': 'Test*',
-  }
-
-introduce py.test.mark.platform
--------------------------------------------------------
-tags: feature 1.4
-
-Introduce nice-to-spell platform-skipping, examples:
-
-    @py.test.mark.platform("python3")
-    @py.test.mark.platform("not python3")
-    @py.test.mark.platform("win32 and not python3")
-    @py.test.mark.platform("darwin")
-    @py.test.mark.platform("not (jython and win32)")
-    @py.test.mark.platform("not (jython and win32)", xfail=True)
-
-etc. Idea is to allow Python expressions which can operate
-on common spellings for operating systems and python
-interpreter versions.
-
-introduce py.test.mark registration
------------------------------------------
-tags: feature 1.4
-
-introduce a hook that allows to register a named mark decorator
-with documentation and add "py.test --marks" to get
-a list of available marks.  Deprecate "dynamic" mark
-definitions.
-
-allow to non-intrusively apply skipfs/xfail/marks
----------------------------------------------------
-tags: feature 1.4
-
-use case: mark a module or directory structures
-to be skipped on certain platforms (i.e. no import
-attempt will be made).
-
-consider introducing a hook/mechanism that allows to apply marks
-from conftests or plugins.
-
-explicit referencing of conftest.py files
------------------------------------------
-tags: feature 1.4
-
-allow to name conftest.py files (in sub directories) that should
-be imported early, as to include command line options.
-
-a central py.test ini/yml file
-----------------------------------
-tags: feature 1.4
-
-introduce a declarative configuration file that allows:
-- default options
-- to-be-collected test directories
-- required plugins
-- test func/class/file matching patterns
-- skip/xfail (non-intrusive)
-- pytest.ini and tox.ini and setup.cfg configuration in the same file
-
-new documentation
-----------------------------------
-tags: feature 1.4
-
-- logo py.test
-- reference / customization
-- writing a (local or global) plugin
-- examples for unittest or functional testing
-- resource management for functional testing
-- patterns: page object
-- parametrized testing
-- better / more integrated plugin docs
-  i.e. not per-plugin but per-feature referencing a plugin
-
-generalize parametrized testing to generate combinations
--------------------------------------------------------------
-tags: feature 1.4
-
-think about extending metafunc.addcall or add a new method to allow to
-generate tests with combinations of all generated versions - what to do
-about "id" and "param" in such combinations though?
-
-introduce py.test.mark.multi
------------------------------------------
-tags: feature 1.3
-
-introduce py.test.mark.multi to specify a number
-of values for a given function argument.
-
-have imported module mismatch honour relative paths
---------------------------------------------------------
-tags: bug 1.4
-
-With 1.1.1 py.test fails at least on windows if an import
-is relative and compared against an absolute conftest.py
-path. Normalize.
-
-make node._checkcollectable more robust
--------------------------------------------------
-tags: bug 1.4
-
-currently node._checkcollectable() can raise
-exceptions for all kinds of reasons ('conftest.py' loading
-problems, missing rsync-dirs, platform-skip-at-import-level
-issues, ...).  It should just return True/False and cause
-a good error message.
-
-call termination with small timeout
--------------------------------------------------
-tags: feature 1.4
-test: testing/pytest/dist/test_dsession.py - test_terminate_on_hanging_node
-
-Call gateway group termination with a small timeout if available.
-Should make dist-testing less likely to leave lost processes.
-
-consider globals: py.test.ensuretemp and config
---------------------------------------------------------------
-tags: experimental-wish 1.4
-
-consider deprecating py.test.ensuretemp and py.test.config
-to further reduce py.test globality.  Also consider
-having py.test.config and ensuretemp coming from
-a plugin rather than being there from the start.
-
-consider allowing funcargs for setup methods
---------------------------------------------------------------
-tags: experimental-wish 1.4
-
-Users have expressed the wish to have funcargs available to setup
-functions.  Experiment with allowing funcargs there - it might
-also help to make the py.test.ensuretemp and config deprecation.
-For filling funcargs for setup methods, we could call funcarg
-factories with a request object that not have a cls/function
-attributes.  However, how to handle parametrized test functions
-and funcargs?
-
-setup_function -> request can be like it is now
-setup_class -> request has no request.function
-setup_module -> request has no request.cls
-
-consider pytest_addsyspath hook
------------------------------------------
-tags: 1.4
-
-py.test could call a new pytest_addsyspath() in order to systematically
-allow manipulation of sys.path and to inhibit it via --no-addsyspath
-in order to more easily run against installed packages.
-
-Alternatively it could also be done via the config object
-and pytest_configure.
-
-
-show plugin information in test header
-----------------------------------------------------------------
-tags: feature 1.4
-
-Now that external plugins are becoming more numerous
-it would be useful to have external plugins along with
-their versions displayed as a header line.
-
-deprecate global py.test.config usage
-----------------------------------------------------------------
-tags: feature 1.4
-
-py.test.ensuretemp and py.test.config are probably the last
-objects containing global state.  Often using them is not
-neccessary.  This is about trying to get rid of them, i.e.
-deprecating them and checking with PyPy's usages as well
-as others.
-
-remove deprecated bits in collect.py
--------------------------------------------------------------------
-tags: feature 1.4
-
-In an effort to further simplify code, review and remove deprecated bits
-in collect.py.  Probably good:
-- inline consider_file/dir methods, no need to have them
-  subclass-overridable because of hooks

File LICENSE

-
-  Permission is hereby granted, free of charge, to any person obtaining a copy
-  of this software and associated documentation files (the "Software"), to deal
-  in the Software without restriction, including without limitation the rights
-  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-  copies of the Software, and to permit persons to whom the Software is
-  furnished to do so, subject to the following conditions:
-     
-  The above copyright notice and this permission notice shall be included in all
-  copies or substantial portions of the Software.
- 
-  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-  SOFTWARE.
-

File MANIFEST.in

-include CHANGELOG
-include README.txt
-include setup.py
-include distribute_setup.py
-include LICENSE 
-include conftest.py 
-graft doc
-graft contrib
-graft bin 
-graft testing
-#exclude *.orig 
-#exclude *.orig 
-exclude *.rej 
-exclude .hginore
-exclude *.pyc
-#recursive-exclude testing *.pyc *.orig *.rej *$py.class
-#prune .pyc
-#prune .svn 
-#prune .hg 
-The py lib is a Python development support library featuring
-the following tools and modules:
+The 'py' package is an empty placeholder package solely for compatibibility
+and convenience of upgrading older "py" installations.  It will require
+the following three now split-out distributions:
 
-* py.test: tool for distributed automated testing
-* py.code: dynamic code generation and introspection
-* py.path:  uniform local and svn path objects
+* pytest: https://bitbucket.org/hpk42/pytest
 
-For questions and more information please visit http://pylib.org
+* pylib: https://bitbucket.org/hpk42/pylib
+
+* pytools: https://bitbucket.org/hpk42/pytools
+
+See http://pylib.org and http://pytest.org for more info on those packages.
+

File bin-for-dist/all-plat.sh

-
-        
-py.test --dist=each $* \
-    --tx 'socket=192.168.1.106:8888'
-    #--tx 'popen//python=python2.6' \
-    #--tx 'ssh=noco//python=/usr/local/bin/python2.4//chdir=/tmp/pytest-python2.4' \

File bin-for-dist/findmissingdocstrings.py

-#!/usr/bin/env python
-
-import py
-import inspect
-import types
-
-def report_strange_docstring(name, obj):
-    if obj.__doc__ is None:
-        print "%s misses a docstring" % (name, )
-    elif obj.__doc__ == "":
-        print "%s has an empty" % (name, )
-    elif "XXX" in obj.__doc__:
-        print "%s has an 'XXX' in its docstring" % (name, )
-
-def find_code(method):
-    return getattr(getattr(method, "im_func", None), "func_code", None)
-
-def report_different_parameter_names(name, cls):
-    bases = cls.__mro__
-    for base in bases:
-        for attr in dir(base):
-            meth1 = getattr(base, attr)
-            code1 = find_code(meth1)
-            if code1 is None:
-                continue
-            if not callable(meth1):
-                continue
-            if not hasattr(cls, attr):
-                continue
-            meth2 = getattr(cls, attr)
-            code2 = find_code(meth2)
-            if not callable(meth2):
-                continue
-            if code2 is None:
-                continue
-            args1 = inspect.getargs(code1)[0]
-            args2 = inspect.getargs(code2)[0]
-            for a1, a2 in zip(args1, args2):
-                if a1 != a2:
-                    print "%s.%s have different argument names %s, %s than the version in %s" % (name, attr, a1, a2, base)
-
-
-def find_all_exported():
-    stack = [(name, getattr(py, name)) for name in dir(py)[::-1]
-             if not name.startswith("_") and name != "compat"]
-    seen = {}
-    exported = []
-    while stack:
-        name, obj = stack.pop()
-        if id(obj) in seen:
-            continue
-        else:
-            seen[id(obj)] = True
-        exported.append((name, obj))
-        if isinstance(obj, type) or isinstance(obj, type(py)):
-            stack.extend([("%s.%s" % (name, s), getattr(obj, s)) for s in dir(obj)
-                           if len(s) <= 1 or not (s[0] == '_' and s[1] != '_')])
-    return exported
-
-
-
-if __name__ == '__main__':
-    all_exported = find_all_exported()
-    print "strange docstrings"
-    print "=================="
-    print
-    for name, obj in all_exported:
-        if callable(obj):
-            report_strange_docstring(name, obj)
-    print "\n\ndifferent parameters"
-    print     "===================="
-    print
-    for name, obj in all_exported:
-        if isinstance(obj, type):
-            report_different_parameter_names(name, obj)
-

File bin-for-dist/gendoc.py

-#!/usr/bin/env python
-
-XXX
-
-import sys
-import os
-from _findpy import py
-try:
-    import apigen
-except ImportError:
-    print 'Can not find apigen - make sure PYTHONPATH is set correctly!'
-    py.std.sys.exit()
-else:
-    args = list(sys.argv[1:])
-    args.extend(['-p', 'apigen'])
-    argkeys = [a.split('=')[0] for a in args]
-    if '--apigen' not in argkeys:
-        args.append('--apigen')
-    if '--apigenscript' not in argkeys:
-        fpath = os.path.join(
-            os.path.dirname(apigen.__file__), 'tool', 'py_build', 'build.py')
-        args.append('--apigenscript=%s' % (fpath,))
-    if '--apigenpath' not in argkeys:
-        args.append('--apigenpath=api')
-    py.test.cmdline.main(args)

File bin-for-dist/genscripts.py

-import py
-
-bindir = py.path.local(__file__).dirpath().dirpath("bin")
-assert bindir.check(), bindir
-
-def getbasename(name):
-    assert name[:2] == "py"
-    return "py." + name[2:]
-
-def genscript_unix(name):
-    basename = getbasename(name)
-    path = bindir.join(basename)
-    path.write(py.code.Source("""
-        #!/usr/bin/env python
-        from _findpy import py
-        py.cmdline.%s()
-    """ % name).strip())
-    path.chmod(0755)
-
-def genscript_windows(name):
-    basename = getbasename(name)
-    winbasename = basename + ".cmd"
-    path = bindir.join("win32").join(winbasename)
-    path.write(py.code.Source("""
-         @echo off
-         python "%%~dp0\..\%s" %%*
-    """ % (basename)).strip())
-
-if __name__ == "__main__":
-    for name in dir(py.cmdline):
-        if name[0] != "_":
-            genscript_unix(name)
-            genscript_windows(name)

File bin-for-dist/gensetup.py

-import sys
-
-sys.path.insert(0, sys.argv[1])
-import py
-
-toolpath = py.path.local(__file__)
-binpath = py.path.local(py.__file__).dirpath('bin')
-
-def error(msg):
-    print >>sys.stderr, msg
-    raise SystemExit, 1
-
-def reformat(text):
-    return " ".join(text.split())
-
-class SetupWriter(object):
-    EXCLUDES = ("MANIFEST.in", "contrib")
-
-    def __init__(self, basedir, pkg, setuptools=False):
-        self.basedir = basedir
-        self.setuptools = setuptools
-        assert self.basedir.check()
-        self.pkg = pkg
-        self.meta = pkg.__pkg__
-        self.lines = []
-        self.allpaths = self.getallpath(self.basedir)
-
-    def getallpath(self, basedir):
-        contrib = self.basedir.join("contrib")
-        allpath = []
-        lines = py.process.cmdexec("hg st -mcan").split("\n")
-        for path in lines:
-            p = basedir.join(path)
-            assert p.check(), p
-            if not p.relto(contrib) and p != contrib and not self.isexcluded(p):
-                allpath.append(p)
-        return allpath
-
-    def append(self, string):
-        lines = string.split("\n")
-        while lines:
-            if not lines[0].strip():
-                lines.pop(0)
-                continue
-            break
-        if not lines:
-            self.lines.append("")
-            return
-        line = lines[0]
-        indent = len(line) - len(line.lstrip())
-        for line in lines:
-            if line.strip():
-                assert not line[:indent].strip(), line
-                line = line[indent:]
-            self.lines.append(line)
-
-    def write_winfuncs(self):
-        self.append('''
-        ''')
-
-    def tip_info(self, indent=8):
-        old = self.basedir.chdir()
-        indent = " " * indent
-        try:
-            info = []
-            output = py.process.cmdexec(
-                "hg tip --template '" # tags: {tags}\n"
-                #"branch: {branches}\n"
-                "revision: {rev}:{node}\n'"
-            )
-            for line in output.split("\n"):
-                info.append("%s %s" %(indent, line.strip()))
-            return "\n".join(info)
-        finally:
-            old.chdir()
-
-    def setup_header(self):
-        #tooltime = "%s %s" %(py.std.time.asctime(), py.std.time.tzname[0])
-        toolname = toolpath.basename
-        #toolrevision = py.path.svnwc(toolpath).info().rev
-
-        pkgname = self.pkg.__name__
-        self.append('"""py lib / py.test setup.py file"""')
-        self.append('import os, sys')
-        self.append("from setuptools import setup")
-
-    def setup_trailer(self):
-        self.append('''
-            if __name__ == '__main__':
-                main()
-        ''')
-
-    def setup_function(self):
-        params = self.__dict__.copy()
-        params.update(self.meta.__dict__)
-        self.append('long_description = """')
-        for line in params['long_description'].split('\n'):
-            self.append(line)
-        self.append('"""')
-        trunk = None
-        if params['version'] == 'trunk':
-            trunk = 'trunk'
-        self.append('trunk = %r' % trunk)
-        self.append('''
-            def main():
-                setup(
-                    name=%(name)r,
-                    description=%(description)r,
-                    long_description = long_description,
-                    version= trunk or %(version)r,
-                    url=%(url)r,
-                    license=%(license)r,
-                    platforms=%(platforms)r,
-                    author=%(author)r,
-                    author_email=%(author_email)r,
-        ''' % params)
-        indent = " " * 8
-        self.append_pprint(indent, entry_points={'console_scripts':self.getconsolescripts()})
-        self.append_pprint(indent, classifiers=self.meta.classifiers)
-        self.append_pprint(indent, packages=self.getpackages())
-        self.append_pprint(indent, package_data=self.getpackagedata())
-        self.append_pprint(indent, zip_safe=True)
-        self.append_pprint(indent, install_requires=['apipkg'])
-        self.lines.append(indent[4:] + ")\n")
-
-    def setup_scripts(self):
-        # XXX this was used for a different approach
-        not used
-        self.append("""
-            def getscripts():
-                if sys.platform == "win32":
-                    base = "py/bin/win32/"
-                    ext = ".cmd"
-                else:
-                    base = "py/bin/"
-                    ext = ""
-                l = []
-                for name in %r:
-                    l.append(base + name + ext)
-                return l
-        """ % ([script.basename for script in binpath.listdir("py.*")]))
-
-    def append_pprint(self, indent, append=",", **kw):
-        for name, value in kw.items():
-            stringio = py.std.StringIO.StringIO()
-            value = py.std.pprint.pprint(value, stream=stringio)
-            stringio.seek(0)
-            lines =  stringio.readlines()
-            line = lines.pop(0).rstrip()
-            self.lines.append(indent + "%s=%s" %(name, line))
-            indent = indent + " " * (len(name)+1)
-            for line in lines:
-                self.lines.append(indent + line.rstrip())
-            self.lines[-1] = self.lines[-1] + append
-
-    def getconsolescripts(self):
-        bindir = self.basedir.join('py', 'bin')
-        scripts = []
-        for p in self.allpaths:
-            if p.dirpath() == bindir:
-                if p.basename.startswith('py.'):
-                    shortname = "py" + p.basename[3:]
-                    scripts.append("%s = py.cmdline:%s" %
-                        (p.basename, shortname))
-        return scripts
-
-    def getscripts(self):
-        bindir = self.basedir.join('py', 'bin')
-        scripts = []
-        for p in self.allpaths:
-            if p.dirpath() == bindir:
-                if p.basename.startswith('py.'):
-                    scripts.append(p.relto(self.basedir))
-        return scripts
-
-    def getpackages(self):
-        packages = []
-        for p in self.allpaths: # contains no directories!
-            #if p.basename == "py":
-            #    continue
-            if p.dirpath('__init__.py').check():
-                modpath = p.dirpath().relto(self.basedir).replace(p.sep, '.')
-                if modpath != "py" and not modpath.startswith("py."):
-                    continue
-                if modpath in packages:
-                    continue
-                for exclude in self.EXCLUDES:
-                    if modpath.startswith(exclude):
-                        print "EXCLUDING", modpath
-                        break
-                else:
-                    packages.append(modpath)
-        packages.sort()
-        return packages
-
-    def getpackagedata(self):
-        datafiles = []
-        pkgbase = self.basedir.join(self.pkg.__name__)
-        for p in self.allpaths:
-            if p.check(file=1) and (not p.dirpath("__init__.py").check()
-               or p.ext != ".py"):
-                if p.dirpath() != self.basedir:
-                    x = p.relto(pkgbase)
-                    if x:
-                        datafiles.append(p.relto(pkgbase))
-        return {'py': datafiles}
-
-    def getdatafiles(self):
-        datafiles = []
-        for p in self.allpaths:
-            if p.check(file=1) and not p.ext == ".py":
-                if p.dirpath() != self.basedir:
-                    datafiles.append(p.relto(self.basedir))
-        return datafiles
-
-    def setup_win32(self):
-        import winpath
-        self.append(py.std.inspect.getsource(winpath))
-        self.append("""
-            from distutils.command.install import install
-            class my_install(install):
-                def finalize_other(self):
-                    install.finalize_other(self)
-                    on_win32_add_to_PATH()
-            cmdclass = {'install': my_install}
-        """)
-
-    def setup_win32(self):
-        self.append(r'''
-        # scripts for windows: turn "py.SCRIPT" into "py_SCRIPT" and create
-        # "py.SCRIPT.cmd" files invoking "py_SCRIPT"
-        from distutils.command.install_scripts import install_scripts
-        class my_install_scripts(install_scripts):
-            def run(self):
-                install_scripts.run(self)
-                #print self.outfiles
-                for fn in self.outfiles:
-                    basename = os.path.basename(fn)
-                    if basename.startswith("py.") and not basename.endswith(".cmd"):
-                        newbasename = basename.replace(".", "_")
-                        newfn = os.path.join(os.path.dirname(fn), newbasename)
-                        if os.path.exists(newfn):
-                            os.remove(newfn)
-                        os.rename(fn, newfn)
-                        fncmd = fn + ".cmd"
-                        if os.path.exists(fncmd):
-                           os.remove(fncmd)
-                        f = open(fncmd, 'w')
-                        f.write("@echo off\n")
-                        f.write('python "%%~dp0\%s" %%*' %(newbasename))
-                        f.close()
-        if sys.platform == "win32":
-            cmdclass = {'install_scripts': my_install_scripts}
-        else:
-            cmdclass = {}
-        ''')
-
-    def write_setup(self):
-        self.setup_header()
-        self.setup_function()
-        #self.setup_scripts()
-        #self.setup_win32()
-        self.setup_trailer()
-        targetfile = self.basedir.join("setup.py")
-        targetfile.write("\n".join(self.lines))
-        print "wrote",  targetfile
-
-    def isexcluded(self, wcpath):
-        return wcpath.basename[0] == "."
-        rel = wcpath.relto(self.basedir)
-        if rel.find("testing") != -1:
-            return True
-
-    def write_manifest(self):
-        lines = []
-        for p in self.allpaths:
-            if p.check(dir=1):
-                continue
-            toadd = p.relto(self.basedir)
-            if toadd:
-                for exclude in self.EXCLUDES:
-                    if toadd.startswith(exclude):
-                        break
-                    assert toadd.find(exclude) == -1, (toadd, exclude)
-                else:
-                    lines.append("%s" %(toadd))
-        lines.sort()
-        targetfile = self.basedir.join("MANIFEST")
-        targetfile.write("\n".join(lines))
-        print "wrote",  targetfile
-
-    def write_all(self):
-        #self.write_manifest()
-        self.write_setup()
-
-def parseargs():
-    basedir = py.path.local(sys.argv[1])
-    if not basedir.check():
-        error("basedir not found: %s" %(basedir,))
-    pydir = basedir.join('py')
-    if not pydir.check():
-        error("no 'py' directory found in: %s" %(pydir,))
-    actualpydir = py.path.local(py.__file__).dirpath()
-    if pydir != actualpydir:
-        error("package dir conflict, %s != %s" %(pydir, actualpydir))
-    return basedir
-
-def main(basedir=None):
-    if basedir is None:
-        basedir = parseargs()
-    writer = SetupWriter(basedir, py, setuptools=True)
-    writer.write_all()
-
-if __name__ == "__main__":
-    main()

File bin-for-dist/hudson.py

-import os, sys, subprocess, urllib
-
-BUILDNAME=os.environ.get('BUILD_NUMBER', "1")
-
-def call(*args):
-    ret = subprocess.call(list(args))
-    assert ret == 0
-
-def bincall(*args):
-    args = list(args)
-    args[0] = os.path.join(BIN, args[0])
-    call(*args)
-
-call("virtualenv", os.path.abspath(BUILDNAME), '--no-site-packages')
-BIN=os.path.abspath(os.path.join(BUILDNAME, 'bin'))
-if not os.path.exists(BIN):
-    BIN=os.path.abspath(os.path.join(BUILDNAME, 'Scripts'))
-    assert os.path.exists(BIN)
-
-PYTHON=os.path.join(BIN, 'python')
-bincall("python", "setup.py", "develop", "-q")
-bincall("pip", "install", "-r", "testing/pip-reqs1.txt",
-               "-q", "--download-cache=download")
-bincall("py.test", "--ignore", BUILDNAME,
-        "--xml=junit.xml",
-        "--report=skipped", "--runslowtest", *sys.argv[1:])

File bin-for-dist/makepluginlist.py

-
-import os, sys
-WIDTH = 75
-
-plugins = [
-    ('advanced python testing',
-            'skipping mark pdb figleaf '
-            'monkeypatch coverage cov capture capturelog recwarn tmpdir',),
-    ('distributed testing, CI and deployment',
-        'xdist pastebin junitxml resultlog genscript',),
-    ('testing domains and conventions codecheckers',
-            'oejskit django unittest nose doctest restdoc'),
-    ('internal, debugging, help functionality',
-          'helpconfig terminal hooklog')
-    #('internal plugins / core functionality',
-    #    #'runner execnetcleanup # pytester',
-    #    'runner execnetcleanup' # pytester',
-    #)
-]
-
-externals = {
-    'oejskit': "run javascript tests in real life browsers",
-    'xdist': None,
-    'figleaf': None,
-    'capturelog': None,
-    'coverage': None,
-    'cov': None,
-    'codecheckers': None,
-    'django': "for testing django applications",
-}
-
-def warn(*args):
-    msg = " ".join(map(str, args))
-    print >>sys.stderr, "WARN:", msg
-
-class RestWriter:
-    _all_links = {}
-
-    def __init__(self, target):
-        self.target = py.path.local(target)
-        self.links = []
-
-    def _getmsg(self, args):
-        return " ".join(map(str, args))
-
-    def Print(self, *args, **kwargs):
-        msg = self._getmsg(args)
-        if 'indent' in kwargs:
-            indent = kwargs['indent'] * " "
-            lines = [(indent + x) for x in msg.split("\n")]
-            msg = "\n".join(lines)
-        self.out.write(msg)
-        if not msg or msg[-1] != "\n":
-            self.out.write("\n")
-        self.out.flush()
-
-    def sourcecode(self, source):
-        lines = str(source).split("\n")
-        self.Print(".. sourcecode:: python")
-        self.Print()
-        for line in lines:
-            self.Print("   ", line)
-
-    def _sep(self, separator, args):
-        msg = self._getmsg(args)
-        sep = len(msg) * separator
-        self.Print()
-        self.Print(msg)
-        self.Print(sep)
-        self.Print()
-
-
-    def h1(self, *args):
-        self._sep('=', args)
-
-    def h2(self, *args):
-        self._sep('-', args)
-
-    def h3(self, *args):
-        self._sep('+', args)
-
-    def li(self, *args):
-        msg = self._getmsg(args)
-        sep = "* %s" %(msg)
-        self.Print(sep)
-
-    def dt(self, term):
-        self.Print("``%s``" % term)
-
-    def dd(self, doc):
-        self.Print(doc, indent=4)
-
-    def para(self, *args):
-        msg = self._getmsg(args)
-        self.Print(msg)
-
-    def add_internal_link(self, name, path):
-        relpath = path.new(ext=".html").relto(self.target.dirpath())
-        self.links.append((name, relpath))
-
-    def write_links(self):
-        self.Print()
-        self.Print(".. include:: links.txt")
-        for link in self.links:
-            key = link[0]
-            if key in self._all_links:
-                assert self._all_links[key] == link[1], (key, link[1])
-            else:
-                self._all_links[key] = link[1]
-
-    def write_all_links(cls, linkpath):
-        p = linkpath.new(basename="links.txt")
-        p_writer = RestWriter(p)
-        p_writer.out = p_writer.target.open("w")
-        for name, value in cls._all_links.items():
-            p_writer.Print(".. _`%s`: %s" % (name, value))
-        p_writer.out.close()
-        del p_writer.out
-    write_all_links = classmethod(write_all_links)
-
-    def make(self, **kwargs):
-        self.out = self.target.open("w")
-        self.makerest(**kwargs)
-        self.write_links()
-
-        self.out.close()
-        print "wrote", self.target
-        del self.out
-
-class PluginOverview(RestWriter):
-    def makerest(self, config):
-        plugindir = py._pydir.join('plugin')
-        for cat, specs in plugins:
-            pluginlist = specs.split()
-            self.h1(cat)
-            for name in pluginlist:
-                oneliner = externals.get(name, None)
-                docpath = self.target.dirpath(name).new(ext=".txt")
-                if oneliner is not None:
-                    htmlpath = docpath.new(ext='.html')
-                    self.para("%s_ (external) %s" %(name, oneliner))
-                    self.add_internal_link(name, htmlpath)
-                else:
-                    doc = PluginDoc(docpath)
-                    doc.make(config=config, name=name)
-                    self.add_internal_link(name, doc.target)
-                    if name in externals:
-                        self.para("%s_ (external) %s" %(name, doc.oneliner))
-                    else:
-                        self.para("%s_ %s" %(name, doc.oneliner))
-                self.Print()
-
-class HookSpec(RestWriter):
-    def makerest(self, config):
-        for module in config.pluginmanager.hook._hookspecs:
-            source = py.code.Source(module)
-            self.h1("hook specification sourcecode")
-            self.sourcecode(source)
-
-class PluginDoc(RestWriter):
-    def makerest(self, config, name):
-        config.pluginmanager.import_plugin(name)
-        plugin = config.pluginmanager.getplugin(name)
-        assert plugin is not None, plugin
-        print plugin
-        doc = plugin.__doc__.strip()
-        i = doc.find("\n")
-        if i == -1:
-            oneliner = doc
-            moduledoc = ""
-        else:
-            oneliner = doc[:i].strip()
-            moduledoc = doc[i+1:].strip()
-
-        self.name = oneliner # plugin.__name__.split(".")[-1]
-        self.oneliner = oneliner
-        self.moduledoc = moduledoc
-
-        #self.h1("%s plugin" % self.name) # : %s" %(self.name, self.oneliner))