diff options
author | Bernát Gábor <gaborjbernat@gmail.com> | 2018-12-23 16:55:13 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-12-23 16:55:13 +0000 |
commit | 34fdfb5be3d13a4f874a7529cb6178cbacddf29c (patch) | |
tree | 85793f05f62459d229fd80ff7055d1d444b56533 | |
parent | 89c734bac9b4d5621fa665e86de2c79549bb50e5 (diff) | |
download | virtualenv-34fdfb5be3d13a4f874a7529cb6178cbacddf29c.tar.gz |
Shell fixes (#1258)
* Always store _OLD_VIRTUAL_PATH in a sh compat format
When using a subshell from fish while within a virtualenv the
_OLD_VIRTUAL_PATH variable ends up in fish format and not the format of
the subshell. This breaks the first step of the activate script where it
attepts to deactivate the previous environment.
This patch will handle conversion to and from sh and fish formats within
the activate.fish script
* Add test and update to new delimiter
* Fix lint
Remove line that didn't lint as we don't need it.
* Rebuild virtualenv.py
* Add changelog
* fix_lint
* Try to add fish to build env
* Use less fish (only when running py tests)
* remove code duplication for activation testers
* Consolidate activation testing
- add tests for csh, bash
- rework bash, csh tests
- remove powershell singing
- powershell pydoc support
* file and with extension
* universal newline
* Add debug env var, and normalize on Linux to via realpath (Jython failure)
* switch to bat
* fix xonosh
* fix xonsh further
* fix jython
* fix lint
* enable pytest debug
-rw-r--r-- | azure-pipelines.yml | 2 | ||||
-rw-r--r-- | azure-run-tox-env.yml | 10 | ||||
-rw-r--r-- | docs/changes.rst | 3 | ||||
-rw-r--r-- | setup.py | 5 | ||||
-rwxr-xr-x | src/virtualenv.py | 147 | ||||
-rw-r--r-- | tests/__init__.py | 0 | ||||
-rw-r--r-- | tests/activation/test_powershell_activation.py | 49 | ||||
-rw-r--r-- | tests/activation/test_xonsh_activation.py | 60 | ||||
-rw-r--r-- | tests/lib/__init__.py | 21 | ||||
-rwxr-xr-x | tests/test_activate.sh | 111 | ||||
-rw-r--r-- | tests/test_activation.py | 249 | ||||
-rw-r--r-- | tests/test_virtualenv.py | 2 | ||||
-rw-r--r-- | tox.ini | 4 | ||||
-rw-r--r-- | virtualenv_embedded/activate.fish | 19 | ||||
-rw-r--r-- | virtualenv_embedded/activate.ps1 | 142 |
15 files changed, 352 insertions, 472 deletions
diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 62ce469..f610729 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -3,7 +3,7 @@ name: $(BuildDefinitionName)_$(Date:yyyyMMdd)$(Rev:.rr) variables: "System.PreferGit": true PYTEST_ADDOPTS: "-vv -ra --showlocals" - CI_RUN: "true" + CI_RUN: "yes" trigger: batch: true diff --git a/azure-run-tox-env.yml b/azure-run-tox-env.yml index 88b26ad..7ac0a1b 100644 --- a/azure-run-tox-env.yml +++ b/azure-run-tox-env.yml @@ -27,6 +27,7 @@ jobs: inputs: versionSpec: ${{ parameters.python }} + # provision jython - ${{ if eq(parameters.tox, 'jython') }}: - script: "wget http://search.maven.org/remotecontent?filepath=org/python/jython-installer/2.7.1/jython-installer-2.7.1.jar -O $(Agent.ToolsDirectory)/jython.jar" displayName: download jython @@ -49,6 +50,15 @@ jobs: - script: "python -m pip install -U tox --user -v" displayName: install tox + # provision additional shells + - ${{ if or( startsWith(parameters.tox, 'py'), eq(parameters.tox, 'jython')) }}: + - ${{if eq(parameters.os, 'linux') }}: + - script: "sudo apt-get update && sudo apt-get install fish csh" + displayName: install fish and csh + - ${{ if eq(parameters.os, 'macOs') }}: + - script: "brew install fish tcsh" + displayName: install fish and csh + - ${{ if eq(parameters.tox, 'jython') }}: - script: "python -m pip install --user $(System.DefaultWorkingDirectory)" displayName: install dev venv for tox diff --git a/docs/changes.rst b/docs/changes.rst index 4bedcd6..3fd1e6a 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -9,6 +9,9 @@ Release History * upgrade setuptools from ``40.5.0`` to ``40.6.3`` * upgrade wheel from ``0.32.2`` to ``0.32.3`` * bug fix: ``copyfile`` now handles relative symlinks and symlinks to symlinks, avoiding problems when Python was installed using stow or homebrew :issue:`268` +* Fix preserving of original path when using fish and a subshell :issue:`904` +* ``powershell`` now also provides the ``pydoc`` function that uses the virtual environments ``pydoc`` +* ``powershell`` activator is no longer signed :issue:`816` 16.1.0 (2018-10-31) ------------------- @@ -122,10 +122,11 @@ setup( extras_require={ "testing": [ 'mock;python_version<"3.3"', - "pytest >= 3.0.0, <4", + "pytest >= 4.0.0, <5", "coverage >= 4.5.0, <5", 'pytest-timeout >= 1.3.0, <2; platform_python_implementation!="Jython"', - 'xonsh;python_version>="3.4"', + 'xonsh; python_version>="3.4"', + "six >= 1.10.0, < 2", ], "docs": ["sphinx >= 1.8.0, < 2"], }, diff --git a/src/virtualenv.py b/src/virtualenv.py index 87822dd..1a65603 100755 --- a/src/virtualenv.py +++ b/src/virtualenv.py @@ -39,9 +39,9 @@ try: except ImportError: import configparser as ConfigParser -__version__ = "16.1.0" +__version__ = "16.2.0.dev0" virtualenv_version = __version__ # legacy - +DEBUG = os.environ.get("_VIRTUALENV_DEBUG", None) == "1" if sys.version_info < (2, 7): print("ERROR: %s" % sys.exc_info()[1]) print("ERROR: this script requires Python 2.7 or greater.") @@ -907,6 +907,12 @@ def install_wheel(project_names, py_executable, search_dirs=None, download=False return urljoin("file:", pathname2url(os.path.abspath(p))) findlinks = " ".join(space_path2url(d) for d in search_dirs) + + extra_args = ["--ignore-installed"] + if DEBUG: + extra_args.append("-v") + if is_jython: + extra_args.append("--no-cache") SCRIPT = textwrap.dedent( """ import sys @@ -931,9 +937,9 @@ def install_wheel(project_names, py_executable, search_dirs=None, download=False cert_file = None try: - args = ["install", "--ignore-installed"] + args = ["install"] + [{}] if cert_file is not None: - args += ["--cert", cert_file.name{}] + args += ["--cert", cert_file.name] args += sys.argv[1:] sys.exit(_main(args)) @@ -941,7 +947,7 @@ def install_wheel(project_names, py_executable, search_dirs=None, download=False if cert_file is not None: os.remove(cert_file.name) """.format( - ", '--no-cache'" if is_jython else "" + ", ".join(repr(i) for i in extra_args) ) ).encode("utf8") @@ -2101,21 +2107,23 @@ Ac1FhrMbX+3UzW8yB99gBv7n/Puf2ffa3CPN/gKu/HeT # file activate.fish ACTIVATE_FISH = convert( """ -eJyFVlFv2zYQftevuMoOnBS1g70WGIZ08RADSRw4boBhGGhGOsUcKFIjKbUu9uN7lCyJsrVWDxZE -fnf38e6+oyew3QsLmZAIeWkdvCKUFlP6EeoNdlaXJkF4FeqaJ05U3OEiE3a/g/dfhNsLBRxMqZQH -+3W4hL1zxcfra/9l9yjlItE5XIFFa4VW7xfRBG41KO28IQgHqTCYOHlYRFFWKoqiFaTYhoN5CrPl -V8JVwriSS1QV5DpF4CoFg640CpwGt0dyanIugRDCaJWjcotZBPRMCGjRgZZpuAsVN4K/SrQ1SmTg -kHIwVxBP2fr+lr2sNtvPN/fs6WZ7F9cY/3hP87ev4FfhHDjEIYwDUKXRz6L+ub1bP96tH5Yjsbu9 -Uwbdxo95DGE/YPPH6vmOPW3WD09btn5Zbjar24DPBJ7JO1eAeeEOIHVCBdhNffVZW01WcEcdQ0Xi -UuovdakM5roiqM5gV4MLo8nDrm281tYS891ieBQJ5+6jgNHScItBu8zsSYymc6zTBmsy2og3objs -44ThIbAdAyTAqK9YgPqZBZ5ZjNZqLPPDah3RbVGXjy/DKsZTbt6qv375O4Z3v8JMaZXSsim9tnA2 -KKLM5u3eu3HOxSHVyfhWL9eOX81xAp+V5yiMQYkVDyW3iAKRD5lFUdvmwckgZiz4ZCzuYWcSg2kt -tIFS42lgfs3Yp9Uje7x5WJKnI7zju5v2+tj5bNLiImreMP8XTtQzTiNQ6BgeQy91trrp12e6OLg9 -LczzZg3qejboTqnfhidjt6vnm0/3y2PnxMcB+LsuDnWzJyUVgwoxlEQXm5NYTrvzKMBBz4ftftbN -A/ioGqjleIUDQlPruCvtB8i0CW0sobi/Jmwh+YFujLNx4MM3xq2TcBw8NSR1hcYIujfIa0Xv9LcA -s8r8jfQB/vF3YGGwoBTX5MLbQvEc+9jhpOw78yhX1k/IuoxGKJfB7MJe2NkoHC7pLCzRks7eXGNX -nQeUFv/H3eWFvYLZiDFcvtIQ9IyH3REHbtsp0qRgMzIQu3R2NsleQ4z+Op72WY/hP2j+KXTA0QE3 -nFutYMbG3AnpuuO/AygvqEs= +eJyFVm1v2zYQ/q5fcZUdyClqB93HAMOQNh5iIIkDxw0wbAPNSJTFQSI1klLrYj9+R8qSKFtp8yGG +yOfe77njBLYZ15DynEFRaQOvDCrNEvzHxR52WlYqZvDKxRWNDa+pYYuU62wH779yk3EBFFQlhAXb +c5hBZkx5fXVlv3TG8nwRywIuQTOtuRTvF8EEbiUIaawgcAMJVyw2+WERBGkl0IoUQF6pznh6ICU1 +GcwTCD9LUTNlNBp0htyFkaBlwawje7AiEFMBqE7uBf/OwgDwTzPjRI7KplTt6+7CCrUXPejPj387 +RCqVM4SHygBG62N+WSzmR9yItnDaf1xPOyWNS0wkzW+cSfCAgb3wsmCtvZUFF+55FlxyRrLQmLKx +w39gFETXEUR/iejEZMLaOlt70fIbFqjmylQ0Z6KGQiYMqEhQu6mUsKZNxrCaqqA5hoVQKQomzCJy +VicItImReeLfQk0Vp6850w7FUzAMm28uMG1kfX9LXlab7Zebe/J0s70LByme77+BPYXZMDvncpdD +OQZniK4WP/Pij+3d+vFu/bAc8aW7O3Whu/ixH0PYD7z5ffV8R54264enLVm/LDeb1a3nzwSeUTvW +nRWlOUAuYyzIzvUraavrMrWzRaN5Lr+60ilWyBqhMoWdA5dKooZdOwFaWY2e7xbDUHI4Vx94Hi0V +1cxrn0if2Gg6SRupmHNGKr7ngua9Hd88eLJjgBgI9hnxUD+TYGcSo7Uay/ywWkd0W9Tl48uwiqFj +Ho6VEN79CpGQIsFjVVmusWhQxDydt3fvxn0uD4mMx696+r4Rrj9X34D4tOqidJFO4IuwkXKlWM5q +6hN5EXijYxhfELRk8fIDISHeJyFhDzsjKpJ9sBCmDb8H8yCceuquCPm0eiSPNw9L1Nzge/930551 +O1sjPFwEzS/M/4UTTo675fF+DM98LcMZ29evPJgMD+ZFc3bcTQ7d8f/7MDJyu3q++XS/PPZjeByz +n2V5cBSKKywOFmZItM42RQqe9vyR1gMm+SQ648gAPsoxbGRas4FDU22oqfQHt1Q9GY0oal8Buszp +AR8EZ0PGmm+EWyX+kHlqnJS4FxXH7YRaa/xNfvMwq9Q+OD7AP/aJUypWYoqdc/5OErRgvW1//vad +ehwCpJ+7royKC5NCdKEvdDQKhxnGQmKZY+zNsuy3E8s1e0Pd7EJfQjQiDDPkA7MeD7sj9NS2s6lJ +wWZkzHbp7GTsIyFkdulP+6yH+GJoHoIdcHRsDqdhS5ix4XnitOv4/wFb3Ubb """ ) @@ -2174,93 +2182,18 @@ pk+k4fAba/wd0Pr4P2CqyLeOlJ4iKfkJo6v/iaH9YzfPMEoeMG2RUA== # file activate.ps1 ACTIVATE_PS = convert( """ -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 +UDr1L6/k7hc= """ ) diff --git a/tests/__init__.py b/tests/__init__.py deleted file mode 100644 index e69de29..0000000 --- a/tests/__init__.py +++ /dev/null diff --git a/tests/activation/test_powershell_activation.py b/tests/activation/test_powershell_activation.py deleted file mode 100644 index fff8b8e..0000000 --- a/tests/activation/test_powershell_activation.py +++ /dev/null @@ -1,49 +0,0 @@ -import subprocess -import sys -from os.path import join, normcase - -import pytest - -import virtualenv -from tests.lib import need_executable - -POWER_SHELL = "powershell.exe" if virtualenv.is_win else "pwsh" - - -def need_powershell(fn): - return pytest.mark.powershell( - need_executable("powershell", (POWER_SHELL, "-Command", "$PSVersionTable.PsVersion"))(fn) - ) - - -def print_python_exe_path(): - return "{} -c 'import sys; print(sys.executable)'".format(virtualenv.expected_exe) - - -@need_powershell -def test_activate_with_powershell(tmpdir, monkeypatch): - monkeypatch.chdir(tmpdir) - home_dir, _, __, bin_dir = virtualenv.path_locations(str(tmpdir.join("env"))) - virtualenv.create_environment(home_dir, no_pip=True, no_setuptools=True, no_wheel=True) - monkeypatch.chdir(home_dir) - activate_script = join(bin_dir, "activate.ps1") - cmd = [POWER_SHELL, "-Command", "{0}; {1}; {0}; deactivate; {0}".format(print_python_exe_path(), activate_script)] - output = subprocess.check_output(cmd, universal_newlines=True, stderr=subprocess.STDOUT) - content = output.split() - assert len(content) == 3, output - before_activate, after_activate, after_deactivate = content - exe = "{}.exe".format(virtualenv.expected_exe) if virtualenv.is_win else virtualenv.expected_exe - assert normcase(long_path(after_activate)) == normcase(long_path(join(bin_dir, exe))) - assert before_activate == after_deactivate - - -def long_path(short_path_name): - # python 2 may return Windows short paths, normalize - if virtualenv.is_win and sys.version_info < (3,): - from ctypes import create_unicode_buffer, windll - - buffer_cont = create_unicode_buffer(256) - get_long_path_name = windll.kernel32.GetLongPathNameW - get_long_path_name(unicode(short_path_name), buffer_cont, 256) # noqa: F821 - return buffer_cont.value - return short_path_name diff --git a/tests/activation/test_xonsh_activation.py b/tests/activation/test_xonsh_activation.py deleted file mode 100644 index 81d9d22..0000000 --- a/tests/activation/test_xonsh_activation.py +++ /dev/null @@ -1,60 +0,0 @@ -import os -import subprocess -import sys -from os.path import join, normcase - -import pytest - -import virtualenv - -XONSH_COMMAND = "xonsh.exe" if virtualenv.is_win else "xonsh" - - -def need_xonsh(fn): - try: - subprocess.check_output([XONSH_COMMAND, "--version"]) - except OSError: - return pytest.mark.skip(reason="xonsh is not available")(fn) - return fn - - -def print_python_exe_path(): - return "{} -c 'import sys; print(sys.executable)'".format(virtualenv.expected_exe) - - -@need_xonsh -def test_activate_with_xonsh(tmpdir, monkeypatch): - monkeypatch.chdir(tmpdir) - home_dir, _, __, bin_dir = virtualenv.path_locations(str(tmpdir.join("env"))) - virtualenv.create_environment(home_dir, no_pip=True, no_setuptools=True, no_wheel=True) - monkeypatch.chdir(home_dir) - activate_script = join(bin_dir, "activate.xsh") - cmd = [ - XONSH_COMMAND, - "-c", - "{0}; source r'{1}'; {0}; deactivate; {0}".format(print_python_exe_path(), activate_script), - ] - print("COMMAND", cmd) - print("Executable", sys.executable) - env = dict(os.environ) - env["XONSH_DEBUG"] = "1" - env["XONSH_SHOW_TRACEBACK"] = "True" - output = subprocess.check_output(cmd, universal_newlines=True, stderr=subprocess.STDOUT, env=env) - content = output.split() - assert len(content) == 3, output - before_activate, after_activate, after_deactivate = content - exe = "{}.exe".format(virtualenv.expected_exe) if virtualenv.is_win else virtualenv.expected_exe - assert normcase(long_path(after_activate)) == normcase(long_path(join(bin_dir, exe))) - assert before_activate == after_deactivate - - -def long_path(short_path_name): - # python 2 may return Windows short paths, normalize - if virtualenv.is_win and sys.version_info < (3,): - from ctypes import create_unicode_buffer, windll - - buffer_cont = create_unicode_buffer(256) - get_long_path_name = windll.kernel32.GetLongPathNameW - get_long_path_name(unicode(short_path_name), buffer_cont, 256) # noqa: F821 - return buffer_cont.value - return short_path_name diff --git a/tests/lib/__init__.py b/tests/lib/__init__.py deleted file mode 100644 index 2c2c1e4..0000000 --- a/tests/lib/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -import os -import subprocess - -import pytest - -IS_INSIDE_CI = "CI_RUN" in os.environ - - -def need_executable(name, check_cmd): - """skip running this locally if executable not found, unless we're inside the CI""" - - def wrapper(fn): - if IS_INSIDE_CI: - return fn - try: - subprocess.check_output(check_cmd) - except OSError: - return pytest.mark.skip(reason="%s is not available" % name)(fn) - return fn - - return wrapper diff --git a/tests/test_activate.sh b/tests/test_activate.sh deleted file mode 100755 index b6ef5f5..0000000 --- a/tests/test_activate.sh +++ /dev/null @@ -1,111 +0,0 @@ -#!/bin/sh - -set -u - -ROOT="$(dirname $0)/.." -VIRTUALENV="${ROOT}/virtualenv.py" -TESTENV="/tmp/test_virtualenv_activate.venv" - -rm -rf ${TESTENV} - -echo "$0: Creating virtualenv ${TESTENV}..." 1>&2 - -PY_BLEND=$(python -c "import sys; print('pypy' if '__pypy__' in sys.builtin_module_names else 'python');") -cat >${ROOT}/tests/test_activate_output.expected <<EOL -New ${PY_BLEND} executable in /tmp/test_virtualenv_activate.venv/bin/python -Installing setuptools, pip, wheel...done. -EOL - -# "Path not in prefix" warning is not really an error, being expected under pypy -# > Path not in prefix '/home/travis/virtualenv/pypy2.7-5.8.0/include' '/opt/python/pypy2.7-5.8.0' - -${VIRTUALENV} ${TESTENV} 2>&1 | sed '/^++\|^Also creating executable in\|^Using real prefix\|^Path not in prefix/d' | tee ${ROOT}/tests/test_activate_output.actual -if ! diff ${ROOT}/tests/test_activate_output.expected ${ROOT}/tests/test_activate_output.actual; then - echo "$0: Failed to get expected output from ${VIRTUALENV}!" 1>&2 - exit 1 -fi - -echo "$0: Created virtualenv ${TESTENV}." 1>&2 - -echo "$0: Activating ${TESTENV}..." 1>&2 -. ${TESTENV}/bin/activate -echo "$0: Activated ${TESTENV}." 1>&2 - -echo "$0: Checking value of \$VIRTUAL_ENV..." 1>&2 - -if [ "$VIRTUAL_ENV" != "${TESTENV}" ]; then - echo "$0: Expected \$VIRTUAL_ENV to be set to \"${TESTENV}\"; actual value: \"${VIRTUAL_ENV}\"!" 1>&2 - exit 2 -fi - -echo "$0: \$VIRTUAL_ENV = \"${VIRTUAL_ENV}\" -- OK." 1>&2 - -echo "$0: Checking output of \$(which python)..." 1>&2 - -if [ "$(which python)" != "${TESTENV}/bin/python" ]; then - echo "$0: Expected \$(which python) to return \"${TESTENV}/bin/python\"; actual value: \"$(which python)\"!" 1>&2 - exit 3 -fi - -echo "$0: Output of \$(which python) is OK." 1>&2 - -echo "$0: Checking output of \$(which pip)..." 1>&2 - -if [ "$(which pip)" != "${TESTENV}/bin/pip" ]; then - echo "$0: Expected \$(which pip) to return \"${TESTENV}/bin/pip\"; actual value: \"$(which pip)\"!" 1>&2 - exit 4 -fi - -echo "$0: Output of \$(which pip) is OK." 1>&2 - -echo "$0: Checking output of \$(which easy_install)..." 1>&2 - -if [ "$(which easy_install)" != "${TESTENV}/bin/easy_install" ]; then - echo "$0: Expected \$(which easy_install) to return \"${TESTENV}/bin/easy_install\"; actual value: \"$(which easy_install)\"!" 1>&2 - exit 5 -fi - -echo "$0: Output of \$(which easy_install) is OK." 1>&2 - -echo "$0: Executing a simple Python program..." 1>&2 - -TESTENV=${TESTENV} python <<__END__ -import os -import platform -import sys - -if 'PyPy' == platform.python_implementation(): - expected_site_packages = os.path.join(os.environ['TESTENV'], 'site-packages') - site_packages = os.path.join(os.environ['VIRTUAL_ENV'], 'site-packages') - -else: - expected_site_packages = os.path.join(os.environ['TESTENV'], 'lib','python%s' % sys.version[:3], 'site-packages') - site_packages = os.path.join(os.environ['VIRTUAL_ENV'], 'lib', 'python%s' % sys.version[:3], 'site-packages') - -assert site_packages == expected_site_packages, 'site_packages did not have expected value; actual value: %r' % site_packages - -open(os.path.join(site_packages, 'pydoc_test.py'), 'w').write('"""This is pydoc_test.py"""\n') -__END__ - -if [ $? -ne 0 ]; then - echo "$0: Python script failed!" 1>&2 - exit 6 -fi - -echo "$0: Execution of a simple Python program -- OK." 1>&2 - -echo "$0: Testing pydoc..." 1>&2 - -if ! PAGER=cat pydoc pydoc_test | grep 'This is pydoc_test.py' > /dev/null; then - echo "$0: pydoc test failed!" 1>&2 - exit 7 -fi - -echo "$0: pydoc is OK." 1>&2 - -echo "$0: Deactivating ${TESTENV}..." 1>&2 -deactivate -echo "$0: Deactivated ${TESTENV}." 1>&2 -echo "$0: OK!" 1>&2 - -rm -rf ${TESTENV} diff --git a/tests/test_activation.py b/tests/test_activation.py new file mode 100644 index 0000000..7382cfc --- /dev/null +++ b/tests/test_activation.py @@ -0,0 +1,249 @@ +from __future__ import absolute_import, unicode_literals + +import os +import pipes +import re +import subprocess +import sys +from os.path import dirname, join, normcase, realpath + +import pytest +import six + +import virtualenv + +IS_INSIDE_CI = "CI_RUN" in os.environ + + +def need_executable(name, check_cmd): + """skip running this locally if executable not found, unless we're inside the CI""" + + def wrapper(fn): + fn = getattr(pytest.mark, name)(fn) + if not IS_INSIDE_CI: + # locally we disable, so that contributors don't need to have everything setup + # noinspection PyBroadException + try: + fn.version = subprocess.check_output(check_cmd, env=get_env()) + except Exception as exception: + return pytest.mark.skip(reason="{} is not available due {}".format(name, exception))(fn) + return fn + + return wrapper + + +def requires(on): + def wrapper(fn): + return need_executable(on.cmd.replace(".exe", ""), (on.check))(fn) + + return wrapper + + +def norm_path(path): + # python may return Windows short paths, normalize + path = realpath(path) + if virtualenv.is_win: + from ctypes import create_unicode_buffer, windll + + buffer_cont = create_unicode_buffer(256) + get_long_path_name = windll.kernel32.GetLongPathNameW + get_long_path_name(six.text_type(path), buffer_cont, 256) # noqa: F821 + result = buffer_cont.value + else: + result = path + return normcase(result) + + +@pytest.fixture(scope="session") +def activation_env(tmp_path_factory): + path = tmp_path_factory.mktemp("activation-test-env") + prev_cwd = os.getcwd() + try: + os.chdir(str(path)) + home_dir, _, __, bin_dir = virtualenv.path_locations(str(path / "env")) + virtualenv.create_environment(home_dir, no_pip=True, no_setuptools=True, no_wheel=True) + yield home_dir, bin_dir + finally: + os.chdir(str(prev_cwd)) + + +class Activation(object): + cmd = "" + extension = "test" + invoke_script = [] + command_separator = os.linesep + activate_cmd = "source" + activate_script = "" + check_has_exe = [] + check = [] + env = {} + + def __init__(self, activation_env, tmp_path): + self.home_dir = activation_env[0] + self.bin_dir = activation_env[1] + self.path = tmp_path + + def quote(self, s): + return pipes.quote(s) + + def python_cmd(self, cmd): + return "{} -c {}".format(self.quote(virtualenv.expected_exe), self.quote(cmd)) + + def python_script(self, script): + return "{} {}".format(self.quote(virtualenv.expected_exe), self.quote(script)) + + def print_python_exe(self): + return self.python_cmd("import sys; print(sys.executable)") + + def print_os_env_var(self, var): + val = '"{}"'.format(var) + return self.python_cmd("import os; print(os.environ.get({}, None))".format(val)) + + def __call__(self, monkeypatch): + absolute_activate_script = norm_path(join(self.bin_dir, self.activate_script)) + + site_packages = subprocess.check_output( + [ + os.path.join(self.bin_dir, virtualenv.expected_exe), + "-c", + "from distutils.sysconfig import get_python_lib; print(get_python_lib())", + ], + universal_newlines=True, + ).strip() + pydoc_test = self.path.__class__(site_packages) / "pydoc_test.py" + pydoc_test.write_text('"""This is pydoc_test.py"""') + + commands = [ + self.print_python_exe(), + self.print_os_env_var("VIRTUAL_ENV"), + self.activate_call(absolute_activate_script), + self.print_python_exe(), + self.print_os_env_var("VIRTUAL_ENV"), + # pydoc loads documentation from the virtualenv site packages + "pydoc -w pydoc_test", + "deactivate", + self.print_python_exe(), + self.print_os_env_var("VIRTUAL_ENV"), + "", # just finish with an empty new line + ] + script = self.command_separator.join(commands) + test_script = self.path / "script.{}".format(self.extension) + test_script.write_text(script) + assert test_script.exists() + + monkeypatch.chdir(str(self.path)) + invoke_shell = self.invoke_script + [str(test_script)] + + monkeypatch.delenv(str("VIRTUAL_ENV"), raising=False) + + # in case the tool is provided by the dev environment (e.g. xonosh) + env = get_env() + env.update(self.env) + + raw = subprocess.check_output(invoke_shell, universal_newlines=True, stderr=subprocess.STDOUT, env=env) + out = re.sub(r"pydev debugger: process \d+ is connecting\n\n", "", raw, re.M).strip().split("\n") + + # pre-activation + assert out[0], raw + assert out[1] == "None", raw + + # post-activation + exe = "{}.exe".format(virtualenv.expected_exe) if virtualenv.is_win else virtualenv.expected_exe + assert norm_path(out[2]) == norm_path(join(self.bin_dir, exe)), raw + assert norm_path(out[3]) == norm_path(str(self.home_dir)).replace("\\\\", "\\"), raw + + assert out[4] == "wrote pydoc_test.html" + content = self.path / "pydoc_test.html" + assert content.exists(), raw + + # post deactivation, same as before + assert out[-2] == out[0], raw + assert out[-1] == "None", raw + + def activate_call(self, script): + return "{} {}".format(pipes.quote(self.activate_cmd), pipes.quote(script)).strip() + + +def get_env(): + env = os.environ.copy() + env[str("PATH")] = os.pathsep.join([dirname(sys.executable)] + env.get(str("PATH"), str("")).split(os.pathsep)) + return env + + +class BashActivation(Activation): + cmd = "bash.exe" if virtualenv.is_win else "bash" + invoke_script = [cmd] + extension = "sh" + activate_script = "activate" + check = [cmd, "--version"] + + +@pytest.mark.skipif(sys.platform == "win32", reason="no sane way to provision bash on Windows yet") +@requires(BashActivation) +def test_bash(activation_env, monkeypatch, tmp_path): + BashActivation(activation_env, tmp_path)(monkeypatch) + + +class CshActivation(Activation): + cmd = "csh.exe" if virtualenv.is_win else "csh" + invoke_script = [cmd] + extension = "csh" + activate_script = "activate.csh" + check = [cmd, "--version"] + + +@pytest.mark.skipif(sys.platform == "win32", reason="no sane way to provision csh on Windows yet") +@requires(CshActivation) +def test_csh(activation_env, monkeypatch, tmp_path): + CshActivation(activation_env, tmp_path)(monkeypatch) + + +class FishActivation(Activation): + cmd = "fish.exe" if virtualenv.is_win else "fish" + invoke_script = [cmd] + extension = "fish" + activate_script = "activate.fish" + check = [cmd, "--version"] + + +@pytest.mark.skipif(sys.platform == "win32", reason="no sane way to provision fish on Windows yet") +@requires(FishActivation) +def test_fish(activation_env, monkeypatch, tmp_path): + FishActivation(activation_env, tmp_path)(monkeypatch) + + +class PowershellActivation(Activation): + cmd = "powershell.exe" if virtualenv.is_win else "pwsh" + extension = "ps1" + invoke_script = [cmd, "-File"] + activate_script = "activate.ps1" + activate_cmd = "." + check = [cmd, "-c", "$PSVersionTable"] + + @staticmethod + def quote(s): + """powershell double double quote needed for quotes within single quotes""" + return pipes.quote(s).replace('"', '""') + + +@requires(PowershellActivation) +def test_powershell(activation_env, monkeypatch, tmp_path): + PowershellActivation(activation_env, tmp_path)(monkeypatch) + + +class XonoshActivation(Activation): + cmd = "xonsh" + extension = "xsh" + invoke_script = [sys.executable, "-m", "xonsh"] + activate_script = "activate.xsh" + check = [sys.executable, "-m", "xonsh", "--version"] + env = {"XONSH_DEBUG": "1", "XONSH_SHOW_TRACEBACK": "True"} + + def activate_call(self, script): + return "{} {}".format(self.activate_cmd, repr(script)).strip() + + +@pytest.mark.skipif(sys.version_info < (3, 4), reason="xonosh requires Python 3.4 at least") +@requires(XonoshActivation) +def test_xonosh(activation_env, monkeypatch, tmp_path): + XonoshActivation(activation_env, tmp_path)(monkeypatch) diff --git a/tests/test_virtualenv.py b/tests/test_virtualenv.py index f9bb57f..a569ed0 100644 --- a/tests/test_virtualenv.py +++ b/tests/test_virtualenv.py @@ -61,7 +61,7 @@ class TestGetInstalledPythons: assert not hasattr(virtualenv, "winreg") assert virtualenv.get_installed_pythons() == {} - @pytest.mark.skipif(sys.platform != "win32", reason="non-windows specific test") + @pytest.mark.skipif(sys.platform != "win32", reason="windows specific test") def test_on_windows(self, monkeypatch): assert virtualenv.is_win mock_winreg = self.mock_virtualenv_winreg( @@ -8,7 +8,7 @@ skip_missing_interpreters = true description = run tests with {basepython} setenv = PIP_DISABLE_VERSION_CHECK = 1 COVERAGE_FILE = {env:COVERAGE_FILE:{toxworkdir}/.coverage.{envname}} -passenv = https_proxy http_proxy no_proxy HOME PYTEST_ADDOPTS +passenv = https_proxy http_proxy no_proxy HOME PYTEST_ADDOPTS PYTEST_DEBUG CI_RUN TERM extras = testing commands = coverage run --source=virtualenv \ --rcfile="{toxinidir}/tox.ini" \ @@ -117,7 +117,7 @@ force_grid_wrap = 0 line_length = 120 known_standard_library = ConfigParser known_first_party = virtualenv -known_third_party = pytest +known_third_party = pytest,six [flake8] max-complexity = 22 diff --git a/virtualenv_embedded/activate.fish b/virtualenv_embedded/activate.fish index e03ef36..028ca61 100644 --- a/virtualenv_embedded/activate.fish +++ b/virtualenv_embedded/activate.fish @@ -1,10 +1,23 @@ # This file must be used using `source bin/activate.fish` *within a running fish ( http://fishshell.com ) session*. # Do not run it directly. +function _bashify_path -d "Converts a fish path to something bash can recognize" + set fishy_path $argv + set bashy_path $fishy_path[1] + for path_part in $fishy_path[2..-1] + set bashy_path "$bashy_path:$path_part" + end + echo $bashy_path +end + +function _fishify_path -d "Converts a bash path to something fish can recognize" + echo $argv | tr ':' '\n' +end + function deactivate -d 'Exit virtualenv mode and return to the normal environment.' # reset old environment variables if test -n "$_OLD_VIRTUAL_PATH" - set -gx PATH $_OLD_VIRTUAL_PATH + set -gx PATH (_fishify_path $_OLD_VIRTUAL_PATH) set -e _OLD_VIRTUAL_PATH end @@ -30,6 +43,8 @@ function deactivate -d 'Exit virtualenv mode and return to the normal environmen # Self-destruct! functions -e pydoc functions -e deactivate + functions -e _bashify_path + functions -e _fishify_path end end @@ -38,7 +53,7 @@ deactivate nondestructive set -gx VIRTUAL_ENV "__VIRTUAL_ENV__" -set -gx _OLD_VIRTUAL_PATH $PATH +set -gx _OLD_VIRTUAL_PATH (_bashify_path $PATH) set -gx PATH "$VIRTUAL_ENV/__BIN_NAME__" $PATH # Unset `$PYTHONHOME` if set. diff --git a/virtualenv_embedded/activate.ps1 b/virtualenv_embedded/activate.ps1 index 26ea3d9..48b947d 100644 --- a/virtualenv_embedded/activate.ps1 +++ b/virtualenv_embedded/activate.ps1 @@ -1,34 +1,41 @@ -# This file must be dot sourced from PoSh; you cannot run it
-# directly. Do this: . ./activate.ps1
+# This file must be dot sourced from PoSh; you cannot run it directly. Do this: . ./activate.ps1
-# FIXME: clean up unused vars.
$script:THIS_PATH = $myinvocation.mycommand.path
$script:BASE_DIR = split-path (resolve-path "$THIS_PATH/..") -Parent
-$script:DIR_NAME = split-path $BASE_DIR -Leaf
-function global:deactivate ( [switch] $NonDestructive ){
-
- if ( test-path variable:_OLD_VIRTUAL_PATH ) {
+function global:deactivate([switch] $NonDestructive)
+{
+ if (test-path variable:_OLD_VIRTUAL_PATH)
+ {
$env:PATH = $variable:_OLD_VIRTUAL_PATH
remove-variable "_OLD_VIRTUAL_PATH" -scope global
}
- if ( test-path function:_old_virtual_prompt ) {
+ if (test-path function:_old_virtual_prompt)
+ {
$function:prompt = $function:_old_virtual_prompt
remove-item function:\_old_virtual_prompt
}
- if ($env:VIRTUAL_ENV) {
+ if ($env:VIRTUAL_ENV)
+ {
$old_env = split-path $env:VIRTUAL_ENV -leaf
remove-item env:VIRTUAL_ENV -erroraction silentlycontinue
}
- if ( !$NonDestructive ) {
+ if (!$NonDestructive)
+ {
# Self destruct!
remove-item function:deactivate
+ remove-item function:pydoc
}
}
+function global:pydoc
+{
+ python -m pydoc $args
+}
+
# unset irrelevant variables
deactivate -nondestructive
@@ -37,114 +44,17 @@ $env:VIRTUAL_ENV = $VIRTUAL_ENV $global:_OLD_VIRTUAL_PATH = $env:PATH
$env:PATH = "$env:VIRTUAL_ENV/__BIN_NAME____PATH_SEP__" + $env:PATH
-if (! $env:VIRTUAL_ENV_DISABLE_PROMPT) {
- function global:_old_virtual_prompt { "" }
+if (!$env:VIRTUAL_ENV_DISABLE_PROMPT)
+{
+ function global:_old_virtual_prompt
+ {
+ ""
+ }
$function:_old_virtual_prompt = $function:prompt
- function global:prompt {
+ function global:prompt
+ {
# Add a prefix to the current prompt, but don't discard it.
- write-host "($(split-path $env:VIRTUAL_ENV -leaf)) " -nonewline
+ write-host "($( split-path $env:VIRTUAL_ENV -leaf )) " -nonewline
& $function:_old_virtual_prompt
}
}
-
-# SIG # Begin signature block
-# MIISeAYJKoZIhvcNAQcCoIISaTCCEmUCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
-# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
-# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUS5reBwSg3zOUwhXf2jPChZzf
-# yPmggg6tMIIGcDCCBFigAwIBAgIBJDANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQG
-# EwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERp
-# Z2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2Vy
-# dGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDcxMDI0MjIwMTQ2WhcNMTcxMDI0MjIw
-# MTQ2WjCBjDELMAkGA1UEBhMCSUwxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4xKzAp
-# BgNVBAsTIlNlY3VyZSBEaWdpdGFsIENlcnRpZmljYXRlIFNpZ25pbmcxODA2BgNV
-# BAMTL1N0YXJ0Q29tIENsYXNzIDIgUHJpbWFyeSBJbnRlcm1lZGlhdGUgT2JqZWN0
-# IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyiOLIjUemqAbPJ1J
-# 0D8MlzgWKbr4fYlbRVjvhHDtfhFN6RQxq0PjTQxRgWzwFQNKJCdU5ftKoM5N4YSj
-# Id6ZNavcSa6/McVnhDAQm+8H3HWoD030NVOxbjgD/Ih3HaV3/z9159nnvyxQEckR
-# ZfpJB2Kfk6aHqW3JnSvRe+XVZSufDVCe/vtxGSEwKCaNrsLc9pboUoYIC3oyzWoU
-# TZ65+c0H4paR8c8eK/mC914mBo6N0dQ512/bkSdaeY9YaQpGtW/h/W/FkbQRT3sC
-# pttLVlIjnkuY4r9+zvqhToPjxcfDYEf+XD8VGkAqle8Aa8hQ+M1qGdQjAye8OzbV
-# uUOw7wIDAQABo4IB6TCCAeUwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-# AQYwHQYDVR0OBBYEFNBOD0CZbLhLGW87KLjg44gHNKq3MB8GA1UdIwQYMBaAFE4L
-# 7xqkQFulF2mHMMo0aEPQQa7yMD0GCCsGAQUFBwEBBDEwLzAtBggrBgEFBQcwAoYh
-# aHR0cDovL3d3dy5zdGFydHNzbC5jb20vc2ZzY2EuY3J0MFsGA1UdHwRUMFIwJ6Al
-# oCOGIWh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3Nmc2NhLmNybDAnoCWgI4YhaHR0
-# cDovL2NybC5zdGFydHNzbC5jb20vc2ZzY2EuY3JsMIGABgNVHSAEeTB3MHUGCysG
-# AQQBgbU3AQIBMGYwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29t
-# L3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t
-# L2ludGVybWVkaWF0ZS5wZGYwEQYJYIZIAYb4QgEBBAQDAgABMFAGCWCGSAGG+EIB
-# DQRDFkFTdGFydENvbSBDbGFzcyAyIFByaW1hcnkgSW50ZXJtZWRpYXRlIE9iamVj
-# dCBTaWduaW5nIENlcnRpZmljYXRlczANBgkqhkiG9w0BAQUFAAOCAgEAcnMLA3Va
-# N4OIE9l4QT5OEtZy5PByBit3oHiqQpgVEQo7DHRsjXD5H/IyTivpMikaaeRxIv95
-# baRd4hoUcMwDj4JIjC3WA9FoNFV31SMljEZa66G8RQECdMSSufgfDYu1XQ+cUKxh
-# D3EtLGGcFGjjML7EQv2Iol741rEsycXwIXcryxeiMbU2TPi7X3elbwQMc4JFlJ4B
-# y9FhBzuZB1DV2sN2irGVbC3G/1+S2doPDjL1CaElwRa/T0qkq2vvPxUgryAoCppU
-# FKViw5yoGYC+z1GaesWWiP1eFKAL0wI7IgSvLzU3y1Vp7vsYaxOVBqZtebFTWRHt
-# XjCsFrrQBngt0d33QbQRI5mwgzEp7XJ9xu5d6RVWM4TPRUsd+DDZpBHm9mszvi9g
-# VFb2ZG7qRRXCSqys4+u/NLBPbXi/m/lU00cODQTlC/euwjk9HQtRrXQ/zqsBJS6U
-# J+eLGw1qOfj+HVBl/ZQpfoLk7IoWlRQvRL1s7oirEaqPZUIWY/grXq9r6jDKAp3L
-# ZdKQpPOnnogtqlU4f7/kLjEJhrrc98mrOWmVMK/BuFRAfQ5oDUMnVmCzAzLMjKfG
-# cVW/iMew41yfhgKbwpfzm3LBr1Zv+pEBgcgW6onRLSAn3XHM0eNtz+AkxH6rRf6B
-# 2mYhLEEGLapH8R1AMAo4BbVFOZR5kXcMCwowggg1MIIHHaADAgECAgIEuDANBgkq
-# hkiG9w0BAQUFADCBjDELMAkGA1UEBhMCSUwxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0
-# ZC4xKzApBgNVBAsTIlNlY3VyZSBEaWdpdGFsIENlcnRpZmljYXRlIFNpZ25pbmcx
-# ODA2BgNVBAMTL1N0YXJ0Q29tIENsYXNzIDIgUHJpbWFyeSBJbnRlcm1lZGlhdGUg
-# T2JqZWN0IENBMB4XDTExMTIwMzE1MzQxOVoXDTEzMTIwMzE0NTgwN1owgYwxIDAe
-# BgNVBA0TFzU4MTc5Ni1HaDd4Zkp4a3hRU0lPNEUwMQswCQYDVQQGEwJERTEPMA0G
-# A1UECBMGQmVybGluMQ8wDQYDVQQHEwZCZXJsaW4xFjAUBgNVBAMTDUphbm5pcyBM
-# ZWlkZWwxITAfBgkqhkiG9w0BCQEWEmphbm5pc0BsZWlkZWwuaW5mbzCCAiIwDQYJ
-# KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMcPeABYdN7nPq/AkZ/EkyUBGx/l2Yui
-# Lfm8ZdLG0ulMb/kQL3fRY7sUjYPyn9S6PhqqlFnNoGHJvbbReCdUC9SIQYmOEjEA
-# raHfb7MZU10NjO4U2DdGucj2zuO5tYxKizizOJF0e4yRQZVxpUGdvkW/+GLjCNK5
-# L7mIv3Z1dagxDKHYZT74HXiS4VFUwHF1k36CwfM2vsetdm46bdgSwV+BCMmZICYT
-# IJAS9UQHD7kP4rik3bFWjUx08NtYYFAVOd/HwBnemUmJe4j3IhZHr0k1+eDG8hDH
-# KVvPgLJIoEjC4iMFk5GWsg5z2ngk0LLu3JZMtckHsnnmBPHQK8a3opUNd8hdMNJx
-# gOwKjQt2JZSGUdIEFCKVDqj0FmdnDMPfwy+FNRtpBMl1sz78dUFhSrnM0D8NXrqa
-# 4rG+2FoOXlmm1rb6AFtpjAKksHRpYcPk2DPGWp/1sWB+dUQkS3gOmwFzyqeTuXpT
-# 0juqd3iAxOGx1VRFQ1VHLLf3AzV4wljBau26I+tu7iXxesVucSdsdQu293jwc2kN
-# xK2JyHCoZH+RyytrwS0qw8t7rMOukU9gwP8mn3X6mgWlVUODMcHTULjSiCEtvyZ/
-# aafcwjUbt4ReEcnmuZtWIha86MTCX7U7e+cnpWG4sIHPnvVTaz9rm8RyBkIxtFCB
-# nQ3FnoQgyxeJAgMBAAGjggOdMIIDmTAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIH
-# gDAuBgNVHSUBAf8EJDAiBggrBgEFBQcDAwYKKwYBBAGCNwIBFQYKKwYBBAGCNwoD
-# DTAdBgNVHQ4EFgQUWyCgrIWo8Ifvvm1/YTQIeMU9nc8wHwYDVR0jBBgwFoAU0E4P
-# QJlsuEsZbzsouODjiAc0qrcwggIhBgNVHSAEggIYMIICFDCCAhAGCysGAQQBgbU3
-# AQICMIIB/zAuBggrBgEFBQcCARYiaHR0cDovL3d3dy5zdGFydHNzbC5jb20vcG9s
-# aWN5LnBkZjA0BggrBgEFBQcCARYoaHR0cDovL3d3dy5zdGFydHNzbC5jb20vaW50
-# ZXJtZWRpYXRlLnBkZjCB9wYIKwYBBQUHAgIwgeowJxYgU3RhcnRDb20gQ2VydGlm
-# aWNhdGlvbiBBdXRob3JpdHkwAwIBARqBvlRoaXMgY2VydGlmaWNhdGUgd2FzIGlz
-# c3VlZCBhY2NvcmRpbmcgdG8gdGhlIENsYXNzIDIgVmFsaWRhdGlvbiByZXF1aXJl
-# bWVudHMgb2YgdGhlIFN0YXJ0Q29tIENBIHBvbGljeSwgcmVsaWFuY2Ugb25seSBm
-# b3IgdGhlIGludGVuZGVkIHB1cnBvc2UgaW4gY29tcGxpYW5jZSBvZiB0aGUgcmVs
-# eWluZyBwYXJ0eSBvYmxpZ2F0aW9ucy4wgZwGCCsGAQUFBwICMIGPMCcWIFN0YXJ0
-# Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MAMCAQIaZExpYWJpbGl0eSBhbmQg
-# d2FycmFudGllcyBhcmUgbGltaXRlZCEgU2VlIHNlY3Rpb24gIkxlZ2FsIGFuZCBM
-# aW1pdGF0aW9ucyIgb2YgdGhlIFN0YXJ0Q29tIENBIHBvbGljeS4wNgYDVR0fBC8w
-# LTAroCmgJ4YlaHR0cDovL2NybC5zdGFydHNzbC5jb20vY3J0YzItY3JsLmNybDCB
-# iQYIKwYBBQUHAQEEfTB7MDcGCCsGAQUFBzABhitodHRwOi8vb2NzcC5zdGFydHNz
-# bC5jb20vc3ViL2NsYXNzMi9jb2RlL2NhMEAGCCsGAQUFBzAChjRodHRwOi8vYWlh
-# LnN0YXJ0c3NsLmNvbS9jZXJ0cy9zdWIuY2xhc3MyLmNvZGUuY2EuY3J0MCMGA1Ud
-# EgQcMBqGGGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tLzANBgkqhkiG9w0BAQUFAAOC
-# AQEAhrzEV6zwoEtKjnFRhCsjwiPykVpo5Eiye77Ve801rQDiRKgSCCiW6g3HqedL
-# OtaSs65Sj2pm3Viea4KR0TECLcbCTgsdaHqw2x1yXwWBQWZEaV6EB05lIwfr94P1
-# SFpV43zkuc+bbmA3+CRK45LOcCNH5Tqq7VGTCAK5iM7tvHwFlbQRl+I6VEL2mjpF
-# NsuRjDOVrv/9qw/a22YJ9R7Y1D0vUSs3IqZx2KMUaYDP7H2mSRxJO2nADQZBtriF
-# gTyfD3lYV12MlIi5CQwe3QC6DrrfSMP33i5Wa/OFJiQ27WPxmScYVhiqozpImFT4
-# PU9goiBv9RKXdgTmZE1PN0NQ5jGCAzUwggMxAgEBMIGTMIGMMQswCQYDVQQGEwJJ
-# TDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0
-# YWwgQ2VydGlmaWNhdGUgU2lnbmluZzE4MDYGA1UEAxMvU3RhcnRDb20gQ2xhc3Mg
-# MiBQcmltYXJ5IEludGVybWVkaWF0ZSBPYmplY3QgQ0ECAgS4MAkGBSsOAwIaBQCg
-# eDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEMBgorBgEE
-# AYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMCMGCSqGSIb3DQEJ
-# BDEWBBRVGw0FDSiaIi38dWteRUAg/9Pr6DANBgkqhkiG9w0BAQEFAASCAgCInvOZ
-# FdaNFzbf6trmFDZKMojyx3UjKMCqNjHVBbuKY0qXwFC/ElYDV1ShJ2CBZbdurydO
-# OQ6cIQ0KREOCwmX/xB49IlLHHUxNhEkVv7HGU3EKAFf9IBt9Yr7jikiR9cjIsfHK
-# 4cjkoKJL7g28yEpLLkHt1eo37f1Ga9lDWEa5Zq3U5yX+IwXhrUBm1h8Xr033FhTR
-# VEpuSz6LHtbrL/zgJnCzJ2ahjtJoYevdcWiNXffosJHFaSfYDDbiNsPRDH/1avmb
-# 5j/7BhP8BcBaR6Fp8tFbNGIcWHHGcjqLMnTc4w13b7b4pDhypqElBa4+lCmwdvv9
-# GydYtRgPz8GHeoBoKj30YBlMzRIfFYaIFGIC4Ai3UEXkuH9TxYohVbGm/W0Kl4Lb
-# RJ1FwiVcLcTOJdgNId2vQvKc+jtNrjcg5SP9h2v/C4aTx8tyc6tE3TOPh2f9b8DL
-# S+SbVArJpuJqrPTxDDoO1QNjTgLcdVYeZDE+r/NjaGZ6cMSd8db3EaG3ijD/0bud
-# SItbm/OlNVbQOFRR76D+ZNgPcU5iNZ3bmvQQIg6aSB9MHUpIE/SeCkNl9YeVk1/1
-# GFULgNMRmIYP4KLvu9ylh5Gu3hvD5VNhH6+FlXANwFy07uXks5uF8mfZVxVCnodG
-# xkNCx+6PsrA5Z7WP4pXcmYnMn97npP/Q9EHJWw==
-# SIG # End signature block
|