Imported Upstream version 1.10.0 upstream/1.10.0
authorDongHun Kwak <dh0128.kwak@samsung.com>
Tue, 5 Mar 2024 09:28:28 +0000 (18:28 +0900)
committerDongHun Kwak <dh0128.kwak@samsung.com>
Tue, 5 Mar 2024 09:28:28 +0000 (18:28 +0900)
58 files changed:
.appveyor.yml [deleted file]
.github/workflows/main.yml [new file with mode: 0644]
.travis.yml [deleted file]
CHANGELOG [deleted file]
CHANGELOG.rst [new file with mode: 0644]
HOWTORELEASE.rst [deleted file]
MANIFEST.in
PKG-INFO [deleted file]
README.rst
RELEASING.rst [new file with mode: 0644]
doc/changelog.txt
py.egg-info/PKG-INFO [deleted file]
py.egg-info/SOURCES.txt [deleted file]
py.egg-info/dependency_links.txt [deleted file]
py.egg-info/not-zip-safe [deleted file]
py.egg-info/top_level.txt [deleted file]
py/_path/svnwc.py
py/_vendored_packages/apipkg-1.4.dist-info/DESCRIPTION.rst [deleted file]
py/_vendored_packages/apipkg-1.4.dist-info/INSTALLER [deleted file]
py/_vendored_packages/apipkg-1.4.dist-info/METADATA [deleted file]
py/_vendored_packages/apipkg-1.4.dist-info/RECORD [deleted file]
py/_vendored_packages/apipkg-1.4.dist-info/WHEEL [deleted file]
py/_vendored_packages/apipkg-1.4.dist-info/metadata.json [deleted file]
py/_vendored_packages/apipkg-1.4.dist-info/top_level.txt [deleted file]
py/_vendored_packages/apipkg-1.5.dist-info/INSTALLER [new file with mode: 0644]
py/_vendored_packages/apipkg-1.5.dist-info/METADATA [new file with mode: 0644]
py/_vendored_packages/apipkg-1.5.dist-info/RECORD [new file with mode: 0644]
py/_vendored_packages/apipkg-1.5.dist-info/REQUESTED [new file with mode: 0644]
py/_vendored_packages/apipkg-1.5.dist-info/WHEEL [new file with mode: 0644]
py/_vendored_packages/apipkg-1.5.dist-info/top_level.txt [new file with mode: 0644]
py/_vendored_packages/apipkg.py [deleted file]
py/_vendored_packages/apipkg/__init__.py [new file with mode: 0644]
py/_vendored_packages/apipkg/version.py [new file with mode: 0644]
py/_vendored_packages/iniconfig-1.0.0.dist-info/DESCRIPTION.rst [deleted file]
py/_vendored_packages/iniconfig-1.0.0.dist-info/INSTALLER [deleted file]
py/_vendored_packages/iniconfig-1.0.0.dist-info/METADATA [deleted file]
py/_vendored_packages/iniconfig-1.0.0.dist-info/RECORD [deleted file]
py/_vendored_packages/iniconfig-1.0.0.dist-info/WHEEL [deleted file]
py/_vendored_packages/iniconfig-1.0.0.dist-info/metadata.json [deleted file]
py/_vendored_packages/iniconfig-1.0.0.dist-info/top_level.txt [deleted file]
py/_vendored_packages/iniconfig-1.1.1.dist-info/INSTALLER [new file with mode: 0644]
py/_vendored_packages/iniconfig-1.1.1.dist-info/LICENSE [new file with mode: 0644]
py/_vendored_packages/iniconfig-1.1.1.dist-info/METADATA [new file with mode: 0644]
py/_vendored_packages/iniconfig-1.1.1.dist-info/RECORD [new file with mode: 0644]
py/_vendored_packages/iniconfig-1.1.1.dist-info/REQUESTED [new file with mode: 0644]
py/_vendored_packages/iniconfig-1.1.1.dist-info/WHEEL [new file with mode: 0644]
py/_vendored_packages/iniconfig-1.1.1.dist-info/top_level.txt [new file with mode: 0644]
py/_vendored_packages/iniconfig.py [deleted file]
py/_vendored_packages/iniconfig/__init__.py [new file with mode: 0644]
py/_vendored_packages/iniconfig/__init__.pyi [new file with mode: 0644]
py/_vendored_packages/iniconfig/py.typed [new file with mode: 0644]
py/_version.py [deleted file]
py/iniconfig.pyi
setup.cfg
tasks/__init__.py
tasks/vendoring.py
testing/code/test_source.py
testing/path/test_local.py

