Metadata-Version: 1.1
Name: virtualenv
Version: 12.0.5
Summary: Virtual Python Environment builder
Home-page: https://virtualenv.pypa.io/
Author: Jannis Leidel, Carl Meyer and Brian Rosner
Author-email: python-virtualenv@groups.google.com
License: MIT
Description: Virtualenv
        ==========
        
        `Mailing list <http://groups.google.com/group/python-virtualenv>`_ |
        `Issues <https://github.com/pypa/virtualenv/issues>`_ |
        `Github <https://github.com/pypa/virtualenv>`_ |
        `PyPI <https://pypi.python.org/pypi/virtualenv/>`_ |
        User IRC: #pypa
        Dev IRC: #pypa-dev
        
        Introduction
        ------------
        
        ``virtualenv`` is a tool to create isolated Python environments.
        
        The basic problem being addressed is one of dependencies and versions,
        and indirectly permissions. Imagine you have an application that
        needs version 1 of LibFoo, but another application requires version
        2. How can you use both these applications?  If you install
        everything into ``/usr/lib/python2.7/site-packages`` (or whatever your
        platform's standard location is), it's easy to end up in a situation
        where you unintentionally upgrade an application that shouldn't be
        upgraded.
        
        Or more generally, what if you want to install an application *and
        leave it be*?  If an application works, any change in its libraries or
        the versions of those libraries can break the application.
        
        Also, what if you can't install packages into the global
        ``site-packages`` directory?  For instance, on a shared host.
        
        In all these cases, ``virtualenv`` can help you. It creates an
        environment that has its own installation directories, that doesn't
        share libraries with other virtualenv environments (and optionally
        doesn't access the globally installed libraries either).
        
        .. comment: 
        
        Release History
        ===============
        
        12.0.5 (2015-01-03)
        ~~~~~~~~~~~~~~~~~~~
        
        * Upgrade pip to 6.0.6
        
        * Upgrade setuptools to 11.0
        
        
        12.0.4 (2014-22-23)
        ~~~~~~~~~~~~~~~~~~~
        
        * Revert the fix to ``-p`` on Debian based pythons as it was broken in other
          situations.
        
        * Revert several sys.path changes new in 12.0 which were breaking virtualenv.
        
        12.0.3 (2014-22-23)
        ~~~~~~~~~~~~~~~~~~~
        
        * Fix an issue where Debian based Pythons would fail when using -p with the
          host Python.
        
        * Upgrade pip to 6.0.3
        
        12.0.2 (2014-12-23)
        ~~~~~~~~~~~~~~~~~~~
        
        * Upgraded pip to 6.0.2
        
        12.0.1 (2014-12-22)
        ~~~~~~~~~~~~~~~~~~~
        
        * Upgraded pip to 6.0.1
        
        12.0 (2014-12-22)
        ~~~~~~~~~~~~~~~~~
        
        * **PROCESS** Version numbers are now simply ``X.Y`` where the leading ``1``
          has been dropped.
        * Split up documentation into structured pages
        * Now using pytest framework
        * Correct sys.path ordering for debian, issue #461
        * Correctly throws error on older Pythons, issue #619
        * Allow for empty $PATH, pull #601
        * Don't set prompt if $env:VIRTUAL_ENV_DISABLE_PROMPT is set for Powershell
        * Updated setuptools to 7.0
        
        1.11.6 (2014-05-16)
        ~~~~~~~~~~~~~~~~~~~
        
        * Updated setuptools to 3.6
        * Updated pip to 1.5.6
        
        1.11.5 (2014-05-03)
        ~~~~~~~~~~~~~~~~~~~
        
        * Updated setuptools to 3.4.4
        * Updated documentation to use https://virtualenv.pypa.io/
        * Updated pip to 1.5.5
        
        1.11.4 (2014-02-21)
        ~~~~~~~~~~~~~~~~~~~
        
        * Updated pip to 1.5.4
        
        
        1.11.3 (2014-02-20)
        ~~~~~~~~~~~~~~~~~~~
        
        * Updated setuptools to 2.2
        * Updated pip to 1.5.3
        
        
        1.11.2 (2014-01-26)
        ~~~~~~~~~~~~~~~~~~~
        
        * Fixed easy_install installed virtualenvs by updated pip to 1.5.2
        
        1.11.1 (2014-01-20)
        ~~~~~~~~~~~~~~~~~~~
        
        * Fixed an issue where pip and setuptools were not getting installed when using
          the ``--system-site-packages`` flag.
        * Updated setuptools to fix an issue when installed with easy_install
        * Fixed an issue with Python 3.4 and sys.stdout encoding being set to ascii
        * Upgraded pip to v1.5.1
        * Upgraded setuptools to v2.1
        
        1.11 (2014-01-02)
        ~~~~~~~~~~~~~~~~~
        
        * **BACKWARDS INCOMPATIBLE** Switched to using wheels for the bundled copies of
          setuptools and pip. Using sdists is no longer supported - users supplying
          their own versions of pip/setuptools will need to provide wheels.
        * **BACKWARDS INCOMPATIBLE** Modified the handling of ``--extra-search-dirs``.
          This option now works like pip's ``--find-links`` option, in that it adds
          extra directories to search for compatible wheels for pip and setuptools.
          The actual wheel selected is chosen based on version and compatibility, using
          the same algorithm as ``pip install setuptools``.
        * Fixed #495, --always-copy was failing (#PR 511)
        * Upgraded pip to v1.5
        * Upgraded setuptools to v1.4
        
        1.10.1 (2013-08-07)
        ~~~~~~~~~~~~~~~~~~~
        
        * **New Signing Key** Release 1.10.1 is using a different key than normal with
          fingerprint: 7C6B 7C5D 5E2B 6356 A926 F04F 6E3C BCE9 3372 DCFA
        * Upgraded pip to v1.4.1
        * Upgraded setuptools to v0.9.8
        
        
        1.10 (2013-07-23)
        ~~~~~~~~~~~~~~~~~
        
        * **BACKWARDS INCOMPATIBLE** Dropped support for Python 2.5. The minimum
          supported Python version is now Python 2.6.
        
        * **BACKWARDS INCOMPATIBLE** Using ``virtualenv.py`` as an isolated script
          (i.e. without an associated ``virtualenv_support`` directory) is no longer
          supported for security reasons and will fail with an error.
        
          Along with this, ``--never-download`` is now always pinned to ``True``, and
          is only being maintained in the short term for backward compatibility
          (Pull #412).
        
        * **IMPORTANT** Switched to the new setuptools (v0.9.7) which has been merged
          with Distribute_ again and works for Python 2 and 3 with one codebase.
          The ``--distribute`` and ``--setuptools`` options are now no-op.
        
        * Updated to pip 1.4.
        
        * Added support for PyPy3k
        
        * Added the option to use a version number with the ``-p`` option to get the
          system copy of that Python version (Windows only)
        
        * Removed embedded ``ez_setup.py``, ``distribute_setup.py`` and
          ``distribute_from_egg.py`` files as part of switching to merged setuptools.
        
        * Fixed ``--relocatable`` to work better on Windows.
        
        * Fixed issue with readline on Windows.
        
        .. _Distribute: https://pypi.python.org/pypi/distribute
        
        1.9.1 (2013-03-08)
        ~~~~~~~~~~~~~~~~~~
        
        * Updated to pip 1.3.1 that fixed a major backward incompatible change of
          parsing URLs to externally hosted packages that got accidentily included
          in pip 1.3.
        
        1.9 (2013-03-07)
        ~~~~~~~~~~~~~~~~
        
        * Unset VIRTUAL_ENV environment variable in deactivate.bat (Pull #364)
        * Upgraded distribute to 0.6.34.
        * Added ``--no-setuptools`` and ``--no-pip`` options (Pull #336).
        * Fixed Issue #373. virtualenv-1.8.4 was failing in cygwin (Pull #382).
        * Fixed Issue #378. virtualenv is now "multiarch" aware on debian/ubuntu (Pull #379).
        * Fixed issue with readline module path on pypy and OSX (Pull #374).
        * Made 64bit detection compatible with Python 2.5 (Pull #393).
        
        
        1.8.4 (2012-11-25)
        ~~~~~~~~~~~~~~~~~~
        
        * Updated distribute to 0.6.31. This fixes #359 (numpy install regression) on
          UTF-8 platforms, and provides a workaround on other platforms:
          ``PYTHONIOENCODING=utf8 pip install numpy``.
        
        * When installing virtualenv via curl, don't forget to filter out arguments
          the distribute setup script won't understand. Fixes #358.
        
        * Added some more integration tests.
        
        * Removed the unsupported embedded setuptools egg for Python 2.4 to reduce
          file size.
        
        1.8.3 (2012-11-21)
        ~~~~~~~~~~~~~~~~~~
        
        * Fixed readline on OS X. Thanks minrk
        
        * Updated distribute to 0.6.30 (improves our error reporting, plus new
          distribute features and fixes). Thanks Gabriel (g2p)
        
        * Added compatibility with multiarch Python (Python 3.3 for example). Added an
          integration test. Thanks Gabriel (g2p)
        
        * Added ability to install distribute from a user-provided egg, rather than the
          bundled sdist, for better speed. Thanks Paul Moore.
        
        * Make the creation of lib64 symlink smarter about already-existing symlink,
          and more explicit about full paths. Fixes #334 and #330. Thanks Jeremy Orem.
        
        * Give lib64 site-dir preference over lib on 64-bit systems, to avoid wrong
          32-bit compiles in the venv. Fixes #328. Thanks Damien Nozay.
        
        * Fix a bug with prompt-handling in ``activate.csh`` in non-interactive csh
          shells. Fixes #332. Thanks Benjamin Root for report and patch.
        
        * Make it possible to create a virtualenv from within a Python
          3.3. pyvenv. Thanks Chris McDonough for the report.
        
        * Add optional --setuptools option to be able to switch to it in case
          distribute is the default (like in Debian).
        
        1.8.2 (2012-09-06)
        ~~~~~~~~~~~~~~~~~~
        
        * Updated the included pip version to 1.2.1 to fix regressions introduced
          there in 1.2.
        
        
        1.8.1 (2012-09-03)
        ~~~~~~~~~~~~~~~~~~
        
        * Fixed distribute version used with `--never-download`. Thanks michr for
          report and patch.
        
        * Fix creating Python 3.3 based virtualenvs by unsetting the
          ``__PYVENV_LAUNCHER__`` environment variable in subprocesses.
        
        
        1.8 (2012-09-01)
        ~~~~~~~~~~~~~~~~
        
        * **Dropped support for Python 2.4** The minimum supported Python version is
          now Python 2.5.
        
        * Fix `--relocatable` on systems that use lib64. Fixes #78. Thanks Branden
          Rolston.
        
        * Symlink some additional modules under Python 3. Fixes #194. Thanks Vinay
          Sajip, Ian Clelland, and Stefan Holek for the report.
        
        * Fix ``--relocatable`` when a script uses ``__future__`` imports. Thanks
          Branden Rolston.
        
        * Fix a bug in the config option parser that prevented setting negative
          options with environment variables. Thanks Ralf Schmitt.
        
        * Allow setting ``--no-site-packages`` from the config file.
        
        * Use ``/usr/bin/multiarch-platform`` if available to figure out the include
          directory. Thanks for the patch, Mika Laitio.
        
        * Fix ``install_name_tool`` replacement to work on Python 3.X.
        
        * Handle paths of users' site-packages on Mac OS X correctly when changing
          the prefix.
        
        * Updated the embedded version of distribute to 0.6.28 and pip to 1.2.
        
        
        1.7.2 (2012-06-22)
        ~~~~~~~~~~~~~~~~~~
        
        * Updated to distribute 0.6.27.
        
        * Fix activate.fish on OS X. Fixes #8. Thanks David Schoonover.
        
        * Create a virtualenv-x.x script with the Python version when installing, so
          virtualenv for multiple Python versions can be installed to the same
          script location. Thanks Miki Tebeka.
        
        * Restored ability to create a virtualenv with a path longer than 78
          characters, without breaking creation of virtualenvs with non-ASCII paths.
          Thanks, Bradley Ayers.
        
        * Added ability to create virtualenvs without having installed Apple's
          developers tools (using an own implementation of ``install_name_tool``).
          Thanks Mike Hommey.
        
        * Fixed PyPy and Jython support on Windows. Thanks Konstantin Zemlyak.
        
        * Added pydoc script to ease use. Thanks Marc Abramowitz. Fixes #149.
        
        * Fixed creating a bootstrap script on Python 3. Thanks Raul Leal. Fixes #280.
        
        * Fixed inconsistency when having set the ``PYTHONDONTWRITEBYTECODE`` env var
          with the --distribute option or the ``VIRTUALENV_USE_DISTRIBUTE`` env var.
          ``VIRTUALENV_USE_DISTRIBUTE`` is now considered again as a legacy alias.
        
        
        1.7.1.2 (2012-02-17)
        ~~~~~~~~~~~~~~~~~~~~
        
        * Fixed minor issue in `--relocatable`. Thanks, Cap Petschulat.
        
        
        1.7.1.1 (2012-02-16)
        ~~~~~~~~~~~~~~~~~~~~
        
        * Bumped the version string in ``virtualenv.py`` up, too.
        
        * Fixed rST rendering bug of long description.
        
        
        1.7.1 (2012-02-16)
        ~~~~~~~~~~~~~~~~~~
        
        * Update embedded pip to version 1.1.
        
        * Fix `--relocatable` under Python 3. Thanks Doug Hellmann.
        
        * Added environ PATH modification to activate_this.py. Thanks Doug
          Napoleone. Fixes #14.
        
        * Support creating virtualenvs directly from a Python build directory on
          Windows. Thanks CBWhiz. Fixes #139.
        
        * Use non-recursive symlinks to fix things up for posix_local install
          scheme. Thanks michr.
        
        * Made activate script available for use with msys and cygwin on Windows.
          Thanks Greg Haskins, Cliff Xuan, Jonathan Griffin and Doug Napoleone.
          Fixes #176.
        
        * Fixed creation of virtualenvs on Windows when Python is not installed for
          all users. Thanks Anatoly Techtonik for report and patch and Doug
          Napoleone for testing and confirmation. Fixes #87.
        
        * Fixed creation of virtualenvs using -p in installs where some modules
          that ought to be in the standard library (e.g. `readline`) are actually
          installed in `site-packages` next to `virtualenv.py`. Thanks Greg Haskins
          for report and fix. Fixes #167.
        
        * Added activation script for Powershell (signed by Jannis Leidel). Many
          thanks to Jason R. Coombs.
        
        
        1.7 (2011-11-30)
        ~~~~~~~~~~~~~~~~
        
        * Gave user-provided ``--extra-search-dir`` priority over default dirs for
          finding setuptools/distribute (it already had priority for finding pip).
          Thanks Ethan Jucovy.
        
        * Updated embedded Distribute release to 0.6.24. Thanks Alex Gronholm.
        
        * Made ``--no-site-packages`` behavior the default behavior.  The
          ``--no-site-packages`` flag is still permitted, but displays a warning when
          used. Thanks Chris McDonough.
        
        * New flag: ``--system-site-packages``; this flag should be passed to get the
          previous default global-site-package-including behavior back.
        
        * Added ability to set command options as environment variables and options
          in a ``virtualenv.ini`` file.
        
        * Fixed various encoding related issues with paths. Thanks Gunnlaugur Thor Briem.
        
        * Made ``virtualenv.py`` script executable.
        
        
        1.6.4 (2011-07-21)
        ~~~~~~~~~~~~~~~~~~
        
        * Restored ability to run on Python 2.4, too.
        
        
        1.6.3 (2011-07-16)
        ~~~~~~~~~~~~~~~~~~
        
        * Restored ability to run on Python < 2.7.
        
        
        1.6.2 (2011-07-16)
        ~~~~~~~~~~~~~~~~~~
        
        * Updated embedded distribute release to 0.6.19.
        
        * Updated embedded pip release to 1.0.2.
        
        * Fixed #141 - Be smarter about finding pkg_resources when using the
          non-default Python interpreter (by using the ``-p`` option).
        
        * Fixed #112 - Fixed path in docs.
        
        * Fixed #109 - Corrected doctests of a Logger method.
        
        * Fixed #118 - Fixed creating virtualenvs on platforms that use the
          "posix_local" install scheme, such as Ubuntu with Python 2.7.
        
        * Add missing library to Python 3 virtualenvs (``_dummy_thread``).
        
        
        1.6.1 (2011-04-30)
        ~~~~~~~~~~~~~~~~~~
        
        * Start to use git-flow.
        
        * Added support for PyPy 1.5
        
        * Fixed #121 -- added sanity-checking of the -p argument. Thanks Paul Nasrat.
        
        * Added progress meter for pip installation as well as setuptools. Thanks Ethan
          Jucovy.
        
        * Added --never-download and --search-dir options. Thanks Ethan Jucovy.
        
        
        1.6
        ~~~
        
        * Added Python 3 support! Huge thanks to Vinay Sajip and Vitaly Babiy.
        
        * Fixed creation of virtualenvs on Mac OS X when standard library modules
          (readline) are installed outside the standard library.
        
        * Updated bundled pip to 1.0.
        
        
        1.5.2
        ~~~~~
        
        * Moved main repository to Github: https://github.com/pypa/virtualenv
        
        * Transferred primary maintenance from Ian to Jannis Leidel, Carl Meyer and Brian Rosner
        
        * Fixed a few more pypy related bugs.
        
        * Updated bundled pip to 0.8.2.
        
        * Handed project over to new team of maintainers.
        
        * Moved virtualenv to Github at https://github.com/pypa/virtualenv
        
        
        1.5.1
        ~~~~~
        
        * Added ``_weakrefset`` requirement for Python 2.7.1.
        
        * Fixed Windows regression in 1.5
        
        
        1.5
        ~~~
        
        * Include pip 0.8.1.
        
        * Add support for PyPy.
        
        * Uses a proper temporary dir when installing environment requirements.
        
        * Add ``--prompt`` option to be able to override the default prompt prefix.
        
        * Fix an issue with ``--relocatable`` on Windows.
        
        * Fix issue with installing the wrong version of distribute.
        
        * Add fish and csh activate scripts.
        
        
        1.4.9
        ~~~~~
        
        * Include pip 0.7.2
        
        
        1.4.8
        ~~~~~
        
        * Fix for Mac OS X Framework builds that use
          ``--universal-archs=intel``
        
        * Fix ``activate_this.py`` on Windows.
        
        * Allow ``$PYTHONHOME`` to be set, so long as you use ``source
          bin/activate`` it will get unset; if you leave it set and do not
          activate the environment it will still break the environment.
        
        * Include pip 0.7.1
        
        
        1.4.7
        ~~~~~
        
        * Include pip 0.7
        
        
        1.4.6
        ~~~~~
        
        * Allow ``activate.sh`` to skip updating the prompt (by setting
          ``$VIRTUAL_ENV_DISABLE_PROMPT``).
        
        
        1.4.5
        ~~~~~
        
        * Include pip 0.6.3
        
        * Fix ``activate.bat`` and ``deactivate.bat`` under Windows when
          ``PATH`` contained a parenthesis
        
        
        1.4.4
        ~~~~~
        
        * Include pip 0.6.2 and Distribute 0.6.10
        
        * Create the ``virtualenv`` script even when Setuptools isn't
          installed
        
        * Fix problem with ``virtualenv --relocate`` when ``bin/`` has
          subdirectories (e.g., ``bin/.svn/``); from Alan Franzoni.
        
        * If you set ``$VIRTUALENV_DISTRIBUTE`` then virtualenv will use
          Distribute by default (so you don't have to remember to use
          ``--distribute``).
        
        
        1.4.3
        ~~~~~
        
        * Include pip 0.6.1
        
        
        1.4.2
        ~~~~~
        
        * Fix pip installation on Windows
        
        * Fix use of stand-alone ``virtualenv.py`` (and boot scripts)
        
        * Exclude ~/.local (user site-packages) from environments when using
          ``--no-site-packages``
        
        
        1.4.1
        ~~~~~
        
        * Include pip 0.6
        
        
        1.4
        ~~~
        
        * Updated setuptools to 0.6c11
        
        * Added the --distribute option
        
        * Fixed packaging problem of support-files
        
        
        1.3.4
        ~~~~~
        
        * Virtualenv now copies the actual embedded Python binary on
          Mac OS X to fix a hang on Snow Leopard (10.6).
        
        * Fail more gracefully on Windows when ``win32api`` is not installed.
        
        * Fix site-packages taking precedent over Jython's ``__classpath__``
          and also specially handle the new ``__pyclasspath__`` entry in
          ``sys.path``.
        
        * Now copies Jython's ``registry`` file to the virtualenv if it exists.
        
        * Better find libraries when compiling extensions on Windows.
        
        * Create ``Scripts\pythonw.exe`` on Windows.
        
        * Added support for the Debian/Ubuntu
          ``/usr/lib/pythonX.Y/dist-packages`` directory.
        
        * Set ``distutils.sysconfig.get_config_vars()['LIBDIR']`` (based on
          ``sys.real_prefix``) which is reported to help building on Windows.
        
        * Make ``deactivate`` work on ksh
        
        * Fixes for ``--python``: make it work with ``--relocatable`` and the
          symlink created to the exact Python version.
        
        
        1.3.3
        ~~~~~
        
        * Use Windows newlines in ``activate.bat``, which has been reported to help
          when using non-ASCII directory names.
        
        * Fixed compatibility with Jython 2.5b1.
        
        * Added a function ``virtualenv.install_python`` for more fine-grained
          access to what ``virtualenv.create_environment`` does.
        
        * Fix `a problem <https://bugs.launchpad.net/virtualenv/+bug/241581>`_
          with Windows and paths that contain spaces.
        
        * If ``/path/to/env/.pydistutils.cfg`` exists (or
          ``/path/to/env/pydistutils.cfg`` on Windows systems) then ignore
          ``~/.pydistutils.cfg`` and use that other file instead.
        
        * Fix ` a problem
          <https://bugs.launchpad.net/virtualenv/+bug/340050>`_ picking up
          some ``.so`` libraries in ``/usr/local``.
        
        
        1.3.2
        ~~~~~
        
        * Remove the ``[install] prefix = ...`` setting from the virtualenv
          ``distutils.cfg`` -- this has been causing problems for a lot of
          people, in rather obscure ways.
        
        * If you use a boot script it will attempt to import ``virtualenv``
          and find a pre-downloaded Setuptools egg using that.
        
        * Added platform-specific paths, like ``/usr/lib/pythonX.Y/plat-linux2``
        
        
        1.3.1
        ~~~~~
        
        * Real Python 2.6 compatibility.  Backported the Python 2.6 updates to
          ``site.py``, including `user directories
          <http://docs.python.org/dev/whatsnew/2.6.html#pep-370-per-user-site-packages-directory>`_
          (this means older versions of Python will support user directories,
          whether intended or not).
        
        * Always set ``[install] prefix`` in ``distutils.cfg`` -- previously
          on some platforms where a system-wide ``distutils.cfg`` was present
          with a ``prefix`` setting, packages would be installed globally
          (usually in ``/usr/local/lib/pythonX.Y/site-packages``).
        
        * Sometimes Cygwin seems to leave ``.exe`` off ``sys.executable``; a
          workaround is added.
        
        * Fix ``--python`` option.
        
        * Fixed handling of Jython environments that use a
          jython-complete.jar.
        
        
        1.3
        ~~~
        
        * Update to Setuptools 0.6c9
        * Added an option ``virtualenv --relocatable EXISTING_ENV``, which
          will make an existing environment "relocatable" -- the paths will
          not be absolute in scripts, ``.egg-info`` and ``.pth`` files.  This
          may assist in building environments that can be moved and copied.
          You have to run this *after* any new packages installed.
        * Added ``bin/activate_this.py``, a file you can use like
          ``execfile("path_to/activate_this.py",
          dict(__file__="path_to/activate_this.py"))`` -- this will activate
          the environment in place, similar to what `the mod_wsgi example
          does <http://code.google.com/p/modwsgi/wiki/VirtualEnvironments>`_.
        * For Mac framework builds of Python, the site-packages directory
          ``/Library/Python/X.Y/site-packages`` is added to ``sys.path``, from
          Andrea Rech.
        * Some platform-specific modules in Macs are added to the path now
          (``plat-darwin/``, ``plat-mac/``, ``plat-mac/lib-scriptpackages``),
          from Andrea Rech.
        * Fixed a small Bashism in the ``bin/activate`` shell script.
        * Added ``__future__`` to the list of required modules, for Python
          2.3.  You'll still need to backport your own ``subprocess`` module.
        * Fixed the ``__classpath__`` entry in Jython's ``sys.path`` taking
          precedent over virtualenv's libs.
        
        
        1.2
        ~~~
        
        * Added a ``--python`` option to select the Python interpreter.
        * Add ``warnings`` to the modules copied over, for Python 2.6 support.
        * Add ``sets`` to the module copied over for Python 2.3 (though Python
          2.3 still probably doesn't work).
        
        
        1.1.1
        ~~~~~
        
        * Added support for Jython 2.5.
        
        
        1.1
        ~~~
        
        * Added support for Python 2.6.
        * Fix a problem with missing ``DLLs/zlib.pyd`` on Windows.  Create
        * ``bin/python`` (or ``bin/python.exe``) even when you run virtualenv
          with an interpreter named, e.g., ``python2.4``
        * Fix MacPorts Python
        * Added --unzip-setuptools option
        * Update to Setuptools 0.6c8
        * If the current directory is not writable, run ez_setup.py in ``/tmp``
        * Copy or symlink over the ``include`` directory so that packages will
          more consistently compile.
        
        
        1.0
        ~~~
        
        * Fix build on systems that use ``/usr/lib64``, distinct from
          ``/usr/lib`` (specifically CentOS x64).
        * Fixed bug in ``--clear``.
        * Fixed typos in ``deactivate.bat``.
        * Preserve ``$PYTHONPATH`` when calling subprocesses.
        
        
        0.9.2
        ~~~~~
        
        * Fix include dir copying on Windows (makes compiling possible).
        * Include the main ``lib-tk`` in the path.
        * Patch ``distutils.sysconfig``: ``get_python_inc`` and
          ``get_python_lib`` to point to the global locations.
        * Install ``distutils.cfg`` before Setuptools, so that system
          customizations of ``distutils.cfg`` won't effect the installation.
        * Add ``bin/pythonX.Y`` to the virtualenv (in addition to
          ``bin/python``).
        * Fixed an issue with Mac Framework Python builds, and absolute paths
          (from Ronald Oussoren).
        
        
        0.9.1
        ~~~~~
        
        * Improve ability to create a virtualenv from inside a virtualenv.
        * Fix a little bug in ``bin/activate``.
        * Actually get ``distutils.cfg`` to work reliably.
        
        
        0.9
        ~~~
        
        * Added ``lib-dynload`` and ``config`` to things that need to be
          copied over in an environment.
        * Copy over or symlink the ``include`` directory, so that you can
          build packages that need the C headers.
        * Include a ``distutils`` package, so you can locally update
          ``distutils.cfg`` (in ``lib/pythonX.Y/distutils/distutils.cfg``).
        * Better avoid downloading Setuptools, and hitting PyPI on environment
          creation.
        * Fix a problem creating a ``lib64/`` directory.
        * Should work on MacOSX Framework builds (the default Python
          installations on Mac).  Thanks to Ronald Oussoren.
        
        
        0.8.4
        ~~~~~
        
        * Windows installs would sometimes give errors about ``sys.prefix`` that
          were inaccurate.
        * Slightly prettier output.
        
        
        0.8.3
        ~~~~~
        
        * Added support for Windows.
        
        
        0.8.2
        ~~~~~
        
        * Give a better warning if you are on an unsupported platform (Mac
          Framework Pythons, and Windows).
        * Give error about running while inside a workingenv.
        * Give better error message about Python 2.3.
        
        
        0.8.1
        ~~~~~
        
        Fixed packaging of the library.
        
        
        0.8
        ~~~
        
        Initial release.  Everything is changed and new!
        
Keywords: setuptools deployment installation distutils
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.6
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.1
Classifier: Programming Language :: Python :: 3.2