diff --git a/.appveyor.yml b/.appveyor.yml
deleted file mode 100644 (file)
index ecb6459..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-environment:
-  matrix:
-  # note: please use "tox --listenvs" to populate the build matrix below
-  - TOXENV: "py27-pytest29"
-  - TOXENV: "py27-pytest30"
-  - TOXENV: "py27-pytest31"
-  - TOXENV: "py35-pytest29"
-  - TOXENV: "py35-pytest30"
-  - TOXENV: "py35-pytest31"
-  - TOXENV: "py36-pytest29"
-  - TOXENV: "py36-pytest30"
-  - TOXENV: "py36-pytest31"
-  - TOXENV: "py37-pytest30"
-  - TOXENV: "py37-pytest31"
-
-install:
-  - echo Installed Pythons
-  - dir c:\Python*
-
-  - C:\Python37\python -m pip install --upgrade --pre tox
-
-build: false  # Not a C# project, build stuff at the test step instead.
-
-test_script:
-  - C:\Python37\python -m tox
-
-# We don't deploy anything on tags with AppVeyor, we use Travis instead, so we
-# might as well save resources
-skip_tags: true
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
new file mode 100644 (file)
index 0000000..0192a42
--- /dev/null
@@ -0,0 +1,68 @@
+name: build
+
+on: [push, pull_request]
+
+jobs:
+  build:
+
+    runs-on: ${{ matrix.os }}
+
+    strategy:
+      fail-fast: false
+      matrix:
+        python: ["2.7", "3.5", "3.6", "3.7", "3.8", "pypy3"]
+        os: [ubuntu-latest, windows-latest]
+        include:
+          - python: "2.7"
+            tox_env: "py27-pytest30"
+          - python: "3.5"
+            tox_env: "py35-pytest30"
+          - python: "3.6"
+            tox_env: "py36-pytest30"
+          - python: "3.7"
+            tox_env: "py37-pytest30"
+          - python: "3.8"
+            tox_env: "py38-pytest30"
+          - python: "pypy3"
+            tox_env: "pypy3-pytest30"
+
+    steps:
+    - uses: actions/checkout@v1
+    - name: Set up Python
+      uses: actions/setup-python@v1
+      with:
+        python-version: ${{ matrix.python }}
+    - name: Install tox
+      run: |
+        python -m pip install --upgrade pip
+        pip install tox
+    - name: Test
+      run: |
+        tox -e ${{ matrix.tox_env }}  
+
+  deploy:
+
+    if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags')
+
+    runs-on: ubuntu-latest
+
+    needs: build
+
+    steps:
+    - uses: actions/checkout@v1
+    - name: Set up Python
+      uses: actions/setup-python@v1
+      with:
+        python-version: "3.7"
+    - name: Install wheel
+      run: |
+        python -m pip install --upgrade pip
+        pip install wheel
+    - name: Build package
+      run: |
+        python setup.py sdist bdist_wheel
+    - name: Publish package to PyPI
+      uses: pypa/gh-action-pypi-publish@master
+      with:
+        user: __token__
+        password: ${{ secrets.pypi_token }}
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644 (file)
index 25fb8ca..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-dist: xenial
-language: python
-
-python:
-  - '2.7'
-  - '3.5'
-  - '3.6'
-  - '3.7'
-  # - 'pypy'
-  - 'pypy3'
-
-env:
-  global:
-    - COVERAGE_PROCESS_START=$PWD/tox.ini
-  matrix:
-    - DEPS="pytest~=2.9.0"
-    - DEPS="pytest~=3.0.0"
-    #- DEPS="pytest~=3.1.0"
-
-stages:
-  - name: test
-    if: tag IS NOT present
-  - name: deploy
-    if: repo = pytest-dev/py AND tag IS present
-
-matrix:
-  include:
-    - python: '2.7'
-      # using a different option due to pytest-addopts pytester issues
-      env: PYTEST_XADDOPTS="-n auto --runslowtests" DEPS="pytest~=3.0.0 pytest-xdist<1.25 pytest-forked<0.3"
-
-    - stage: deploy
-      python: '3.6'
-      env:
-      install: pip install -U setuptools setuptools_scm
-      script: skip
-      deploy:
-        provider: pypi
-        user: nicoddemus
-        distributions: sdist bdist_wheel
-        skip_upload_docs: true
-        password:
-          secure: VNYW/sZoD+9DzKCe6vANNXXJR7jP7rwySafQ33N1jAnCrdylQjEN/p6tSfUe8jDi3wDpLPL9h8pwfxuUT7CRxglHov3Qe7zSeywixvHan5aFahQiQ8+gucYIM7wITHH3oQs7jN35pnhdnF+QlW2+eDCL6qOLU5XwuRhsDKXjQ/hUWR5hlX5EniD1gzyKEf6j1YCpST87tKpeLwVEYEmsucdkUZuXhxDtyaWQHWiPsLWwh/slQtUJEHeLF26r8UxFy0RiGne9jR+CzRfH5ktcA9/pArvp4VuwOii+1TDxVSYP7+I8Z+eUKN9JBg12QLaHwoIN/8J+MvHCkuf+OGSLM3sEyNRJGDev372xg3K7ylIkeeK4WXirKEp2ojgN8tniloDjnwdu/gPWBnrXuooA60tNoByHFa8KbMZAr2B2sQeMxD4VZGr1N8l0rX4gRTrwvdk3i3ulLKVSwkXaGn+GrfZTTboa7dEnpuma8tv1niNCSpStYIy7atS8129+5ijV3OC8DzOMh/rVbO9WsDb/RPG3yjFiDvEJPIPeE0l/m5u42QBqtdZSS2ia7UWTJBiEY09uFMTRmH5hhE/1aiYBbvAztf5CReUbeKdSQz3L8TTSZqewtFZmXTkX97/xQnrEpsnGezIM2DNuMEuQG3MxGkNCxwbQKpx/bkHdrD75yMk=
-        on:
-          tags: true
-          repo: pytest-dev/py
-
-  exclude:
-    - python: '3.7'
-      env: DEPS="pytest~=2.9.0"
-
-  allow_failures:
-  - python: 'pypy'
-  - python: 'pypy3'
-
-install:
-  - pip install -U coverage coverage-enable-subprocess pip setuptools setuptools_scm
-  - pip install $DEPS
-  - pip install -U . --force-reinstall
-
-script:
-  - coverage run -m pytest --lsof $PYTEST_XADDOPTS
-
-after_success:
-  - coverage combine
-  - coverage report -m
-  - coverage xml
-  - bash <(curl -s https://codecov.io/bash) -Z -X gcov -X coveragepy -X search -X xcode -X gcovout -X fix -f coverage.xml -e TRAVIS_PYTHON_VERSION
diff --git a/CHANGELOG b/CHANGELOG
deleted file mode 100644 (file)
index c74ee69..0000000
--- a/CHANGELOG
+++ /dev/null
@@ -1,1222 +0,0 @@
-1.9.0 (2020-06-24)
-==================
-
-- Add type annotation stubs for the following modules:
-
-  * ``py.error``
-  * ``py.iniconfig``
-  * ``py.path`` (not including SVN paths)
-  * ``py.io``
-  * ``py.xml``
-
-  There are no plans to type other modules at this time.
-
-  The type annotations are provided in external .pyi files, not inline in the
-  code, and may therefore contain small errors or omissions. If you use ``py``
-  in conjunction with a type checker, and encounter any type errors you believe
-  should be accepted, please report it in an issue.
-
-1.8.2 (2020-06-15)
-==================
-
-- On Windows, ``py.path.local``s which differ only in case now have the same
-  Python hash value. Previously, such paths were considered equal but had
-  different hashes, which is not allowed and breaks the assumptions made by
-  dicts, sets and other users of hashes.
-
-1.8.1 (2019-12-27)
-==================
-
-- Handle ``FileNotFoundError`` when trying to import pathlib in ``path.common``
-  on Python 3.4 (#207).
-
-- ``py.path.local.samefile`` now works correctly in Python 3 on Windows when dealing with symlinks.
-
-1.8.0 (2019-02-21)
-==================
-
-- add ``"importlib"`` pyimport mode for python3.5+, allowing unimportable test suites
-  to contain identically named modules.
-
-- fix ``LocalPath.as_cwd()`` not calling ``os.chdir()`` with ``None``, when
-  being invoked from a non-existing directory.
-
-
-1.7.0 (2018-10-11)
-==================
-
-- fix #174: use ``shutil.get_terminal_size()`` in Python 3.3+ to determine the size of the
-  terminal, which produces more accurate results than the previous method.
-
-- fix pytest-dev/pytest#2042: introduce new ``PY_IGNORE_IMPORTMISMATCH`` environment variable
-  that suppresses ``ImportMismatchError`` exceptions when set to ``1``.
-
-
-1.6.0 (2018-08-27)
-==================
-
-- add ``TerminalWriter.width_of_current_line`` (i18n version of
-  ``TerminalWriter.chars_on_current_line``), a read-only property
-  that tracks how wide the current line is, attempting to take
-  into account international characters in the calculation.
-
-1.5.4 (2018-06-27)
-==================
-
-- fix pytest-dev/pytest#3451: don't make assumptions about fs case sensitivity
-  in ``make_numbered_dir``.
-
-1.5.3
-=====
-
-- fix #179: ensure we can support 'from py.error import ...'
-
-1.5.2
-=====
-
-- fix #169, #170: error importing py.log on Windows: no module named ``syslog``.
-
-1.5.1
-=====
-
-- fix #167 - prevent pip from installing py in unsupported Python versions.
-
-1.5.0
-=====
-
-NOTE: **this release has been removed from PyPI** due to missing package
-metadata which caused a number of problems to py26 and py33 users.
-This issue was fixed in the 1.5.1 release.
-
-- python 2.6 and 3.3 are no longer supported
-- deprecate py.std and remove all internal uses
-- fix #73 turn py.error into an actual module
-- path join to / no longer produces leading double slashes
-- fix #82 - remove unsupportable aliases
-- fix python37 compatibility of path.sysfind on windows by correctly replacing vars
-- turn iniconfig and apipkg into vendored packages and ease de-vendoring for distributions
-- fix #68 remove invalid py.test.ensuretemp references
-- fix #25 - deprecate path.listdir(sort=callable)
-- add ``TerminalWriter.chars_on_current_line`` read-only property that tracks how many characters
-  have been written to the current line.
-
-1.4.34
-====================================================================
-
-- fix issue119 / pytest issue708 where tmpdir may fail to make numbered directories
-  when the filesystem is case-insensitive.
-
-1.4.33
-====================================================================
-
-- avoid imports in calls to py.path.local().fnmatch(). Thanks Andreas Pelme for
-  the PR.
-
-- fix issue106: Naive unicode encoding when calling fspath() in python2. Thanks Tiago Nobrega for the PR.
-
-- fix issue110: unittest.TestCase.assertWarns fails with py imported.
-
-1.4.32
-====================================================================
-
-- fix issue70: added ability to copy all stat info in py.path.local.copy.
-
-- make TerminalWriter.fullwidth a property.  This results in the correct
-  value when the terminal gets resized.
-
-- update supported html tags to include recent additions.
-  Thanks Denis Afonso for the PR.
-
-- Remove internal code in ``Source.compile`` meant to support earlier Python 3 versions that produced the side effect
-  of leaving ``None`` in ``sys.modules`` when called (see pytest-dev/pytest#2103).
-  Thanks Bruno Oliveira for the PR.
-
-1.4.31
-==================================================
-
-- fix local().copy(dest, mode=True) to also work
-  with unicode.
-
-- pass better error message with svn EEXIST paths
-
-1.4.30
-==================================================
-
-- fix issue68 an assert with a  multiline list comprehension
-  was not reported correctly. Thanks Henrik Heibuerger.
-
-
-1.4.29
-==================================================
-
-- fix issue55: revert a change to the statement finding algorithm
-  which is used by pytest for generating tracebacks.
-  Thanks Daniel Hahler for initial analysis.
-
-- fix pytest issue254 for when traceback rendering can't
-  find valid source code.  Thanks Ionel Cristian Maries.
-
-
-1.4.28
-==================================================
-
-- fix issue64 -- dirpath regression when "abs=True" is passed.
-  Thanks Gilles Dartiguelongue.
-
-1.4.27
-==================================================
-
-- fix issue59: point to new repo site
-
-- allow a new ensuresyspath="append" mode for py.path.local.pyimport()
-  so that a neccessary import path is appended instead of prepended to
-  sys.path
-
-- strike undocumented, untested argument to py.path.local.pypkgpath
-
-- speed up py.path.local.dirpath by a factor of 10
-
-1.4.26
-==================================================
-
-- avoid calling normpath twice in py.path.local
-
-- py.builtin._reraise properly reraises under Python3 now.
-
-- fix issue53 - remove module index, thanks jenisys.
-
-- allow posix path separators when "fnmatch" is called.
-  Thanks Christian Long for the complete PR.
-
-1.4.25
-==================================================
-
-- fix issue52: vaguely fix py25 compat of py.path.local (it's not
-  officially supported), also fix docs
-
-- fix pytest issue 589: when checking if we have a recursion error
-  check for the specific "maximum recursion depth" text of the exception.
-
-1.4.24
-==================================================
-
-- Fix retrieving source when an else: line has an other statement on
-  the same line.
-
-- add localpath read_text/write_text/read_bytes/write_bytes methods
-  as shortcuts and clearer bytes/text interfaces for read/write.
-  Adapted from a PR from Paul Moore.
-
-
-1.4.23
-==================================================
-
-- use newer apipkg version which makes attribute access on
-  alias modules resolve to None rather than an ImportError.
-  This helps with code that uses inspect.getframeinfo()
-  on py34 which causes a complete walk on sys.modules
-  thus triggering the alias module to resolve and blowing
-  up with ImportError.  The negative side is that something
-  like "py.test.X" will now result in None instead of "importerror: pytest"
-  if pytest is not installed.  But you shouldn't import "py.test"
-  anyway anymore.
-
-- adapt one svn test to only check for any exception instead
-  of specific ones because different svn versions cause different
-  errors and we don't care.
-
-
-1.4.22
-==================================================
-
-- refactor class-level registry on ForkedFunc child start/finish
-  event to become instance based (i.e. passed into the constructor)
-
-1.4.21
-==================================================
-
-- ForkedFunc now has class-level register_on_start/on_exit()
-  methods to allow adding information in the boxed process.
-  Thanks Marc Schlaich.
-
-- ForkedFunc in the child opens in "auto-flush" mode for
-  stdout/stderr so that when a subprocess dies you can see
-  its output even if it didn't flush itself.
-
-- refactor traceback generation in light of pytest issue 364
-  (shortening tracebacks).   you can now set a new traceback style
-  on a per-entry basis such that a caller can force entries to be
-  isplayed as short or long entries.
-
-- win32: py.path.local.sysfind(name) will preferrably return files with
-  extensions so that if "X" and "X.bat" or "X.exe" is on the PATH,
-  one of the latter two will be returned.
-
-1.4.20
-==================================================
-
-- ignore unicode decode errors in xmlescape.  Thanks Anatoly Bubenkoff.
-
-- on python2 modify traceback.format_exception_only to match python3
-  behaviour, namely trying to print unicode for Exception instances
-
-- use a safer way for serializing exception reports (helps to fix
-  pytest issue413)
-
-Changes between 1.4.18 and 1.4.19
-==================================================
-
-- merge in apipkg fixes
-
-- some micro-optimizations in py/_code/code.py for speeding
-  up pytest runs.  Thanks Alex Gaynor for initiative.
-
-- check PY_COLORS=1 or PY_COLORS=0 to force coloring/not-coloring
-  for py.io.TerminalWriter() independently from capabilities
-  of the output file.  Thanks Marc Abramowitz for the PR.
-
-- some fixes to unicode handling in assertion handling.
-  Thanks for the PR to Floris Bruynooghe.  (This helps
-  to fix pytest issue 319).
-
-- depend on setuptools presence, remove distribute_setup
-
-Changes between 1.4.17 and 1.4.18
-==================================================
-
-- introduce path.ensure_dir() as a synonym for ensure(..., dir=1)
-
-- some unicode/python3 related fixes wrt to path manipulations
-  (if you start passing unicode particular in py2 you might
-  still get problems, though)
-
-Changes between 1.4.16 and 1.4.17
-==================================================
-
-- make py.io.TerminalWriter() prefer colorama if it is available
-  and avoid empty lines when separator-lines are printed by
-  being defensive and reducing the working terminalwidth by 1
-
-- introduce optional "expanduser" argument to py.path.local
-  to that local("~", expanduser=True) gives the home
-  directory of "user".
-
-Changes between 1.4.15 and 1.4.16
-==================================================
-
-- fix issue35 - define __gt__ ordering between a local path
-  and strings
-
-- fix issue36 - make chdir() work even if os.getcwd() fails.
-
-- add path.exists/isdir/isfile/islink shortcuts
-
-- introduce local path.as_cwd() context manager.
-
-- introduce p.write(ensure=1) and p.open(ensure=1)
-  where ensure triggers creation of neccessary parent
-  dirs.
-
-
-Changes between 1.4.14 and 1.4.15
-==================================================
-
-- majorly speed up some common calling patterns with
-  LocalPath.listdir()/join/check/stat functions considerably.
-
-- fix an edge case with fnmatch where a glob style pattern appeared
-  in an absolute path.
-
-Changes between 1.4.13 and 1.4.14
-==================================================
-
-- fix dupfile to work with files that don't
-  carry a mode. Thanks Jason R. Coombs.
-
-Changes between 1.4.12 and 1.4.13
-==================================================
-
-- fix getting statementrange/compiling a file ending
-  in a comment line without newline (on python2.5)
-- for local paths you can pass "mode=True" to a copy()
-  in order to copy permission bits (underlying mechanism
-  is using shutil.copymode)
-- add paths arguments to py.path.local.sysfind to restrict
-  search to the diretories in the path.
-- add isdir/isfile/islink to path.stat() objects allowing to perform
-  multiple checks without calling out multiple times
-- drop py.path.local.__new__ in favour of a simpler __init__
-- iniconfig: allow "name:value" settings in config files, no space after
-  "name" required
-- fix issue 27 - NameError in unlikely untested case of saferepr
-
-
-Changes between 1.4.11 and 1.4.12
-==================================================
-
-- fix python2.4 support - for pre-AST interpreters re-introduce
-  old way to find statements in exceptions (closes pytest issue 209)
-- add tox.ini to distribution
-- fix issue23 - print *,** args information in tracebacks,
-  thanks Manuel Jacob
-
-
-Changes between 1.4.10 and 1.4.11
-==================================================
-
-- use _ast to determine statement ranges when printing tracebacks -
-  avoiding multi-second delays on some large test modules
-- fix an internal test to not use class-denoted pytest_funcarg__
-- fix a doc link to bug tracker
-- try to make terminal.write() printing more robust against
-  unicodeencode/decode problems, amend according test
-- introduce py.builtin.text and py.builtin.bytes
-  to point to respective str/unicode (py2) and bytes/str (py3) types
-- fix error handling on win32/py33 for ENODIR
-
-Changes between 1.4.9 and 1.4.10
-==================================================
-
-- terminalwriter: default to encode to UTF8 if no encoding is defined
-  on the output stream
-- issue22: improve heuristic for finding the statementrange in exceptions
-
-Changes between 1.4.8 and 1.4.9
-==================================================
-
-- fix bug of path.visit() which would not recognize glob-style patterns
-  for the "rec" recursion argument
-- changed iniconfig parsing to better conform, now the chars ";"
-  and "#" only mark a comment at the stripped start of a line
-- include recent apipkg-1.2
-- change internal terminalwriter.line/reline logic to more nicely
-  support file spinners
-
-Changes between 1.4.7 and 1.4.8
-==================================================
-
-- fix issue 13 - correct handling of the tag name object in xmlgen
-- fix issue 14 - support raw attribute values in xmlgen
-- fix windows terminalwriter printing/re-line problem
-- update distribute_setup.py to 0.6.27
-
-Changes between 1.4.6 and 1.4.7
-==================================================
-
-- fix issue11 - own test failure with python3.3 / Thanks Benjamin Peterson
-- help fix pytest issue 102
-
-Changes between 1.4.5 and 1.4.6
-==================================================
-
-- help to fix pytest issue99: unify output of
-  ExceptionInfo.getrepr(style="native") with ...(style="long")
-- fix issue7: source.getstatementrange() now raises proper error
-  if no valid statement can be found
-- fix issue8: fix code and tests of svnurl/svnwc to work on subversion 1.7 -
-  note that path.status(updates=1) will not properly work svn-17's status
-  --xml output is broken.
-- make source.getstatementrange() more resilent about non-python code frames
-  (as seen from jnja2)
-- make trackeback recursion detection more resilent
-  about the eval magic of a decorator library
-- iniconfig: add support for ; as comment starter
-- properly handle lists in xmlgen on python3
-- normalize py.code.getfslineno(obj) to always return a (string, int) tuple
-  defaulting to ("", -1) respectively if no source code can be found for obj.
-
-Changes between 1.4.4 and 1.4.5
-==================================================
-
-- improve some unicode handling in terminalwriter and capturing
-  (used by pytest)
-
-Changes between 1.4.3 and 1.4.4
-==================================================
-
-- a few fixes and assertion related refinements for pytest-2.1
-- guard py.code.Code and getfslineno against bogus input
-  and make py.code.Code objects for object instance
-  by looking up their __call__ function.
-- make exception presentation robust against invalid current cwd
-
-Changes between 1.4.2 and 1.4.3
-==================================================
-
-- fix terminal coloring issue for skipped tests (thanks Amaury)
-- fix issue4 - large calls to ansi_print (thanks Amaury)
-
-Changes between 1.4.1 and 1.4.2
-==================================================
-
-- fix (pytest) issue23 - tmpdir argument now works on Python3.2 and WindowsXP
-  (which apparently starts to offer os.symlink now)
-
-- better error message for syntax errors from compiled code
-
-- small fix to better deal with (un-)colored terminal output on windows
-
-Changes between 1.4.0 and 1.4.1
-==================================================
-
-- fix issue1 - py.error.* classes to be pickleable
-
-- fix issue2 - on windows32 use PATHEXT as the list of potential
-  extensions to find find binaries with py.path.local.sysfind(commandname)
-
-- fix (pytest-) issue10 and refine assertion reinterpretation
-  to avoid breaking if the __nonzero__ of an object fails
-
-- fix (pytest-) issue17 where python3 does not like "import *"
-  leading to misrepresentation of import-errors in test modules
-
-- fix py.error.* attribute pypy access issue
-
-- allow path.samefile(arg) to succeed when arg is a relative filename
-
-- fix (pytest-) issue20 path.samefile(relpath) works as expected now
-
-- fix (pytest-) issue8 len(long_list) now shows the lenght of the list
-
-Changes between 1.3.4 and 1.4.0
-==================================================
-
-- py.test was moved to a separate "pytest" package. What remains is
-  a stub hook which will proxy ``import py.test`` to ``pytest``.
-- all command line tools ("py.cleanup/lookup/countloc/..." moved
-  to "pycmd" package)
-- removed the old and deprecated "py.magic" namespace
-- use apipkg-1.1 and make py.apipkg.initpkg|ApiModule available
-- add py.iniconfig module for brain-dead easy ini-config file parsing
-- introduce py.builtin.any()
-- path objects have a .dirname attribute now (equivalent to
-  os.path.dirname(path))
-- path.visit() accepts breadthfirst (bf) and sort options
-- remove deprecated py.compat namespace
-
-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]
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
new file mode 100644 (file)
index 0000000..90e5905
--- /dev/null
@@ -0,0 +1,1229 @@
+1.10.0 (2020-12-12)
+===================
+
+- Fix a regular expression DoS vulnerability in the py.path.svnwc SVN blame functionality (CVE-2020-29651)
+- Update vendored apipkg: 1.4 => 1.5
+- Update vendored iniconfig: 1.0.0 => 1.1.1
+
+1.9.0 (2020-06-24)
+==================
+
+- Add type annotation stubs for the following modules:
+
+  * ``py.error``
+  * ``py.iniconfig``
+  * ``py.path`` (not including SVN paths)
+  * ``py.io``
+  * ``py.xml``
+
+  There are no plans to type other modules at this time.
+
+  The type annotations are provided in external .pyi files, not inline in the
+  code, and may therefore contain small errors or omissions. If you use ``py``
+  in conjunction with a type checker, and encounter any type errors you believe
+  should be accepted, please report it in an issue.
+
+1.8.2 (2020-06-15)
+==================
+
+- On Windows, ``py.path.local``s which differ only in case now have the same
+  Python hash value. Previously, such paths were considered equal but had
+  different hashes, which is not allowed and breaks the assumptions made by
+  dicts, sets and other users of hashes.
+
+1.8.1 (2019-12-27)
+==================
+
+- Handle ``FileNotFoundError`` when trying to import pathlib in ``path.common``
+  on Python 3.4 (#207).
+
+- ``py.path.local.samefile`` now works correctly in Python 3 on Windows when dealing with symlinks.
+
+1.8.0 (2019-02-21)
+==================
+
+- add ``"importlib"`` pyimport mode for python3.5+, allowing unimportable test suites
+  to contain identically named modules.
+
+- fix ``LocalPath.as_cwd()`` not calling ``os.chdir()`` with ``None``, when
+  being invoked from a non-existing directory.
+
+
+1.7.0 (2018-10-11)
+==================
+
+- fix #174: use ``shutil.get_terminal_size()`` in Python 3.3+ to determine the size of the
+  terminal, which produces more accurate results than the previous method.
+
+- fix pytest-dev/pytest#2042: introduce new ``PY_IGNORE_IMPORTMISMATCH`` environment variable
+  that suppresses ``ImportMismatchError`` exceptions when set to ``1``.
+
+
+1.6.0 (2018-08-27)
+==================
+
+- add ``TerminalWriter.width_of_current_line`` (i18n version of
+  ``TerminalWriter.chars_on_current_line``), a read-only property
+  that tracks how wide the current line is, attempting to take
+  into account international characters in the calculation.
+
+1.5.4 (2018-06-27)
+==================
+
+- fix pytest-dev/pytest#3451: don't make assumptions about fs case sensitivity
+  in ``make_numbered_dir``.
+
+1.5.3
+=====
+
+- fix #179: ensure we can support 'from py.error import ...'
+
+1.5.2
+=====
+
+- fix #169, #170: error importing py.log on Windows: no module named ``syslog``.
+
+1.5.1
+=====
+
+- fix #167 - prevent pip from installing py in unsupported Python versions.
+
+1.5.0
+=====
+
+NOTE: **this release has been removed from PyPI** due to missing package
+metadata which caused a number of problems to py26 and py33 users.
+This issue was fixed in the 1.5.1 release.
+
+- python 2.6 and 3.3 are no longer supported
+- deprecate py.std and remove all internal uses
+- fix #73 turn py.error into an actual module
+- path join to / no longer produces leading double slashes
+- fix #82 - remove unsupportable aliases
+- fix python37 compatibility of path.sysfind on windows by correctly replacing vars
+- turn iniconfig and apipkg into vendored packages and ease de-vendoring for distributions
+- fix #68 remove invalid py.test.ensuretemp references
+- fix #25 - deprecate path.listdir(sort=callable)
+- add ``TerminalWriter.chars_on_current_line`` read-only property that tracks how many characters
+  have been written to the current line.
+
+1.4.34
+====================================================================
+
+- fix issue119 / pytest issue708 where tmpdir may fail to make numbered directories
+  when the filesystem is case-insensitive.
+
+1.4.33
+====================================================================
+
+- avoid imports in calls to py.path.local().fnmatch(). Thanks Andreas Pelme for
+  the PR.
+
+- fix issue106: Naive unicode encoding when calling fspath() in python2. Thanks Tiago Nobrega for the PR.
+
+- fix issue110: unittest.TestCase.assertWarns fails with py imported.
+
+1.4.32
+====================================================================
+
+- fix issue70: added ability to copy all stat info in py.path.local.copy.
+
+- make TerminalWriter.fullwidth a property.  This results in the correct
+  value when the terminal gets resized.
+
+- update supported html tags to include recent additions.
+  Thanks Denis Afonso for the PR.
+
+- Remove internal code in ``Source.compile`` meant to support earlier Python 3 versions that produced the side effect
+  of leaving ``None`` in ``sys.modules`` when called (see pytest-dev/pytest#2103).
+  Thanks Bruno Oliveira for the PR.
+
+1.4.31
+==================================================
+
+- fix local().copy(dest, mode=True) to also work
+  with unicode.
+
+- pass better error message with svn EEXIST paths
+
+1.4.30
+==================================================
+
+- fix issue68 an assert with a  multiline list comprehension
+  was not reported correctly. Thanks Henrik Heibuerger.
+
+
+1.4.29
+==================================================
+
+- fix issue55: revert a change to the statement finding algorithm
+  which is used by pytest for generating tracebacks.
+  Thanks Daniel Hahler for initial analysis.
+
+- fix pytest issue254 for when traceback rendering can't
+  find valid source code.  Thanks Ionel Cristian Maries.
+
+
+1.4.28
+==================================================
+
+- fix issue64 -- dirpath regression when "abs=True" is passed.
+  Thanks Gilles Dartiguelongue.
+
+1.4.27
+==================================================
+
+- fix issue59: point to new repo site
+
+- allow a new ensuresyspath="append" mode for py.path.local.pyimport()
+  so that a neccessary import path is appended instead of prepended to
+  sys.path
+
+- strike undocumented, untested argument to py.path.local.pypkgpath
+
+- speed up py.path.local.dirpath by a factor of 10
+
+1.4.26
+==================================================
+
+- avoid calling normpath twice in py.path.local
+
+- py.builtin._reraise properly reraises under Python3 now.
+
+- fix issue53 - remove module index, thanks jenisys.
+
+- allow posix path separators when "fnmatch" is called.
+  Thanks Christian Long for the complete PR.
+
+1.4.25
+==================================================
+
+- fix issue52: vaguely fix py25 compat of py.path.local (it's not
+  officially supported), also fix docs
+
+- fix pytest issue 589: when checking if we have a recursion error
+  check for the specific "maximum recursion depth" text of the exception.
+
+1.4.24
+==================================================
+
+- Fix retrieving source when an else: line has an other statement on
+  the same line.
+
+- add localpath read_text/write_text/read_bytes/write_bytes methods
+  as shortcuts and clearer bytes/text interfaces for read/write.
+  Adapted from a PR from Paul Moore.
+
+
+1.4.23
+==================================================
+
+- use newer apipkg version which makes attribute access on
+  alias modules resolve to None rather than an ImportError.
+  This helps with code that uses inspect.getframeinfo()
+  on py34 which causes a complete walk on sys.modules
+  thus triggering the alias module to resolve and blowing
+  up with ImportError.  The negative side is that something
+  like "py.test.X" will now result in None instead of "importerror: pytest"
+  if pytest is not installed.  But you shouldn't import "py.test"
+  anyway anymore.
+
+- adapt one svn test to only check for any exception instead
+  of specific ones because different svn versions cause different
+  errors and we don't care.
+
+
+1.4.22
+==================================================
+
+- refactor class-level registry on ForkedFunc child start/finish
+  event to become instance based (i.e. passed into the constructor)
+
+1.4.21
+==================================================
+
+- ForkedFunc now has class-level register_on_start/on_exit()
+  methods to allow adding information in the boxed process.
+  Thanks Marc Schlaich.
+
+- ForkedFunc in the child opens in "auto-flush" mode for
+  stdout/stderr so that when a subprocess dies you can see
+  its output even if it didn't flush itself.
+
+- refactor traceback generation in light of pytest issue 364
+  (shortening tracebacks).   you can now set a new traceback style
+  on a per-entry basis such that a caller can force entries to be
+  isplayed as short or long entries.
+
+- win32: py.path.local.sysfind(name) will preferrably return files with
+  extensions so that if "X" and "X.bat" or "X.exe" is on the PATH,
+  one of the latter two will be returned.
+
+1.4.20
+==================================================
+
+- ignore unicode decode errors in xmlescape.  Thanks Anatoly Bubenkoff.
+
+- on python2 modify traceback.format_exception_only to match python3
+  behaviour, namely trying to print unicode for Exception instances
+
+- use a safer way for serializing exception reports (helps to fix
+  pytest issue413)
+
+Changes between 1.4.18 and 1.4.19
+==================================================
+
+- merge in apipkg fixes
+
+- some micro-optimizations in py/_code/code.py for speeding
+  up pytest runs.  Thanks Alex Gaynor for initiative.
+
+- check PY_COLORS=1 or PY_COLORS=0 to force coloring/not-coloring
+  for py.io.TerminalWriter() independently from capabilities
+  of the output file.  Thanks Marc Abramowitz for the PR.
+
+- some fixes to unicode handling in assertion handling.
+  Thanks for the PR to Floris Bruynooghe.  (This helps
+  to fix pytest issue 319).
+
+- depend on setuptools presence, remove distribute_setup
+
+Changes between 1.4.17 and 1.4.18
+==================================================
+
+- introduce path.ensure_dir() as a synonym for ensure(..., dir=1)
+
+- some unicode/python3 related fixes wrt to path manipulations
+  (if you start passing unicode particular in py2 you might
+  still get problems, though)
+
+Changes between 1.4.16 and 1.4.17
+==================================================
+
+- make py.io.TerminalWriter() prefer colorama if it is available
+  and avoid empty lines when separator-lines are printed by
+  being defensive and reducing the working terminalwidth by 1
+
+- introduce optional "expanduser" argument to py.path.local
+  to that local("~", expanduser=True) gives the home
+  directory of "user".
+
+Changes between 1.4.15 and 1.4.16
+==================================================
+
+- fix issue35 - define __gt__ ordering between a local path
+  and strings
+
+- fix issue36 - make chdir() work even if os.getcwd() fails.
+
+- add path.exists/isdir/isfile/islink shortcuts
+
+- introduce local path.as_cwd() context manager.
+
+- introduce p.write(ensure=1) and p.open(ensure=1)
+  where ensure triggers creation of neccessary parent
+  dirs.
+
+
+Changes between 1.4.14 and 1.4.15
+==================================================
+
+- majorly speed up some common calling patterns with
+  LocalPath.listdir()/join/check/stat functions considerably.
+
+- fix an edge case with fnmatch where a glob style pattern appeared
+  in an absolute path.
+
+Changes between 1.4.13 and 1.4.14
+==================================================
+
+- fix dupfile to work with files that don't
+  carry a mode. Thanks Jason R. Coombs.
+
+Changes between 1.4.12 and 1.4.13
+==================================================
+
+- fix getting statementrange/compiling a file ending
+  in a comment line without newline (on python2.5)
+- for local paths you can pass "mode=True" to a copy()
+  in order to copy permission bits (underlying mechanism
+  is using shutil.copymode)
+- add paths arguments to py.path.local.sysfind to restrict
+  search to the diretories in the path.
+- add isdir/isfile/islink to path.stat() objects allowing to perform
+  multiple checks without calling out multiple times
+- drop py.path.local.__new__ in favour of a simpler __init__
+- iniconfig: allow "name:value" settings in config files, no space after
+  "name" required
+- fix issue 27 - NameError in unlikely untested case of saferepr
+
+
+Changes between 1.4.11 and 1.4.12
+==================================================
+
+- fix python2.4 support - for pre-AST interpreters re-introduce
+  old way to find statements in exceptions (closes pytest issue 209)
+- add tox.ini to distribution
+- fix issue23 - print *,** args information in tracebacks,
+  thanks Manuel Jacob
+
+
+Changes between 1.4.10 and 1.4.11
+==================================================
+
+- use _ast to determine statement ranges when printing tracebacks -
+  avoiding multi-second delays on some large test modules
+- fix an internal test to not use class-denoted pytest_funcarg__
+- fix a doc link to bug tracker
+- try to make terminal.write() printing more robust against
+  unicodeencode/decode problems, amend according test
+- introduce py.builtin.text and py.builtin.bytes
+  to point to respective str/unicode (py2) and bytes/str (py3) types
+- fix error handling on win32/py33 for ENODIR
+
+Changes between 1.4.9 and 1.4.10
+==================================================
+
+- terminalwriter: default to encode to UTF8 if no encoding is defined
+  on the output stream
+- issue22: improve heuristic for finding the statementrange in exceptions
+
+Changes between 1.4.8 and 1.4.9
+==================================================
+
+- fix bug of path.visit() which would not recognize glob-style patterns
+  for the "rec" recursion argument
+- changed iniconfig parsing to better conform, now the chars ";"
+  and "#" only mark a comment at the stripped start of a line
+- include recent apipkg-1.2
+- change internal terminalwriter.line/reline logic to more nicely
+  support file spinners
+
+Changes between 1.4.7 and 1.4.8
+==================================================
+
+- fix issue 13 - correct handling of the tag name object in xmlgen
+- fix issue 14 - support raw attribute values in xmlgen
+- fix windows terminalwriter printing/re-line problem
+- update distribute_setup.py to 0.6.27
+
+Changes between 1.4.6 and 1.4.7
+==================================================
+
+- fix issue11 - own test failure with python3.3 / Thanks Benjamin Peterson
+- help fix pytest issue 102
+
+Changes between 1.4.5 and 1.4.6
+==================================================
+
+- help to fix pytest issue99: unify output of
+  ExceptionInfo.getrepr(style="native") with ...(style="long")
+- fix issue7: source.getstatementrange() now raises proper error
+  if no valid statement can be found
+- fix issue8: fix code and tests of svnurl/svnwc to work on subversion 1.7 -
+  note that path.status(updates=1) will not properly work svn-17's status
+  --xml output is broken.
+- make source.getstatementrange() more resilent about non-python code frames
+  (as seen from jnja2)
+- make trackeback recursion detection more resilent
+  about the eval magic of a decorator library
+- iniconfig: add support for ; as comment starter
+- properly handle lists in xmlgen on python3
+- normalize py.code.getfslineno(obj) to always return a (string, int) tuple
+  defaulting to ("", -1) respectively if no source code can be found for obj.
+
+Changes between 1.4.4 and 1.4.5
+==================================================
+
+- improve some unicode handling in terminalwriter and capturing
+  (used by pytest)
+
+Changes between 1.4.3 and 1.4.4
+==================================================
+
+- a few fixes and assertion related refinements for pytest-2.1
+- guard py.code.Code and getfslineno against bogus input
+  and make py.code.Code objects for object instance
+  by looking up their __call__ function.
+- make exception presentation robust against invalid current cwd
+
+Changes between 1.4.2 and 1.4.3
+==================================================
+
+- fix terminal coloring issue for skipped tests (thanks Amaury)
+- fix issue4 - large calls to ansi_print (thanks Amaury)
+
+Changes between 1.4.1 and 1.4.2
+==================================================
+
+- fix (pytest) issue23 - tmpdir argument now works on Python3.2 and WindowsXP
+  (which apparently starts to offer os.symlink now)
+
+- better error message for syntax errors from compiled code
+
+- small fix to better deal with (un-)colored terminal output on windows
+
+Changes between 1.4.0 and 1.4.1
+==================================================
+
+- fix issue1 - py.error.* classes to be pickleable
+
+- fix issue2 - on windows32 use PATHEXT as the list of potential
+  extensions to find find binaries with py.path.local.sysfind(commandname)
+
+- fix (pytest-) issue10 and refine assertion reinterpretation
+  to avoid breaking if the __nonzero__ of an object fails
+
+- fix (pytest-) issue17 where python3 does not like "import *"
+  leading to misrepresentation of import-errors in test modules
+
+- fix py.error.* attribute pypy access issue
+
+- allow path.samefile(arg) to succeed when arg is a relative filename
+
+- fix (pytest-) issue20 path.samefile(relpath) works as expected now
+
+- fix (pytest-) issue8 len(long_list) now shows the lenght of the list
+
+Changes between 1.3.4 and 1.4.0
+==================================================
+
+- py.test was moved to a separate "pytest" package. What remains is
+  a stub hook which will proxy ``import py.test`` to ``pytest``.
+- all command line tools ("py.cleanup/lookup/countloc/..." moved
+  to "pycmd" package)
+- removed the old and deprecated "py.magic" namespace
+- use apipkg-1.1 and make py.apipkg.initpkg|ApiModule available
+- add py.iniconfig module for brain-dead easy ini-config file parsing
+- introduce py.builtin.any()
+- path objects have a .dirname attribute now (equivalent to
+  os.path.dirname(path))
+- path.visit() accepts breadthfirst (bf) and sort options
+- remove deprecated py.compat namespace
+
+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]
diff --git a/HOWTORELEASE.rst b/HOWTORELEASE.rst
deleted file mode 100644 (file)
index 8d02316..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-Release Procedure
------------------
-
-#. Create a branch ``release-X.Y.Z`` from the latest ``master``.
-
-#. Manually update the ``CHANGELOG`` and commit.
-
-#. Open a PR for this branch targeting ``master``.
-
-#. After all tests pass and the PR has been approved by at least another maintainer, publish to PyPI by creating and pushing a tag::
-
-     git tag X.Y.Z
-     git push git@github.com:pytest-dev/py X.Y.Z
-
-   Wait for the deploy to complete, then make sure it is `available on PyPI <https://pypi.org/project/py>`_.
-
-#. Merge your PR to ``master``.
index afa7ad66ea0d4385b9ce9bee26f68e01c65deb49..6d255b1a9e5b63504cdcd5ca4ba47f1f18681e57 100644 (file)
@@ -1,4 +1,4 @@
-include CHANGELOG
+include CHANGELOG.rst
 include AUTHORS
 include README.rst
 include setup.py
diff --git a/PKG-INFO b/PKG-INFO
deleted file mode 100644 (file)
index d4a40c1..0000000
--- a/PKG-INFO
+++ /dev/null
@@ -1,67 +0,0 @@
-Metadata-Version: 1.2
-Name: py
-Version: 1.9.0
-Summary: library with cross-python path, ini-parsing, io, code, log facilities
-Home-page: https://py.readthedocs.io/
-Author: holger krekel, Ronny Pfannschmidt, Benjamin Peterson and others
-Author-email: pytest-dev@python.org
-License: MIT license
-Description: .. image:: https://img.shields.io/pypi/v/py.svg
-            :target: https://pypi.org/project/py
-        
-        .. image:: https://img.shields.io/conda/vn/conda-forge/py.svg
-            :target: https://anaconda.org/conda-forge/py
-        
-        .. image:: https://img.shields.io/pypi/pyversions/pytest.svg
-          :target: https://pypi.org/project/py
-        
-        .. image:: https://img.shields.io/travis/pytest-dev/py.svg
-           :target: https://travis-ci.org/pytest-dev/py
-        
-        .. image:: https://ci.appveyor.com/api/projects/status/10keglan6uqwj5al/branch/master?svg=true
-           :target: https://ci.appveyor.com/project/pytestbot/py
-        
-        
-        **NOTE**: this library is in **maintenance mode** and should not be used in new code.
-        
-        The py lib is a Python development support library featuring
-        the following tools and modules:
-        
-        * ``py.path``:  uniform local and svn path objects  -> please use pathlib/pathlib2 instead
-        * ``py.apipkg``:  explicit API control and lazy-importing -> please use the standalone package instead
-        * ``py.iniconfig``:  easy parsing of .ini files -> please use the standalone package instead
-        * ``py.code``: dynamic code generation and introspection (deprecated, moved to ``pytest`` as a implementation detail).
-        
-        **NOTE**: prior to the 1.4 release this distribution used to
-        contain py.test which is now its own package, see http://pytest.org
-        
-        For questions and more information please visit http://py.readthedocs.org
-        
-        Bugs and issues: https://github.com/pytest-dev/py
-        
-        Authors: Holger Krekel and others, 2004-2017
-        
-Platform: unix
-Platform: linux
-Platform: osx
-Platform: cygwin
-Platform: win32
-Classifier: Development Status :: 6 - Mature
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Operating System :: POSIX
-Classifier: Operating System :: Microsoft :: Windows
-Classifier: Operating System :: MacOS :: MacOS X
-Classifier: Topic :: Software Development :: Testing
-Classifier: Topic :: Software Development :: Libraries
-Classifier: Topic :: Utilities
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.5
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
-Classifier: Programming Language :: Python :: Implementation :: CPython
-Classifier: Programming Language :: Python :: Implementation :: PyPy
-Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*
index 7eb534f3bd05c4343ec9a65d54298ab124ea2f19..80800b2b7ae7525389131aa72419ec9b8e9cc431 100644 (file)
@@ -4,14 +4,11 @@
 .. image:: https://img.shields.io/conda/vn/conda-forge/py.svg
     :target: https://anaconda.org/conda-forge/py
 
-.. image:: https://img.shields.io/pypi/pyversions/pytest.svg
+.. image:: https://img.shields.io/pypi/pyversions/py.svg
   :target: https://pypi.org/project/py
 
-.. image:: https://img.shields.io/travis/pytest-dev/py.svg
-   :target: https://travis-ci.org/pytest-dev/py
-
-.. image:: https://ci.appveyor.com/api/projects/status/10keglan6uqwj5al/branch/master?svg=true
-   :target: https://ci.appveyor.com/project/pytestbot/py
+.. image:: https://github.com/pytest-dev/py/workflows/build/badge.svg
+  :target: https://github.com/pytest-dev/py/actions
 
 
 **NOTE**: this library is in **maintenance mode** and should not be used in new code.
@@ -25,9 +22,9 @@ the following tools and modules:
 * ``py.code``: dynamic code generation and introspection (deprecated, moved to ``pytest`` as a implementation detail).
 
 **NOTE**: prior to the 1.4 release this distribution used to
-contain py.test which is now its own package, see http://pytest.org
+contain py.test which is now its own package, see https://docs.pytest.org
 
-For questions and more information please visit http://py.readthedocs.org
+For questions and more information please visit https://py.readthedocs.io
 
 Bugs and issues: https://github.com/pytest-dev/py
 
diff --git a/RELEASING.rst b/RELEASING.rst
new file mode 100644 (file)
index 0000000..fb588e3
--- /dev/null
@@ -0,0 +1,17 @@
+Release Procedure
+-----------------
+
+#. Create a branch ``release-X.Y.Z`` from the latest ``master``.
+
+#. Manually update the ``CHANGELOG.rst`` and commit.
+
+#. Open a PR for this branch targeting ``master``.
+
+#. After all tests pass and the PR has been approved by at least another maintainer, publish to PyPI by creating and pushing a tag::
+
+     git tag X.Y.Z
+     git push git@github.com:pytest-dev/py X.Y.Z
+
+   Wait for the deploy to complete, then make sure it is `available on PyPI <https://pypi.org/project/py>`_.
+
+#. Merge your PR to ``master``.
index 237daca3548779560bdf70602518bcd9eb3b3a16..0c9d0928e7ae3a6d158e6fc40c940856a9a92da6 100644 (file)
@@ -1,3 +1,3 @@
 .. _`changelog`:
 
-.. include:: ../CHANGELOG
+.. include:: ../CHANGELOG.rst
diff --git a/py.egg-info/PKG-INFO b/py.egg-info/PKG-INFO
deleted file mode 100644 (file)
index d4a40c1..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-Metadata-Version: 1.2
-Name: py
-Version: 1.9.0
-Summary: library with cross-python path, ini-parsing, io, code, log facilities
-Home-page: https://py.readthedocs.io/
-Author: holger krekel, Ronny Pfannschmidt, Benjamin Peterson and others
-Author-email: pytest-dev@python.org
-License: MIT license
-Description: .. image:: https://img.shields.io/pypi/v/py.svg
-            :target: https://pypi.org/project/py
-        
-        .. image:: https://img.shields.io/conda/vn/conda-forge/py.svg
-            :target: https://anaconda.org/conda-forge/py
-        
-        .. image:: https://img.shields.io/pypi/pyversions/pytest.svg
-          :target: https://pypi.org/project/py
-        
-        .. image:: https://img.shields.io/travis/pytest-dev/py.svg
-           :target: https://travis-ci.org/pytest-dev/py
-        
-        .. image:: https://ci.appveyor.com/api/projects/status/10keglan6uqwj5al/branch/master?svg=true
-           :target: https://ci.appveyor.com/project/pytestbot/py
-        
-        
-        **NOTE**: this library is in **maintenance mode** and should not be used in new code.
-        
-        The py lib is a Python development support library featuring
-        the following tools and modules:
-        
-        * ``py.path``:  uniform local and svn path objects  -> please use pathlib/pathlib2 instead
-        * ``py.apipkg``:  explicit API control and lazy-importing -> please use the standalone package instead
-        * ``py.iniconfig``:  easy parsing of .ini files -> please use the standalone package instead
-        * ``py.code``: dynamic code generation and introspection (deprecated, moved to ``pytest`` as a implementation detail).
-        
-        **NOTE**: prior to the 1.4 release this distribution used to
-        contain py.test which is now its own package, see http://pytest.org
-        
-        For questions and more information please visit http://py.readthedocs.org
-        
-        Bugs and issues: https://github.com/pytest-dev/py
-        
-        Authors: Holger Krekel and others, 2004-2017
-        
-Platform: unix
-Platform: linux
-Platform: osx
-Platform: cygwin
-Platform: win32
-Classifier: Development Status :: 6 - Mature
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Operating System :: POSIX
-Classifier: Operating System :: Microsoft :: Windows
-Classifier: Operating System :: MacOS :: MacOS X
-Classifier: Topic :: Software Development :: Testing
-Classifier: Topic :: Software Development :: Libraries
-Classifier: Topic :: Utilities
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.5
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
-Classifier: Programming Language :: Python :: Implementation :: CPython
-Classifier: Programming Language :: Python :: Implementation :: PyPy
-Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*
diff --git a/py.egg-info/SOURCES.txt b/py.egg-info/SOURCES.txt
deleted file mode 100644 (file)
index bedbaea..0000000
+++ /dev/null
@@ -1,149 +0,0 @@
-.appveyor.yml
-.flake8
-.gitattributes
-.gitignore
-.travis.yml
-AUTHORS
-CHANGELOG
-HOWTORELEASE.rst
-LICENSE
-MANIFEST.in
-README.rst
-codecov.yml
-conftest.py
-setup.cfg
-setup.py
-tox.ini
-bench/localpath.py
-doc/Makefile
-doc/changelog.txt
-doc/code.txt
-doc/conf.py
-doc/download.html
-doc/faq.txt
-doc/index.txt
-doc/install.txt
-doc/io.txt
-doc/links.inc
-doc/log.txt
-doc/misc.txt
-doc/path.txt
-doc/style.css
-doc/xml.txt
-doc/_templates/layout.html
-doc/announce/release-0.9.0.txt
-doc/announce/release-0.9.2.txt
-doc/announce/release-1.0.0.txt
-doc/announce/release-1.0.1.txt
-doc/announce/release-1.0.2.txt
-doc/announce/release-1.1.0.txt
-doc/announce/release-1.1.1.txt
-doc/announce/release-1.2.0.txt
-doc/announce/release-1.2.1.txt
-doc/announce/release-1.3.0.txt
-doc/announce/release-1.3.1.txt
-doc/announce/release-1.3.2.txt
-doc/announce/release-1.3.3.txt
-doc/announce/release-1.3.4.txt
-doc/announce/release-1.4.0.txt
-doc/announce/release-1.4.1.txt
-doc/announce/releases.txt
-doc/example/genhtml.py
-doc/example/genhtmlcss.py
-doc/example/genxml.py
-doc/img/pylib.png
-py/__init__.py
-py/__init__.pyi
-py/__metainfo.py
-py/_builtin.py
-py/_error.py
-py/_std.py
-py/_version.py
-py/_xmlgen.py
-py/error.pyi
-py/iniconfig.pyi
-py/io.pyi
-py/path.pyi
-py/py.typed
-py/test.py
-py/xml.pyi
-py.egg-info/PKG-INFO
-py.egg-info/SOURCES.txt
-py.egg-info/dependency_links.txt
-py.egg-info/not-zip-safe
-py.egg-info/top_level.txt
-py/_code/__init__.py
-py/_code/_assertionnew.py
-py/_code/_assertionold.py
-py/_code/_py2traceback.py
-py/_code/assertion.py
-py/_code/code.py
-py/_code/source.py
-py/_io/__init__.py
-py/_io/capture.py
-py/_io/saferepr.py
-py/_io/terminalwriter.py
-py/_log/__init__.py
-py/_log/log.py
-py/_log/warning.py
-py/_path/__init__.py
-py/_path/cacheutil.py
-py/_path/common.py
-py/_path/local.py
-py/_path/svnurl.py
-py/_path/svnwc.py
-py/_process/__init__.py
-py/_process/cmdexec.py
-py/_process/forkedfunc.py
-py/_process/killproc.py
-py/_vendored_packages/__init__.py
-py/_vendored_packages/apipkg.py
-py/_vendored_packages/iniconfig.py
-py/_vendored_packages/apipkg-1.4.dist-info/DESCRIPTION.rst
-py/_vendored_packages/apipkg-1.4.dist-info/INSTALLER
-py/_vendored_packages/apipkg-1.4.dist-info/METADATA
-py/_vendored_packages/apipkg-1.4.dist-info/RECORD
-py/_vendored_packages/apipkg-1.4.dist-info/WHEEL
-py/_vendored_packages/apipkg-1.4.dist-info/metadata.json
-py/_vendored_packages/apipkg-1.4.dist-info/top_level.txt
-py/_vendored_packages/iniconfig-1.0.0.dist-info/DESCRIPTION.rst
-py/_vendored_packages/iniconfig-1.0.0.dist-info/INSTALLER
-py/_vendored_packages/iniconfig-1.0.0.dist-info/METADATA
-py/_vendored_packages/iniconfig-1.0.0.dist-info/RECORD
-py/_vendored_packages/iniconfig-1.0.0.dist-info/WHEEL
-py/_vendored_packages/iniconfig-1.0.0.dist-info/metadata.json
-py/_vendored_packages/iniconfig-1.0.0.dist-info/top_level.txt
-tasks/__init__.py
-tasks/vendoring.py
-testing/conftest.py
-testing/code/test_assertion.py
-testing/code/test_code.py
-testing/code/test_excinfo.py
-testing/code/test_source.py
-testing/io_/__init__.py
-testing/io_/test_capture.py
-testing/io_/test_saferepr.py
-testing/io_/test_terminalwriter.py
-testing/io_/test_terminalwriter_linewidth.py
-testing/log/__init__.py
-testing/log/test_log.py
-testing/log/test_warning.py
-testing/path/common.py
-testing/path/conftest.py
-testing/path/repotest.dump
-testing/path/svntestbase.py
-testing/path/test_cacheutil.py
-testing/path/test_local.py
-testing/path/test_svnauth.py
-testing/path/test_svnurl.py
-testing/path/test_svnwc.py
-testing/process/__init__.py
-testing/process/test_cmdexec.py
-testing/process/test_forkedfunc.py
-testing/process/test_killproc.py
-testing/root/__init__.py
-testing/root/test_builtin.py
-testing/root/test_error.py
-testing/root/test_py_imports.py
-testing/root/test_std.py
-testing/root/test_xmlgen.py
\ No newline at end of file
diff --git a/py.egg-info/dependency_links.txt b/py.egg-info/dependency_links.txt
deleted file mode 100644 (file)
index 8b13789..0000000
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/py.egg-info/not-zip-safe b/py.egg-info/not-zip-safe
deleted file mode 100644 (file)
index 8b13789..0000000
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/py.egg-info/top_level.txt b/py.egg-info/top_level.txt
deleted file mode 100644 (file)
index edfce78..0000000
+++ /dev/null
@@ -1 +0,0 @@
-py
index 3138dd85da39b2d2a65b8101f6ba96eef96a32c8..b5b9d8d544a25253dab87a4f9d1bc3752f38ba06 100644 (file)
@@ -396,7 +396,7 @@ class SvnAuth(object):
     def __str__(self):
         return "<SvnAuth username=%s ...>" %(self.username,)
 
-rex_blame = re.compile(r'\s*(\d+)\s*(\S+) (.*)')
+rex_blame = re.compile(r'\s*(\d+)\s+(\S+) (.*)')
 
 class SvnWCCommandPath(common.PathBase):
     """ path implementation offering access/modification to svn working copies.
diff --git a/py/_vendored_packages/apipkg-1.4.dist-info/DESCRIPTION.rst b/py/_vendored_packages/apipkg-1.4.dist-info/DESCRIPTION.rst
deleted file mode 100644 (file)
index 5482220..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-Welcome to apipkg!
-------------------------
-
-With apipkg you can control the exported namespace of a
-python package and greatly reduce the number of imports for your users.
-It is a `small pure python module`_ that works on virtually all Python
-versions, including CPython2.3 to Python3.1, Jython and PyPy.  It co-operates
-well with Python's ``help()`` system, custom importers (PEP302) and common
-command line completion tools.
-
-Usage is very simple: you can require 'apipkg' as a dependency or you
-can copy paste the <200 Lines of code into your project.
-
-
-Tutorial example
--------------------
-
-Here is a simple ``mypkg`` package that specifies one namespace
-and exports two objects imported from different modules::
-
-    # mypkg/__init__.py
-    import apipkg
-    apipkg.initpkg(__name__, {
-        'path': {
-            'Class1': "_mypkg.somemodule:Class1",
-            'clsattr': "_mypkg.othermodule:Class2.attr",
-        }
-    }
-
-The package is initialized with a dictionary as namespace.
-
-You need to create a ``_mypkg`` package with a ``somemodule.py``
-and ``othermodule.py`` containing the respective classes.
-The ``_mypkg`` is not special - it's a completely
-regular python package.
-
-Namespace dictionaries contain ``name: value`` mappings
-where the value may be another namespace dictionary or
-a string specifying an import location.  On accessing
-an namespace attribute an import will be performed::
-
-    >>> import mypkg
-    >>> mypkg.path
-    <ApiModule 'mypkg.path'>
-    >>> mypkg.path.Class1   # '_mypkg.somemodule' gets imported now
-    <class _mypkg.somemodule.Class1 at 0xb7d428fc>
-    >>> mypkg.path.clsattr  # '_mypkg.othermodule' gets imported now
-    4 # the value of _mypkg.othermodule.Class2.attr
-
-The ``mypkg.path`` namespace and its two entries are
-loaded when they are accessed.   This means:
-
-* lazy loading - only what is actually needed is ever loaded
-
-* only the root "mypkg" ever needs to be imported to get
-  access to the complete functionality.
-
-* the underlying modules are also accessible, for example::
-
-    from mypkg.sub import Class1
-
-
-Including apipkg in your package
---------------------------------------
-
-If you don't want to add an ``apipkg`` dependency to your package you
-can copy the `apipkg.py`_ file somewhere to your own package,
-for example ``_mypkg/apipkg.py`` in the above example.  You
-then import the ``initpkg`` function from that new place and
-are good to go.
-
-.. _`small pure python module`:
-.. _`apipkg.py`: http://bitbucket.org/hpk42/apipkg/src/tip/apipkg.py
-
-Feedback?
------------------------
-
-If you have questions you are welcome to
-
-* join the #pylib channel on irc.freenode.net
-* subscribe to the http://codespeak.net/mailman/listinfo/py-dev list.
-* create an issue on http://bitbucket.org/hpk42/apipkg/issues
-
-have fun,
-holger krekel
-
-
diff --git a/py/_vendored_packages/apipkg-1.4.dist-info/INSTALLER b/py/_vendored_packages/apipkg-1.4.dist-info/INSTALLER
deleted file mode 100644 (file)
index a1b589e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-pip
diff --git a/py/_vendored_packages/apipkg-1.4.dist-info/METADATA b/py/_vendored_packages/apipkg-1.4.dist-info/METADATA
deleted file mode 100644 (file)
index eb7e60a..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-Metadata-Version: 2.0
-Name: apipkg
-Version: 1.4
-Summary: apipkg: namespace control and lazy-import mechanism
-Home-page: http://bitbucket.org/hpk42/apipkg
-Author: holger krekel
-Author-email: holger at merlinux.eu
-License: MIT License
-Platform: unix
-Platform: linux
-Platform: osx
-Platform: cygwin
-Platform: win32
-Classifier: Development Status :: 4 - Beta
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Operating System :: POSIX
-Classifier: Operating System :: Microsoft :: Windows
-Classifier: Operating System :: MacOS :: MacOS X
-Classifier: Topic :: Software Development :: Libraries
-Classifier: Programming Language :: Python
-
-Welcome to apipkg!
-------------------------
-
-With apipkg you can control the exported namespace of a
-python package and greatly reduce the number of imports for your users.
-It is a `small pure python module`_ that works on virtually all Python
-versions, including CPython2.3 to Python3.1, Jython and PyPy.  It co-operates
-well with Python's ``help()`` system, custom importers (PEP302) and common
-command line completion tools.
-
-Usage is very simple: you can require 'apipkg' as a dependency or you
-can copy paste the <200 Lines of code into your project.
-
-
-Tutorial example
--------------------
-
-Here is a simple ``mypkg`` package that specifies one namespace
-and exports two objects imported from different modules::
-
-    # mypkg/__init__.py
-    import apipkg
-    apipkg.initpkg(__name__, {
-        'path': {
-            'Class1': "_mypkg.somemodule:Class1",
-            'clsattr': "_mypkg.othermodule:Class2.attr",
-        }
-    }
-
-The package is initialized with a dictionary as namespace.
-
-You need to create a ``_mypkg`` package with a ``somemodule.py``
-and ``othermodule.py`` containing the respective classes.
-The ``_mypkg`` is not special - it's a completely
-regular python package.
-
-Namespace dictionaries contain ``name: value`` mappings
-where the value may be another namespace dictionary or
-a string specifying an import location.  On accessing
-an namespace attribute an import will be performed::
-
-    >>> import mypkg
-    >>> mypkg.path
-    <ApiModule 'mypkg.path'>
-    >>> mypkg.path.Class1   # '_mypkg.somemodule' gets imported now
-    <class _mypkg.somemodule.Class1 at 0xb7d428fc>
-    >>> mypkg.path.clsattr  # '_mypkg.othermodule' gets imported now
-    4 # the value of _mypkg.othermodule.Class2.attr
-
-The ``mypkg.path`` namespace and its two entries are
-loaded when they are accessed.   This means:
-
-* lazy loading - only what is actually needed is ever loaded
-
-* only the root "mypkg" ever needs to be imported to get
-  access to the complete functionality.
-
-* the underlying modules are also accessible, for example::
-
-    from mypkg.sub import Class1
-
-
-Including apipkg in your package
---------------------------------------
-
-If you don't want to add an ``apipkg`` dependency to your package you
-can copy the `apipkg.py`_ file somewhere to your own package,
-for example ``_mypkg/apipkg.py`` in the above example.  You
-then import the ``initpkg`` function from that new place and
-are good to go.
-
-.. _`small pure python module`:
-.. _`apipkg.py`: http://bitbucket.org/hpk42/apipkg/src/tip/apipkg.py
-
-Feedback?
------------------------
-
-If you have questions you are welcome to
-
-* join the #pylib channel on irc.freenode.net
-* subscribe to the http://codespeak.net/mailman/listinfo/py-dev list.
-* create an issue on http://bitbucket.org/hpk42/apipkg/issues
-
-have fun,
-holger krekel
-
-
diff --git a/py/_vendored_packages/apipkg-1.4.dist-info/RECORD b/py/_vendored_packages/apipkg-1.4.dist-info/RECORD
deleted file mode 100644 (file)
index dc72959..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-apipkg.py,sha256=BNnv_qvq8zZvku-uudoqgp3XTNFbwsNUmtzOKrVI7X0,6420\r
-apipkg-1.4.dist-info/top_level.txt,sha256=3TGS6nmN7kjxhUK4LpPCB3QkQI34QYGrT0ZQGWajoZ8,7\r
-apipkg-1.4.dist-info/METADATA,sha256=Fk_8BrHyXE--kvB3_ZBKgwvPaKusAZUjchH-kpB63Hs,3491\r
-apipkg-1.4.dist-info/DESCRIPTION.rst,sha256=RkMQqk5ljhGy0DiZkR_nbpjqvwCIhuIEHsyvkn3O96k,2803\r
-apipkg-1.4.dist-info/metadata.json,sha256=GdshYrA_7gAII3E3EQMH-31BHzU-klTZ6bPQzlDmuy4,779\r
-apipkg-1.4.dist-info/WHEEL,sha256=AvR0WeTpDaxT645bl5FQxUK6NPsTls2ttpcGJg3j1Xg,110\r
-apipkg-1.4.dist-info/RECORD,,\r
-apipkg-1.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4\r
-__pycache__/apipkg.cpython-35.pyc,,\r
diff --git a/py/_vendored_packages/apipkg-1.4.dist-info/WHEEL b/py/_vendored_packages/apipkg-1.4.dist-info/WHEEL
deleted file mode 100644 (file)
index 9dff69d..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.24.0)
-Root-Is-Purelib: true
-Tag: py2-none-any
-Tag: py3-none-any
-
diff --git a/py/_vendored_packages/apipkg-1.4.dist-info/metadata.json b/py/_vendored_packages/apipkg-1.4.dist-info/metadata.json
deleted file mode 100644 (file)
index 05609b9..0000000
+++ /dev/null
@@ -1 +0,0 @@
-{"license": "MIT License", "name": "apipkg", "metadata_version": "2.0", "generator": "bdist_wheel (0.24.0)", "summary": "apipkg: namespace control and lazy-import mechanism", "platform": "unix", "version": "1.4", "extensions": {"python.details": {"project_urls": {"Home": "http://bitbucket.org/hpk42/apipkg"}, "document_names": {"description": "DESCRIPTION.rst"}, "contacts": [{"role": "author", "email": "holger at merlinux.eu", "name": "holger krekel"}]}}, "classifiers": ["Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: POSIX", "Operating System :: Microsoft :: Windows", "Operating System :: MacOS :: MacOS X", "Topic :: Software Development :: Libraries", "Programming Language :: Python"]}
\ No newline at end of file
diff --git a/py/_vendored_packages/apipkg-1.4.dist-info/top_level.txt b/py/_vendored_packages/apipkg-1.4.dist-info/top_level.txt
deleted file mode 100644 (file)
index e2221c8..0000000
+++ /dev/null
@@ -1 +0,0 @@
-apipkg
diff --git a/py/_vendored_packages/apipkg-1.5.dist-info/INSTALLER b/py/_vendored_packages/apipkg-1.5.dist-info/INSTALLER
new file mode 100644 (file)
index 0000000..a1b589e
--- /dev/null
@@ -0,0 +1 @@
+pip
diff --git a/py/_vendored_packages/apipkg-1.5.dist-info/METADATA b/py/_vendored_packages/apipkg-1.5.dist-info/METADATA
new file mode 100644 (file)
index 0000000..ac14b4b
--- /dev/null
@@ -0,0 +1,115 @@
+Metadata-Version: 2.1
+Name: apipkg
+Version: 1.5
+Summary: apipkg: namespace control and lazy-import mechanism
+Home-page: https://github.com/pytest-dev/apipkg
+Author: holger krekel
+Maintainer: Ronny Pfannschmidt
+Maintainer-email: opensource@ronnypfannschmidt.de
+License: MIT License
+Platform: unix
+Platform: linux
+Platform: osx
+Platform: cygwin
+Platform: win32
+Classifier: Development Status :: 4 - Beta
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: POSIX
+Classifier: Operating System :: Microsoft :: Windows
+Classifier: Operating System :: MacOS :: MacOS X
+Classifier: Topic :: Software Development :: Libraries
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*
+
+Welcome to apipkg!
+------------------------
+
+With apipkg you can control the exported namespace of a Python package and
+greatly reduce the number of imports for your users.
+It is a `small pure Python module`_ that works on CPython 2.7 and 3.4+,
+Jython and PyPy. It cooperates well with Python's ``help()`` system,
+custom importers (PEP302) and common command-line completion tools.
+
+Usage is very simple: you can require 'apipkg' as a dependency or you
+can copy paste the ~200 lines of code into your project.
+
+
+Tutorial example
+-------------------
+
+Here is a simple ``mypkg`` package that specifies one namespace
+and exports two objects imported from different modules::
+
+    # mypkg/__init__.py
+    import apipkg
+    apipkg.initpkg(__name__, {
+        'path': {
+            'Class1': "_mypkg.somemodule:Class1",
+            'clsattr': "_mypkg.othermodule:Class2.attr",
+        }
+    }
+
+The package is initialized with a dictionary as namespace.
+
+You need to create a ``_mypkg`` package with a ``somemodule.py``
+and ``othermodule.py`` containing the respective classes.
+The ``_mypkg`` is not special - it's a completely
+regular Python package.
+
+Namespace dictionaries contain ``name: value`` mappings
+where the value may be another namespace dictionary or
+a string specifying an import location.  On accessing
+an namespace attribute an import will be performed::
+
+    >>> import mypkg
+    >>> mypkg.path
+    <ApiModule 'mypkg.path'>
+    >>> mypkg.path.Class1   # '_mypkg.somemodule' gets imported now
+    <class _mypkg.somemodule.Class1 at 0xb7d428fc>
+    >>> mypkg.path.clsattr  # '_mypkg.othermodule' gets imported now
+    4 # the value of _mypkg.othermodule.Class2.attr
+
+The ``mypkg.path`` namespace and its two entries are
+loaded when they are accessed.   This means:
+
+* lazy loading - only what is actually needed is ever loaded
+
+* only the root "mypkg" ever needs to be imported to get
+  access to the complete functionality
+
+* the underlying modules are also accessible, for example::
+
+    from mypkg.sub import Class1
+
+
+Including apipkg in your package
+--------------------------------------
+
+If you don't want to add an ``apipkg`` dependency to your package you
+can copy the `apipkg.py`_ file somewhere to your own package,
+for example ``_mypkg/apipkg.py`` in the above example.  You
+then import the ``initpkg`` function from that new place and
+are good to go.
+
+.. _`small pure Python module`:
+.. _`apipkg.py`: https://github.com/pytest-dev/apipkg/blob/master/src/apipkg/__init__.py
+
+Feedback?
+-----------------------
+
+If you have questions you are welcome to
+
+* join the #pylib channel on irc.freenode.net
+* create an issue on https://github.com/pytest-dev/apipkg/issues
+
+have fun,
+holger krekel
+
+
diff --git a/py/_vendored_packages/apipkg-1.5.dist-info/RECORD b/py/_vendored_packages/apipkg-1.5.dist-info/RECORD
new file mode 100644 (file)
index 0000000..8611704
--- /dev/null
@@ -0,0 +1,10 @@
+../../../../home/ran/.cache/pycache/tmp/pip-target-oxds71ih/lib/python/apipkg/__init__.cpython-39.pyc,,\r
+../../../../home/ran/.cache/pycache/tmp/pip-target-oxds71ih/lib/python/apipkg/version.cpython-39.pyc,,\r
+apipkg-1.5.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4\r
+apipkg-1.5.dist-info/METADATA,sha256=tIG1DSBzSeqmSRpOKHSEBmT1eOPdK8xK01xAIADuks4,3800\r
+apipkg-1.5.dist-info/RECORD,,\r
+apipkg-1.5.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0\r
+apipkg-1.5.dist-info/WHEEL,sha256=gduuPyBvFJQSQ0zdyxF7k0zynDXbIbvg5ZBHoXum5uk,110\r
+apipkg-1.5.dist-info/top_level.txt,sha256=3TGS6nmN7kjxhUK4LpPCB3QkQI34QYGrT0ZQGWajoZ8,7\r
+apipkg/__init__.py,sha256=VogR4mDwYmeOdJnjGi-RoMB1qJnD6_puDYj_nRolzhM,6707\r
+apipkg/version.py,sha256=YN6DnKyEPqjDAauJuwJRG9vlKbWVLd9gAbH7mkQXXNo,114\r
diff --git a/py/_vendored_packages/apipkg-1.5.dist-info/REQUESTED b/py/_vendored_packages/apipkg-1.5.dist-info/REQUESTED
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/py/_vendored_packages/apipkg-1.5.dist-info/WHEEL b/py/_vendored_packages/apipkg-1.5.dist-info/WHEEL
new file mode 100644 (file)
index 0000000..1316c41
--- /dev/null
@@ -0,0 +1,6 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.31.1)
+Root-Is-Purelib: true
+Tag: py2-none-any
+Tag: py3-none-any
+
diff --git a/py/_vendored_packages/apipkg-1.5.dist-info/top_level.txt b/py/_vendored_packages/apipkg-1.5.dist-info/top_level.txt
new file mode 100644 (file)
index 0000000..e2221c8
--- /dev/null
@@ -0,0 +1 @@
+apipkg
diff --git a/py/_vendored_packages/apipkg.py b/py/_vendored_packages/apipkg.py
deleted file mode 100644 (file)
index 9d56e0b..0000000
+++ /dev/null
@@ -1,205 +0,0 @@
-"""
-apipkg: control the exported namespace of a python package.
-
-see http://pypi.python.org/pypi/apipkg
-
-(c) holger krekel, 2009 - MIT license
-"""
-import os
-import sys
-from types import ModuleType
-
-
-__version__ = '1.4'
-
-
-def _py_abspath(path):
-    """
-    special version of abspath
-    that will leave paths from jython jars alone
-    """
-    if path.startswith('__pyclasspath__'):
-
-        return path
-    else:
-        return os.path.abspath(path)
-
-
-def distribution_version(name):
-    """try to get the version of the named distribution,
-    returs None on failure"""
-    from pkg_resources import get_distribution, DistributionNotFound
-    try:
-        dist = get_distribution(name)
-    except DistributionNotFound:
-        pass
-    else:
-        return dist.version
-
-
-def initpkg(pkgname, exportdefs, attr=dict(), eager=False):
-    """ initialize given package from the export definitions. """
-    oldmod = sys.modules.get(pkgname)
-    d = {}
-    f = getattr(oldmod, '__file__', None)
-    if f:
-        f = _py_abspath(f)
-    d['__file__'] = f
-    if hasattr(oldmod, '__version__'):
-        d['__version__'] = oldmod.__version__
-    if hasattr(oldmod, '__loader__'):
-        d['__loader__'] = oldmod.__loader__
-    if hasattr(oldmod, '__path__'):
-        d['__path__'] = [_py_abspath(p) for p in oldmod.__path__]
-    if '__doc__' not in exportdefs and getattr(oldmod, '__doc__', None):
-        d['__doc__'] = oldmod.__doc__
-    d.update(attr)
-    if hasattr(oldmod, "__dict__"):
-        oldmod.__dict__.update(d)
-    mod = ApiModule(pkgname, exportdefs, implprefix=pkgname, attr=d)
-    sys.modules[pkgname] = mod
-    # eagerload in bypthon to avoid their monkeypatching breaking packages
-    if 'bpython' in sys.modules or eager:
-        for module in sys.modules.values():
-            if isinstance(module, ApiModule):
-                module.__dict__
-
-
-def importobj(modpath, attrname):
-    module = __import__(modpath, None, None, ['__doc__'])
-    if not attrname:
-        return module
-
-    retval = module
-    names = attrname.split(".")
-    for x in names:
-        retval = getattr(retval, x)
-    return retval
-
-
-class ApiModule(ModuleType):
-    def __docget(self):
-        try:
-            return self.__doc
-        except AttributeError:
-            if '__doc__' in self.__map__:
-                return self.__makeattr('__doc__')
-
-    def __docset(self, value):
-        self.__doc = value
-    __doc__ = property(__docget, __docset)
-
-    def __init__(self, name, importspec, implprefix=None, attr=None):
-        self.__name__ = name
-        self.__all__ = [x for x in importspec if x != '__onfirstaccess__']
-        self.__map__ = {}
-        self.__implprefix__ = implprefix or name
-        if attr:
-            for name, val in attr.items():
-                # print "setting", self.__name__, name, val
-                setattr(self, name, val)
-        for name, importspec in importspec.items():
-            if isinstance(importspec, dict):
-                subname = '%s.%s' % (self.__name__, name)
-                apimod = ApiModule(subname, importspec, implprefix)
-                sys.modules[subname] = apimod
-                setattr(self, name, apimod)
-            else:
-                parts = importspec.split(':')
-                modpath = parts.pop(0)
-                attrname = parts and parts[0] or ""
-                if modpath[0] == '.':
-                    modpath = implprefix + modpath
-
-                if not attrname:
-                    subname = '%s.%s' % (self.__name__, name)
-                    apimod = AliasModule(subname, modpath)
-                    sys.modules[subname] = apimod
-                    if '.' not in name:
-                        setattr(self, name, apimod)
-                else:
-                    self.__map__[name] = (modpath, attrname)
-
-    def __repr__(self):
-        l = []
-        if hasattr(self, '__version__'):
-            l.append("version=" + repr(self.__version__))
-        if hasattr(self, '__file__'):
-            l.append('from ' + repr(self.__file__))
-        if l:
-            return '<ApiModule %r %s>' % (self.__name__, " ".join(l))
-        return '<ApiModule %r>' % (self.__name__,)
-
-    def __makeattr(self, name):
-        """lazily compute value for name or raise AttributeError if unknown."""
-        # print "makeattr", self.__name__, name
-        target = None
-        if '__onfirstaccess__' in self.__map__:
-            target = self.__map__.pop('__onfirstaccess__')
-            importobj(*target)()
-        try:
-            modpath, attrname = self.__map__[name]
-        except KeyError:
-            if target is not None and name != '__onfirstaccess__':
-                # retry, onfirstaccess might have set attrs
-                return getattr(self, name)
-            raise AttributeError(name)
-        else:
-            result = importobj(modpath, attrname)
-            setattr(self, name, result)
-            try:
-                del self.__map__[name]
-            except KeyError:
-                pass  # in a recursive-import situation a double-del can happen
-            return result
-
-    __getattr__ = __makeattr
-
-    @property
-    def __dict__(self):
-        # force all the content of the module
-        # to be loaded when __dict__ is read
-        dictdescr = ModuleType.__dict__['__dict__']
-        dict = dictdescr.__get__(self)
-        if dict is not None:
-            hasattr(self, 'some')
-            for name in self.__all__:
-                try:
-                    self.__makeattr(name)
-                except AttributeError:
-                    pass
-        return dict
-
-
-def AliasModule(modname, modpath, attrname=None):
-    mod = []
-
-    def getmod():
-        if not mod:
-            x = importobj(modpath, None)
-            if attrname is not None:
-                x = getattr(x, attrname)
-            mod.append(x)
-        return mod[0]
-
-    class AliasModule(ModuleType):
-
-        def __repr__(self):
-            x = modpath
-            if attrname:
-                x += "." + attrname
-            return '<AliasModule %r for %r>' % (modname, x)
-
-        def __getattribute__(self, name):
-            try:
-                return getattr(getmod(), name)
-            except ImportError:
-                return None
-
-        def __setattr__(self, name, value):
-            setattr(getmod(), name, value)
-
-        def __delattr__(self, name):
-            delattr(getmod(), name)
-
-    return AliasModule(str(modname))
diff --git a/py/_vendored_packages/apipkg/__init__.py b/py/_vendored_packages/apipkg/__init__.py
new file mode 100644 (file)
index 0000000..9318048
--- /dev/null
@@ -0,0 +1,209 @@
+"""
+apipkg: control the exported namespace of a Python package.
+
+see https://pypi.python.org/pypi/apipkg
+
+(c) holger krekel, 2009 - MIT license
+"""
+import os
+import sys
+from types import ModuleType
+
+from .version import version as __version__
+
+
+def _py_abspath(path):
+    """
+    special version of abspath
+    that will leave paths from jython jars alone
+    """
+    if path.startswith('__pyclasspath__'):
+
+        return path
+    else:
+        return os.path.abspath(path)
+
+
+def distribution_version(name):
+    """try to get the version of the named distribution,
+    returs None on failure"""
+    from pkg_resources import get_distribution, DistributionNotFound
+    try:
+        dist = get_distribution(name)
+    except DistributionNotFound:
+        pass
+    else:
+        return dist.version
+
+
+def initpkg(pkgname, exportdefs, attr=None, eager=False):
+    """ initialize given package from the export definitions. """
+    attr = attr or {}
+    oldmod = sys.modules.get(pkgname)
+    d = {}
+    f = getattr(oldmod, '__file__', None)
+    if f:
+        f = _py_abspath(f)
+    d['__file__'] = f
+    if hasattr(oldmod, '__version__'):
+        d['__version__'] = oldmod.__version__
+    if hasattr(oldmod, '__loader__'):
+        d['__loader__'] = oldmod.__loader__
+    if hasattr(oldmod, '__path__'):
+        d['__path__'] = [_py_abspath(p) for p in oldmod.__path__]
+    if hasattr(oldmod, '__package__'):
+        d['__package__'] = oldmod.__package__
+    if '__doc__' not in exportdefs and getattr(oldmod, '__doc__', None):
+        d['__doc__'] = oldmod.__doc__
+    d.update(attr)
+    if hasattr(oldmod, "__dict__"):
+        oldmod.__dict__.update(d)
+    mod = ApiModule(pkgname, exportdefs, implprefix=pkgname, attr=d)
+    sys.modules[pkgname] = mod
+    # eagerload in bypthon to avoid their monkeypatching breaking packages
+    if 'bpython' in sys.modules or eager:
+        for module in list(sys.modules.values()):
+            if isinstance(module, ApiModule):
+                module.__dict__
+
+
+def importobj(modpath, attrname):
+    """imports a module, then resolves the attrname on it"""
+    module = __import__(modpath, None, None, ['__doc__'])
+    if not attrname:
+        return module
+
+    retval = module
+    names = attrname.split(".")
+    for x in names:
+        retval = getattr(retval, x)
+    return retval
+
+
+class ApiModule(ModuleType):
+    """the magical lazy-loading module standing"""
+    def __docget(self):
+        try:
+            return self.__doc
+        except AttributeError:
+            if '__doc__' in self.__map__:
+                return self.__makeattr('__doc__')
+
+    def __docset(self, value):
+        self.__doc = value
+    __doc__ = property(__docget, __docset)
+
+    def __init__(self, name, importspec, implprefix=None, attr=None):
+        self.__name__ = name
+        self.__all__ = [x for x in importspec if x != '__onfirstaccess__']
+        self.__map__ = {}
+        self.__implprefix__ = implprefix or name
+        if attr:
+            for name, val in attr.items():
+                # print "setting", self.__name__, name, val
+                setattr(self, name, val)
+        for name, importspec in importspec.items():
+            if isinstance(importspec, dict):
+                subname = '%s.%s' % (self.__name__, name)
+                apimod = ApiModule(subname, importspec, implprefix)
+                sys.modules[subname] = apimod
+                setattr(self, name, apimod)
+            else:
+                parts = importspec.split(':')
+                modpath = parts.pop(0)
+                attrname = parts and parts[0] or ""
+                if modpath[0] == '.':
+                    modpath = implprefix + modpath
+
+                if not attrname:
+                    subname = '%s.%s' % (self.__name__, name)
+                    apimod = AliasModule(subname, modpath)
+                    sys.modules[subname] = apimod
+                    if '.' not in name:
+                        setattr(self, name, apimod)
+                else:
+                    self.__map__[name] = (modpath, attrname)
+
+    def __repr__(self):
+        repr_list = []
+        if hasattr(self, '__version__'):
+            repr_list.append("version=" + repr(self.__version__))
+        if hasattr(self, '__file__'):
+            repr_list.append('from ' + repr(self.__file__))
+        if repr_list:
+            return '<ApiModule %r %s>' % (self.__name__, " ".join(repr_list))
+        return '<ApiModule %r>' % (self.__name__,)
+
+    def __makeattr(self, name):
+        """lazily compute value for name or raise AttributeError if unknown."""
+        # print "makeattr", self.__name__, name
+        target = None
+        if '__onfirstaccess__' in self.__map__:
+            target = self.__map__.pop('__onfirstaccess__')
+            importobj(*target)()
+        try:
+            modpath, attrname = self.__map__[name]
+        except KeyError:
+            if target is not None and name != '__onfirstaccess__':
+                # retry, onfirstaccess might have set attrs
+                return getattr(self, name)
+            raise AttributeError(name)
+        else:
+            result = importobj(modpath, attrname)
+            setattr(self, name, result)
+            try:
+                del self.__map__[name]
+            except KeyError:
+                pass  # in a recursive-import situation a double-del can happen
+            return result
+
+    __getattr__ = __makeattr
+
+    @property
+    def __dict__(self):
+        # force all the content of the module
+        # to be loaded when __dict__ is read
+        dictdescr = ModuleType.__dict__['__dict__']
+        dict = dictdescr.__get__(self)
+        if dict is not None:
+            hasattr(self, 'some')
+            for name in self.__all__:
+                try:
+                    self.__makeattr(name)
+                except AttributeError:
+                    pass
+        return dict
+
+
+def AliasModule(modname, modpath, attrname=None):
+    mod = []
+
+    def getmod():
+        if not mod:
+            x = importobj(modpath, None)
+            if attrname is not None:
+                x = getattr(x, attrname)
+            mod.append(x)
+        return mod[0]
+
+    class AliasModule(ModuleType):
+
+        def __repr__(self):
+            x = modpath
+            if attrname:
+                x += "." + attrname
+            return '<AliasModule %r for %r>' % (modname, x)
+
+        def __getattribute__(self, name):
+            try:
+                return getattr(getmod(), name)
+            except ImportError:
+                return None
+
+        def __setattr__(self, name, value):
+            setattr(getmod(), name, value)
+
+        def __delattr__(self, name):
+            delattr(getmod(), name)
+
+    return AliasModule(str(modname))
diff --git a/py/_vendored_packages/apipkg/version.py b/py/_vendored_packages/apipkg/version.py
new file mode 100644 (file)
index 0000000..c25fc7c
--- /dev/null
@@ -0,0 +1,4 @@
+# coding: utf-8
+# file generated by setuptools_scm
+# don't change, don't track in version control
+version = '1.5'
diff --git a/py/_vendored_packages/iniconfig-1.0.0.dist-info/DESCRIPTION.rst b/py/_vendored_packages/iniconfig-1.0.0.dist-info/DESCRIPTION.rst
deleted file mode 100644 (file)
index 6d59bc2..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-iniconfig: brain-dead simple parsing of ini files
-=======================================================
-
-iniconfig is a small and simple INI-file parser module
-having a unique set of features:
-
-* tested against Python2.4 across to Python3.2, Jython, PyPy
-* maintains order of sections and entries
-* supports multi-line values with or without line-continuations
-* supports "#" comments everywhere
-* raises errors with proper line-numbers
-* no bells and whistles like automatic substitutions
-* iniconfig raises an Error if two sections have the same name.
-
-If you encounter issues or have feature wishes please report them to:
-
-    http://github.org/RonnyPfannschmidt/iniconfig/issues
-
-Basic Example
-===================================
-
-If you have an ini file like this::
-
-    # content of example.ini
-    [section1] # comment
-    name1=value1  # comment
-    name1b=value1,value2  # comment
-
-    [section2]
-    name2=
-        line1
-        line2
-
-then you can do::
-
-    >>> import iniconfig
-    >>> ini = iniconfig.IniConfig("example.ini")
-    >>> ini['section1']['name1'] # raises KeyError if not exists
-    'value1'
-    >>> ini.get('section1', 'name1b', [], lambda x: x.split(","))
-    ['value1', 'value2']
-    >>> ini.get('section1', 'notexist', [], lambda x: x.split(","))
-    []
-    >>> [x.name for x in list(ini)]
-    ['section1', 'section2']
-    >>> list(list(ini)[0].items())
-    [('name1', 'value1'), ('name1b', 'value1,value2')]
-    >>> 'section1' in ini
-    True
-    >>> 'inexistendsection' in ini
-    False
-
-
diff --git a/py/_vendored_packages/iniconfig-1.0.0.dist-info/INSTALLER b/py/_vendored_packages/iniconfig-1.0.0.dist-info/INSTALLER
deleted file mode 100644 (file)
index a1b589e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-pip
diff --git a/py/_vendored_packages/iniconfig-1.0.0.dist-info/METADATA b/py/_vendored_packages/iniconfig-1.0.0.dist-info/METADATA
deleted file mode 100644 (file)
index 79ea62d..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-Metadata-Version: 2.0
-Name: iniconfig
-Version: 1.0.0
-Summary: iniconfig: brain-dead simple config-ini parsing
-Home-page: http://github.com/RonnyPfannschmidt/iniconfig
-Author: Ronny Pfannschmidt, Holger Krekel
-Author-email: opensource@ronnypfannschmidt.de, holger.krekel@gmail.com
-License: MIT License
-Platform: unix
-Platform: linux
-Platform: osx
-Platform: cygwin
-Platform: win32
-Classifier: Development Status :: 4 - Beta
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Operating System :: POSIX
-Classifier: Operating System :: Microsoft :: Windows
-Classifier: Operating System :: MacOS :: MacOS X
-Classifier: Topic :: Software Development :: Libraries
-Classifier: Topic :: Utilities
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 3
-
-iniconfig: brain-dead simple parsing of ini files
-=======================================================
-
-iniconfig is a small and simple INI-file parser module
-having a unique set of features:
-
-* tested against Python2.4 across to Python3.2, Jython, PyPy
-* maintains order of sections and entries
-* supports multi-line values with or without line-continuations
-* supports "#" comments everywhere
-* raises errors with proper line-numbers
-* no bells and whistles like automatic substitutions
-* iniconfig raises an Error if two sections have the same name.
-
-If you encounter issues or have feature wishes please report them to:
-
-    http://github.org/RonnyPfannschmidt/iniconfig/issues
-
-Basic Example
-===================================
-
-If you have an ini file like this::
-
-    # content of example.ini
-    [section1] # comment
-    name1=value1  # comment
-    name1b=value1,value2  # comment
-
-    [section2]
-    name2=
-        line1
-        line2
-
-then you can do::
-
-    >>> import iniconfig
-    >>> ini = iniconfig.IniConfig("example.ini")
-    >>> ini['section1']['name1'] # raises KeyError if not exists
-    'value1'
-    >>> ini.get('section1', 'name1b', [], lambda x: x.split(","))
-    ['value1', 'value2']
-    >>> ini.get('section1', 'notexist', [], lambda x: x.split(","))
-    []
-    >>> [x.name for x in list(ini)]
-    ['section1', 'section2']
-    >>> list(list(ini)[0].items())
-    [('name1', 'value1'), ('name1b', 'value1,value2')]
-    >>> 'section1' in ini
-    True
-    >>> 'inexistendsection' in ini
-    False
-
-
diff --git a/py/_vendored_packages/iniconfig-1.0.0.dist-info/RECORD b/py/_vendored_packages/iniconfig-1.0.0.dist-info/RECORD
deleted file mode 100644 (file)
index ec2f5e1..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-iniconfig.py,sha256=-pBe5AF_6aAwo1CxJQ8i_zJq6ejc6IxHta7qk2tNJhY,5208\r
-iniconfig-1.0.0.dist-info/DESCRIPTION.rst,sha256=BDLMwWqfjpwZ5yqXRvz1x6bf8Dnt_pZhElekAwtL19o,1522\r
-iniconfig-1.0.0.dist-info/METADATA,sha256=bb2T8WUSDXXiUVxZ4WXhbffq6stikMTlB1jyrPbLfyU,2405\r
-iniconfig-1.0.0.dist-info/RECORD,,\r
-iniconfig-1.0.0.dist-info/WHEEL,sha256=3XK1Z4AI42GuJXciCpiHMOkbehxRV8QDBW8IU41k3ZU,96\r
-iniconfig-1.0.0.dist-info/metadata.json,sha256=UYYwW0p815nU4qz8Iq1gGqIYaAcsCyGju3jXvTOyXSI,950\r
-iniconfig-1.0.0.dist-info/top_level.txt,sha256=7KfM0fugdlToj9UW7enKXk2HYALQD8qHiyKtjhSzgN8,10\r
-iniconfig-1.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4\r
-__pycache__/iniconfig.cpython-35.pyc,,\r
diff --git a/py/_vendored_packages/iniconfig-1.0.0.dist-info/WHEEL b/py/_vendored_packages/iniconfig-1.0.0.dist-info/WHEEL
deleted file mode 100644 (file)
index 15b96c9..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.30.0.a0)
-Root-Is-Purelib: true
-Tag: cp35-none-any
-
diff --git a/py/_vendored_packages/iniconfig-1.0.0.dist-info/metadata.json b/py/_vendored_packages/iniconfig-1.0.0.dist-info/metadata.json
deleted file mode 100644 (file)
index 084daa6..0000000
+++ /dev/null
@@ -1 +0,0 @@
-{"classifiers": ["Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: POSIX", "Operating System :: Microsoft :: Windows", "Operating System :: MacOS :: MacOS X", "Topic :: Software Development :: Libraries", "Topic :: Utilities", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 3"], "extensions": {"python.details": {"contacts": [{"email": "opensource@ronnypfannschmidt.de, holger.krekel@gmail.com", "name": "Ronny Pfannschmidt, Holger Krekel", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "http://github.com/RonnyPfannschmidt/iniconfig"}}}, "generator": "bdist_wheel (0.30.0.a0)", "license": "MIT License", "metadata_version": "2.0", "name": "iniconfig", "platform": "unix", "summary": "iniconfig: brain-dead simple config-ini parsing", "version": "1.0.0"}
\ No newline at end of file
diff --git a/py/_vendored_packages/iniconfig-1.0.0.dist-info/top_level.txt b/py/_vendored_packages/iniconfig-1.0.0.dist-info/top_level.txt
deleted file mode 100644 (file)
index 9dda536..0000000
+++ /dev/null
@@ -1 +0,0 @@
-iniconfig
diff --git a/py/_vendored_packages/iniconfig-1.1.1.dist-info/INSTALLER b/py/_vendored_packages/iniconfig-1.1.1.dist-info/INSTALLER
new file mode 100644 (file)
index 0000000..a1b589e
--- /dev/null
@@ -0,0 +1 @@
+pip
diff --git a/py/_vendored_packages/iniconfig-1.1.1.dist-info/LICENSE b/py/_vendored_packages/iniconfig-1.1.1.dist-info/LICENSE
new file mode 100644 (file)
index 0000000..31ecdfb
--- /dev/null
@@ -0,0 +1,19 @@
+
+  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.
+
diff --git a/py/_vendored_packages/iniconfig-1.1.1.dist-info/METADATA b/py/_vendored_packages/iniconfig-1.1.1.dist-info/METADATA
new file mode 100644 (file)
index 0000000..c078a75
--- /dev/null
@@ -0,0 +1,78 @@
+Metadata-Version: 2.1
+Name: iniconfig
+Version: 1.1.1
+Summary: iniconfig: brain-dead simple config-ini parsing
+Home-page: http://github.com/RonnyPfannschmidt/iniconfig
+Author: Ronny Pfannschmidt, Holger Krekel
+Author-email: opensource@ronnypfannschmidt.de, holger.krekel@gmail.com
+License: MIT License
+Platform: unix
+Platform: linux
+Platform: osx
+Platform: cygwin
+Platform: win32
+Classifier: Development Status :: 4 - Beta
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: POSIX
+Classifier: Operating System :: Microsoft :: Windows
+Classifier: Operating System :: MacOS :: MacOS X
+Classifier: Topic :: Software Development :: Libraries
+Classifier: Topic :: Utilities
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 3
+
+iniconfig: brain-dead simple parsing of ini files
+=======================================================
+
+iniconfig is a small and simple INI-file parser module
+having a unique set of features:
+
+* tested against Python2.4 across to Python3.2, Jython, PyPy
+* maintains order of sections and entries
+* supports multi-line values with or without line-continuations
+* supports "#" comments everywhere
+* raises errors with proper line-numbers
+* no bells and whistles like automatic substitutions
+* iniconfig raises an Error if two sections have the same name.
+
+If you encounter issues or have feature wishes please report them to:
+
+    http://github.com/RonnyPfannschmidt/iniconfig/issues
+
+Basic Example
+===================================
+
+If you have an ini file like this::
+
+    # content of example.ini
+    [section1] # comment
+    name1=value1  # comment
+    name1b=value1,value2  # comment
+
+    [section2]
+    name2=
+        line1
+        line2
+
+then you can do::
+
+    >>> import iniconfig
+    >>> ini = iniconfig.IniConfig("example.ini")
+    >>> ini['section1']['name1'] # raises KeyError if not exists
+    'value1'
+    >>> ini.get('section1', 'name1b', [], lambda x: x.split(","))
+    ['value1', 'value2']
+    >>> ini.get('section1', 'notexist', [], lambda x: x.split(","))
+    []
+    >>> [x.name for x in list(ini)]
+    ['section1', 'section2']
+    >>> list(list(ini)[0].items())
+    [('name1', 'value1'), ('name1b', 'value1,value2')]
+    >>> 'section1' in ini
+    True
+    >>> 'inexistendsection' in ini
+    False
+
+
diff --git a/py/_vendored_packages/iniconfig-1.1.1.dist-info/RECORD b/py/_vendored_packages/iniconfig-1.1.1.dist-info/RECORD
new file mode 100644 (file)
index 0000000..73a6fe1
--- /dev/null
@@ -0,0 +1,11 @@
+../../../../home/ran/.cache/pycache/tmp/pip-target-oxds71ih/lib/python/iniconfig/__init__.cpython-39.pyc,,\r
+iniconfig-1.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4\r
+iniconfig-1.1.1.dist-info/LICENSE,sha256=KvaAw570k_uCgwNW0dPfGstaBgM8ui3sehniHKp3qGY,1061\r
+iniconfig-1.1.1.dist-info/METADATA,sha256=_4-oFKpRXuZv5rzepScpXRwhq6DzqsgbnA5ZpgMUMcs,2405\r
+iniconfig-1.1.1.dist-info/RECORD,,\r
+iniconfig-1.1.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0\r
+iniconfig-1.1.1.dist-info/WHEEL,sha256=ADKeyaGyKF5DwBNE0sRE5pvW-bSkFMJfBuhzZ3rceP4,110\r
+iniconfig-1.1.1.dist-info/top_level.txt,sha256=7KfM0fugdlToj9UW7enKXk2HYALQD8qHiyKtjhSzgN8,10\r
+iniconfig/__init__.py,sha256=-pBe5AF_6aAwo1CxJQ8i_zJq6ejc6IxHta7qk2tNJhY,5208\r
+iniconfig/__init__.pyi,sha256=-4KOctzq28ohRmTZsqlH6aylyFqsNKxYqtk1dteypi4,1205\r
+iniconfig/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0\r
diff --git a/py/_vendored_packages/iniconfig-1.1.1.dist-info/REQUESTED b/py/_vendored_packages/iniconfig-1.1.1.dist-info/REQUESTED
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/py/_vendored_packages/iniconfig-1.1.1.dist-info/WHEEL b/py/_vendored_packages/iniconfig-1.1.1.dist-info/WHEEL
new file mode 100644 (file)
index 0000000..6d38aa0
--- /dev/null
@@ -0,0 +1,6 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.35.1)
+Root-Is-Purelib: true
+Tag: py2-none-any
+Tag: py3-none-any
+
diff --git a/py/_vendored_packages/iniconfig-1.1.1.dist-info/top_level.txt b/py/_vendored_packages/iniconfig-1.1.1.dist-info/top_level.txt
new file mode 100644 (file)
index 0000000..9dda536
--- /dev/null
@@ -0,0 +1 @@
+iniconfig
diff --git a/py/_vendored_packages/iniconfig.py b/py/_vendored_packages/iniconfig.py
deleted file mode 100644 (file)
index 6ad9eaf..0000000
+++ /dev/null
@@ -1,165 +0,0 @@
-""" brain-dead simple parser for ini-style files.
-(C) Ronny Pfannschmidt, Holger Krekel -- MIT licensed
-"""
-__all__ = ['IniConfig', 'ParseError']
-
-COMMENTCHARS = "#;"
-
-
-class ParseError(Exception):
-    def __init__(self, path, lineno, msg):
-        Exception.__init__(self, path, lineno, msg)
-        self.path = path
-        self.lineno = lineno
-        self.msg = msg
-
-    def __str__(self):
-        return "%s:%s: %s" % (self.path, self.lineno+1, self.msg)
-
-
-class SectionWrapper(object):
-    def __init__(self, config, name):
-        self.config = config
-        self.name = name
-
-    def lineof(self, name):
-        return self.config.lineof(self.name, name)
-
-    def get(self, key, default=None, convert=str):
-        return self.config.get(self.name, key,
-                               convert=convert, default=default)
-
-    def __getitem__(self, key):
-        return self.config.sections[self.name][key]
-
-    def __iter__(self):
-        section = self.config.sections.get(self.name, [])
-
-        def lineof(key):
-            return self.config.lineof(self.name, key)
-        for name in sorted(section, key=lineof):
-            yield name
-
-    def items(self):
-        for name in self:
-            yield name, self[name]
-
-
-class IniConfig(object):
-    def __init__(self, path, data=None):
-        self.path = str(path)  # convenience
-        if data is None:
-            f = open(self.path)
-            try:
-                tokens = self._parse(iter(f))
-            finally:
-                f.close()
-        else:
-            tokens = self._parse(data.splitlines(True))
-
-        self._sources = {}
-        self.sections = {}
-
-        for lineno, section, name, value in tokens:
-            if section is None:
-                self._raise(lineno, 'no section header defined')
-            self._sources[section, name] = lineno
-            if name is None:
-                if section in self.sections:
-                    self._raise(lineno, 'duplicate section %r' % (section, ))
-                self.sections[section] = {}
-            else:
-                if name in self.sections[section]:
-                    self._raise(lineno, 'duplicate name %r' % (name, ))
-                self.sections[section][name] = value
-
-    def _raise(self, lineno, msg):
-        raise ParseError(self.path, lineno, msg)
-
-    def _parse(self, line_iter):
-        result = []
-        section = None
-        for lineno, line in enumerate(line_iter):
-            name, data = self._parseline(line, lineno)
-            # new value
-            if name is not None and data is not None:
-                result.append((lineno, section, name, data))
-            # new section
-            elif name is not None and data is None:
-                if not name:
-                    self._raise(lineno, 'empty section name')
-                section = name
-                result.append((lineno, section, None, None))
-            # continuation
-            elif name is None and data is not None:
-                if not result:
-                    self._raise(lineno, 'unexpected value continuation')
-                last = result.pop()
-                last_name, last_data = last[-2:]
-                if last_name is None:
-                    self._raise(lineno, 'unexpected value continuation')
-
-                if last_data:
-                    data = '%s\n%s' % (last_data, data)
-                result.append(last[:-1] + (data,))
-        return result
-
-    def _parseline(self, line, lineno):
-        # blank lines
-        if iscommentline(line):
-            line = ""
-        else:
-            line = line.rstrip()
-        if not line:
-            return None, None
-        # section
-        if line[0] == '[':
-            realline = line
-            for c in COMMENTCHARS:
-                line = line.split(c)[0].rstrip()
-            if line[-1] == "]":
-                return line[1:-1], None
-            return None, realline.strip()
-        # value
-        elif not line[0].isspace():
-            try:
-                name, value = line.split('=', 1)
-                if ":" in name:
-                    raise ValueError()
-            except ValueError:
-                try:
-                    name, value = line.split(":", 1)
-                except ValueError:
-                    self._raise(lineno, 'unexpected line: %r' % line)
-            return name.strip(), value.strip()
-        # continuation
-        else:
-            return None, line.strip()
-
-    def lineof(self, section, name=None):
-        lineno = self._sources.get((section, name))
-        if lineno is not None:
-            return lineno + 1
-
-    def get(self, section, name, default=None, convert=str):
-        try:
-            return convert(self.sections[section][name])
-        except KeyError:
-            return default
-
-    def __getitem__(self, name):
-        if name not in self.sections:
-            raise KeyError(name)
-        return SectionWrapper(self, name)
-
-    def __iter__(self):
-        for name in sorted(self.sections, key=self.lineof):
-            yield SectionWrapper(self, name)
-
-    def __contains__(self, arg):
-        return arg in self.sections
-
-
-def iscommentline(line):
-    c = line.lstrip()[:1]
-    return c in COMMENTCHARS
diff --git a/py/_vendored_packages/iniconfig/__init__.py b/py/_vendored_packages/iniconfig/__init__.py
new file mode 100644 (file)
index 0000000..6ad9eaf
--- /dev/null
@@ -0,0 +1,165 @@
+""" brain-dead simple parser for ini-style files.
+(C) Ronny Pfannschmidt, Holger Krekel -- MIT licensed
+"""
+__all__ = ['IniConfig', 'ParseError']
+
+COMMENTCHARS = "#;"
+
+
+class ParseError(Exception):
+    def __init__(self, path, lineno, msg):
+        Exception.__init__(self, path, lineno, msg)
+        self.path = path
+        self.lineno = lineno
+        self.msg = msg
+
+    def __str__(self):
+        return "%s:%s: %s" % (self.path, self.lineno+1, self.msg)
+
+
+class SectionWrapper(object):
+    def __init__(self, config, name):
+        self.config = config
+        self.name = name
+
+    def lineof(self, name):
+        return self.config.lineof(self.name, name)
+
+    def get(self, key, default=None, convert=str):
+        return self.config.get(self.name, key,
+                               convert=convert, default=default)
+
+    def __getitem__(self, key):
+        return self.config.sections[self.name][key]
+
+    def __iter__(self):
+        section = self.config.sections.get(self.name, [])
+
+        def lineof(key):
+            return self.config.lineof(self.name, key)
+        for name in sorted(section, key=lineof):
+            yield name
+
+    def items(self):
+        for name in self:
+            yield name, self[name]
+
+
+class IniConfig(object):
+    def __init__(self, path, data=None):
+        self.path = str(path)  # convenience
+        if data is None:
+            f = open(self.path)
+            try:
+                tokens = self._parse(iter(f))
+            finally:
+                f.close()
+        else:
+            tokens = self._parse(data.splitlines(True))
+
+        self._sources = {}
+        self.sections = {}
+
+        for lineno, section, name, value in tokens:
+            if section is None:
+                self._raise(lineno, 'no section header defined')
+            self._sources[section, name] = lineno
+            if name is None:
+                if section in self.sections:
+                    self._raise(lineno, 'duplicate section %r' % (section, ))
+                self.sections[section] = {}
+            else:
+                if name in self.sections[section]:
+                    self._raise(lineno, 'duplicate name %r' % (name, ))
+                self.sections[section][name] = value
+
+    def _raise(self, lineno, msg):
+        raise ParseError(self.path, lineno, msg)
+
+    def _parse(self, line_iter):
+        result = []
+        section = None
+        for lineno, line in enumerate(line_iter):
+            name, data = self._parseline(line, lineno)
+            # new value
+            if name is not None and data is not None:
+                result.append((lineno, section, name, data))
+            # new section
+            elif name is not None and data is None:
+                if not name:
+                    self._raise(lineno, 'empty section name')
+                section = name
+                result.append((lineno, section, None, None))
+            # continuation
+            elif name is None and data is not None:
+                if not result:
+                    self._raise(lineno, 'unexpected value continuation')
+                last = result.pop()
+                last_name, last_data = last[-2:]
+                if last_name is None:
+                    self._raise(lineno, 'unexpected value continuation')
+
+                if last_data:
+                    data = '%s\n%s' % (last_data, data)
+                result.append(last[:-1] + (data,))
+        return result
+
+    def _parseline(self, line, lineno):
+        # blank lines
+        if iscommentline(line):
+            line = ""
+        else:
+            line = line.rstrip()
+        if not line:
+            return None, None
+        # section
+        if line[0] == '[':
+            realline = line
+            for c in COMMENTCHARS:
+                line = line.split(c)[0].rstrip()
+            if line[-1] == "]":
+                return line[1:-1], None
+            return None, realline.strip()
+        # value
+        elif not line[0].isspace():
+            try:
+                name, value = line.split('=', 1)
+                if ":" in name:
+                    raise ValueError()
+            except ValueError:
+                try:
+                    name, value = line.split(":", 1)
+                except ValueError:
+                    self._raise(lineno, 'unexpected line: %r' % line)
+            return name.strip(), value.strip()
+        # continuation
+        else:
+            return None, line.strip()
+
+    def lineof(self, section, name=None):
+        lineno = self._sources.get((section, name))
+        if lineno is not None:
+            return lineno + 1
+
+    def get(self, section, name, default=None, convert=str):
+        try:
+            return convert(self.sections[section][name])
+        except KeyError:
+            return default
+
+    def __getitem__(self, name):
+        if name not in self.sections:
+            raise KeyError(name)
+        return SectionWrapper(self, name)
+
+    def __iter__(self):
+        for name in sorted(self.sections, key=self.lineof):
+            yield SectionWrapper(self, name)
+
+    def __contains__(self, arg):
+        return arg in self.sections
+
+
+def iscommentline(line):
+    c = line.lstrip()[:1]
+    return c in COMMENTCHARS
diff --git a/py/_vendored_packages/iniconfig/__init__.pyi b/py/_vendored_packages/iniconfig/__init__.pyi
new file mode 100644 (file)
index 0000000..b6284be
--- /dev/null
@@ -0,0 +1,31 @@
+from typing import Callable, Iterator, Mapping, Optional, Tuple, TypeVar, Union
+from typing_extensions import Final
+
+_D = TypeVar('_D')
+_T = TypeVar('_T')
+
+class ParseError(Exception):
+    # Private __init__.
+    path: Final[str]
+    lineno: Final[int]
+    msg: Final[str]
+
+class SectionWrapper:
+    # Private __init__.
+    config: Final[IniConfig]
+    name: Final[str]
+    def __getitem__(self, key: str) -> str: ...
+    def __iter__(self) -> Iterator[str]: ...
+    def get(self, key: str, default: _D = ..., convert: Callable[[str], _T] = ...) -> Union[_T, _D]: ...
+    def items(self) -> Iterator[Tuple[str, str]]: ...
+    def lineof(self, name: str) -> Optional[int]: ...
+
+class IniConfig:
+    path: Final[str]
+    sections: Final[Mapping[str, Mapping[str, str]]]
+    def __init__(self, path: str, data: Optional[str] = None): ...
+    def __contains__(self, arg: str) -> bool: ...
+    def __getitem__(self, name: str) -> SectionWrapper: ...
+    def __iter__(self) -> Iterator[SectionWrapper]: ...
+    def get(self, section: str, name: str, default: _D = ..., convert: Callable[[str], _T] = ...) -> Union[_T, _D]: ...
+    def lineof(self, section: str, name: Optional[str] = ...) -> Optional[int]: ...
diff --git a/py/_vendored_packages/iniconfig/py.typed b/py/_vendored_packages/iniconfig/py.typed
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/py/_version.py b/py/_version.py
deleted file mode 100644 (file)
index 5738e0b..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-# coding: utf-8
-# file generated by setuptools_scm
-# don't change, don't track in version control
-version = '1.9.0'
index 79b5e6adb2d69d5c24b973f91040287e4cdbdfea..b6284bec3f65439b5020702cf09fac412d1e4917 100644 (file)
@@ -5,27 +5,27 @@ _D = TypeVar('_D')
 _T = TypeVar('_T')
 
 class ParseError(Exception):
+    # Private __init__.
     path: Final[str]
     lineno: Final[int]
     msg: Final[str]
-    def __init__(self, path: str, lineno: int, msg: str) -> None: ...
 
-class _SectionWrapper:
+class SectionWrapper:
+    # Private __init__.
     config: Final[IniConfig]
     name: Final[str]
-    def __init__(self, config: IniConfig, name: str) -> None: ...
-    def __getitem__(self, key: str) -> Optional[str]: ...
+    def __getitem__(self, key: str) -> str: ...
     def __iter__(self) -> Iterator[str]: ...
-    def get(self, key: str, default: _D = ..., convert: Callable[[Optional[str]], _T] = ...) -> Union[_T, _D]: ...
-    def items(self) -> Iterator[Tuple[str, Optional[str]]]: ...
+    def get(self, key: str, default: _D = ..., convert: Callable[[str], _T] = ...) -> Union[_T, _D]: ...
+    def items(self) -> Iterator[Tuple[str, str]]: ...
     def lineof(self, name: str) -> Optional[int]: ...
 
 class IniConfig:
     path: Final[str]
-    sections: Final[Mapping[str, Mapping[str, Optional[str]]]]
+    sections: Final[Mapping[str, Mapping[str, str]]]
     def __init__(self, path: str, data: Optional[str] = None): ...
     def __contains__(self, arg: str) -> bool: ...
-    def __getitem__(self, name: str) -> _SectionWrapper: ...
-    def __iter__(self) -> Iterator[_SectionWrapper]: ...
-    def get(self, section: str, name: str, default: _D = ..., convert: Callable[[Optional[str]], _T] = ...) -> Union[_T, _D]: ...
+    def __getitem__(self, name: str) -> SectionWrapper: ...
+    def __iter__(self) -> Iterator[SectionWrapper]: ...
+    def get(self, section: str, name: str, default: _D = ..., convert: Callable[[str], _T] = ...) -> Union[_T, _D]: ...
     def lineof(self, section: str, name: Optional[str] = ...) -> Optional[int]: ...
index 602dccab839649a0962f90606b90aa884dd34e84..5f25c2febfd94b62b56a225fa64aea342b93937f 100644 (file)
--- a/setup.cfg
+++ b/setup.cfg
@@ -5,9 +5,4 @@ universal = 1
 license_file = LICENSE
 
 [devpi:upload]
-formats = sdist.tgz,bdist_wheel
-
-[egg_info]
-tag_build = 
-tag_date = 0
-
+formats=sdist.tgz,bdist_wheel
index 5d74b649e11a235b4c50e639df39204bd9b37f50..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,12 +0,0 @@
-"""
-Invoke tasks to help with pytest development and release process.
-"""
-
-import invoke
-
-from . import vendoring
-
-
-ns = invoke.Collection(
-    vendoring
-)
index fbc171bc3e0cdb4f34fff85f46753b1c85664e70..3c7d6015cfa75e6e02b24700420a0e38db9eb2c5 100644 (file)
@@ -1,23 +1,41 @@
 from __future__ import absolute_import, print_function
-import py
-import invoke
+import os.path
+import shutil
+import subprocess
+import sys
 
-VENDOR_TARGET = py.path.local("py/_vendored_packages")
-GOOD_FILES = 'README.md', '__init__.py'
+VENDOR_TARGET = "py/_vendored_packages"
+GOOD_FILES = ('README.md', '__init__.py')
 
-@invoke.task()
-def remove_libs(ctx):
+
+def remove_libs():
     print("removing vendored libs")
-    for path in VENDOR_TARGET.listdir():
-        if path.basename not in GOOD_FILES:
+    for filename in os.listdir(VENDOR_TARGET):
+        if filename not in GOOD_FILES:
+            path = os.path.join(VENDOR_TARGET, filename)
             print(" ", path)
-            path.remove()
+            if os.path.isfile(path):
+                os.remove(path)
+            else:
+                shutil.rmtree(path)
+
 
-@invoke.task(pre=[remove_libs])
-def update_libs(ctx):
+def update_libs():
     print("installing libs")
-    ctx.run("pip install -t {target} apipkg iniconfig".format(target=VENDOR_TARGET))
-    ctx.run("git add {target}".format(target=VENDOR_TARGET))
+    subprocess.check_call((
+        sys.executable, '-m', 'pip', 'install',
+        '--target', VENDOR_TARGET, 'apipkg', 'iniconfig',
+    ))
+    subprocess.check_call(('git', 'add', VENDOR_TARGET))
     print("Please commit to finish the update after running the tests:")
     print()
     print('    git commit -am "Updated vendored libs"')
+
+
+def main():
+    remove_libs()
+    update_libs()
+
+
+if __name__ == '__main__':
+    exit(main())
index 3492761a4e9e34e1ddf037b3d7372075c30323f0..ca9a42275cff29a7f370170e7107b25a224b8953 100644 (file)
@@ -103,7 +103,7 @@ def test_source_strip_multiline():
 def test_syntaxerror_rerepresentation():
     ex = py.test.raises(SyntaxError, py.code.compile, 'xyz xyz')
     assert ex.value.lineno == 1
-    assert ex.value.offset in (4,7) # XXX pypy/jython versus cpython?
+    assert ex.value.offset in (5, 7)  # pypy/cpython difference
     assert ex.value.text.strip(), 'x x'
 
 def test_isparseable():
@@ -456,7 +456,9 @@ def test_getfslineno():
     class B:
         pass
     B.__name__ = "B2"
-    assert getfslineno(B)[1] == -1
+    # TODO: On CPython 3.9 this actually returns the line,
+    #       should it?
+    # assert getfslineno(B)[1] == -1
 
 def test_code_of_object_instance_with_call():
     class A:
@@ -510,11 +512,17 @@ def test_comments():
 comment 4
 """
 '''
-    for line in range(2,6):
-        assert str(getstatement(line, source)) == '    x = 1'
-    for line in range(6,10):
-        assert str(getstatement(line, source)) == '    assert False'
-    assert str(getstatement(10, source)) == '"""'
+    for line in range(2, 6):
+        assert str(getstatement(line, source)) == "    x = 1"
+    if sys.version_info >= (3, 8) or hasattr(sys, "pypy_version_info"):
+        tqs_start = 8
+    else:
+        tqs_start = 10
+        assert str(getstatement(10, source)) == '"""'
+    for line in range(6, tqs_start):
+        assert str(getstatement(line, source)) == "    assert False"
+    for line in range(tqs_start, 10):
+        assert str(getstatement(line, source)) == '"""\ncomment 4\n"""'
 
 def test_comment_in_statement():
     source = '''test(foo=1,
index a6b8f476f6702d79cb8de395b1ab6c72e69a1f88..1b9a7923f6539a80e9ec21d7e90e256eff96642d 100644 (file)
@@ -721,8 +721,9 @@ def test_samefile_symlink(tmpdir):
     p2 = tmpdir.join("linked.txt")
     try:
         os.symlink(str(p1), str(p2))
-    except OSError as e:
+    except (OSError, NotImplementedError) as e:
         # on Windows this might fail if the user doesn't have special symlink permissions
+        # pypy3 on Windows doesn't implement os.symlink and raises NotImplementedError
         pytest.skip(str(e.args[0]))
 
     assert p1.samefile(p2)