virtualenv 21.2.4__tar.gz → 21.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. {virtualenv-21.2.4 → virtualenv-21.3.0}/PKG-INFO +1 -1
  2. {virtualenv-21.2.4 → virtualenv-21.3.0}/pyproject.toml +1 -0
  3. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/activation/__init__.py +2 -0
  4. virtualenv-21.3.0/src/virtualenv/activation/xonsh/__init__.py +34 -0
  5. virtualenv-21.3.0/src/virtualenv/activation/xonsh/activate.xsh +101 -0
  6. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/config/cli/parser.py +3 -2
  7. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/run/plugin/base.py +8 -2
  8. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/seed/wheels/embed/__init__.py +7 -6
  9. virtualenv-21.3.0/src/virtualenv/seed/wheels/embed/pip-26.1-py3-none-any.whl +0 -0
  10. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/version.py +2 -2
  11. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/activation/conftest.py +22 -9
  12. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/activation/test_activation_support.py +3 -2
  13. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/activation/test_powershell.py +2 -1
  14. virtualenv-21.3.0/tests/unit/activation/test_xonsh.py +91 -0
  15. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/seed/embed/test_bootstrap_link_via_app_data.py +6 -1
  16. {virtualenv-21.2.4 → virtualenv-21.3.0}/.gitignore +0 -0
  17. {virtualenv-21.2.4 → virtualenv-21.3.0}/LICENSE +0 -0
  18. {virtualenv-21.2.4 → virtualenv-21.3.0}/README.md +0 -0
  19. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/__init__.py +0 -0
  20. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/__main__.py +0 -0
  21. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/activation/activator.py +0 -0
  22. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/activation/bash/__init__.py +0 -0
  23. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/activation/bash/activate.sh +0 -0
  24. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/activation/batch/__init__.py +0 -0
  25. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/activation/batch/activate.bat +0 -0
  26. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/activation/batch/deactivate.bat +0 -0
  27. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/activation/batch/pydoc.bat +0 -0
  28. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/activation/cshell/__init__.py +0 -0
  29. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/activation/cshell/activate.csh +0 -0
  30. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/activation/fish/__init__.py +0 -0
  31. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/activation/fish/activate.fish +0 -0
  32. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/activation/nushell/__init__.py +0 -0
  33. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/activation/nushell/activate.nu +0 -0
  34. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/activation/powershell/__init__.py +0 -0
  35. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/activation/powershell/activate.ps1 +0 -0
  36. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/activation/python/__init__.py +0 -0
  37. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/activation/python/activate_this.py +0 -0
  38. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/activation/via_template.py +0 -0
  39. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/app_data/__init__.py +0 -0
  40. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/app_data/base.py +0 -0
  41. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/app_data/na.py +0 -0
  42. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/app_data/read_only.py +0 -0
  43. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/app_data/via_disk_folder.py +0 -0
  44. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/app_data/via_tempdir.py +0 -0
  45. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/config/__init__.py +0 -0
  46. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/config/cli/__init__.py +0 -0
  47. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/config/convert.py +0 -0
  48. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/config/env_var.py +0 -0
  49. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/config/ini.py +0 -0
  50. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/create/__init__.py +0 -0
  51. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/create/creator.py +0 -0
  52. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/create/debug.py +0 -0
  53. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/create/describe.py +0 -0
  54. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/create/pyenv_cfg.py +0 -0
  55. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/create/via_global_ref/__init__.py +0 -0
  56. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/create/via_global_ref/_virtualenv.py +0 -0
  57. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/create/via_global_ref/api.py +0 -0
  58. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/create/via_global_ref/builtin/__init__.py +0 -0
  59. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/create/via_global_ref/builtin/builtin_way.py +0 -0
  60. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/create/via_global_ref/builtin/cpython/__init__.py +0 -0
  61. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/create/via_global_ref/builtin/cpython/common.py +0 -0
  62. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/create/via_global_ref/builtin/cpython/cpython3.py +0 -0
  63. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/create/via_global_ref/builtin/cpython/mac_os.py +0 -0
  64. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/create/via_global_ref/builtin/graalpy/__init__.py +0 -0
  65. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/create/via_global_ref/builtin/pypy/__init__.py +0 -0
  66. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/create/via_global_ref/builtin/pypy/common.py +0 -0
  67. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/create/via_global_ref/builtin/pypy/pypy3.py +0 -0
  68. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/create/via_global_ref/builtin/ref.py +0 -0
  69. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/create/via_global_ref/builtin/rustpython/__init__.py +0 -0
  70. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/create/via_global_ref/builtin/via_global_self_do.py +0 -0
  71. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/create/via_global_ref/store.py +0 -0
  72. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/create/via_global_ref/venv.py +0 -0
  73. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/discovery/__init__.py +0 -0
  74. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/discovery/builtin.py +0 -0
  75. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/discovery/cached_py_info.py +0 -0
  76. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/discovery/discover.py +0 -0
  77. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/discovery/py_info.py +0 -0
  78. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/discovery/py_spec.py +0 -0
  79. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/info.py +0 -0
  80. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/py.typed +0 -0
  81. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/report.py +0 -0
  82. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/run/__init__.py +0 -0
  83. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/run/plugin/__init__.py +0 -0
  84. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/run/plugin/activators.py +0 -0
  85. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/run/plugin/creators.py +0 -0
  86. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/run/plugin/discovery.py +0 -0
  87. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/run/plugin/seeders.py +0 -0
  88. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/run/session.py +0 -0
  89. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/seed/__init__.py +0 -0
  90. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/seed/embed/__init__.py +0 -0
  91. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/seed/embed/base_embed.py +0 -0
  92. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/seed/embed/pip_invoke.py +0 -0
  93. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/seed/embed/via_app_data/__init__.py +0 -0
  94. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/seed/embed/via_app_data/pip_install/__init__.py +0 -0
  95. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/seed/embed/via_app_data/pip_install/base.py +0 -0
  96. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/seed/embed/via_app_data/pip_install/copy.py +0 -0
  97. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/seed/embed/via_app_data/pip_install/symlink.py +0 -0
  98. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/seed/embed/via_app_data/via_app_data.py +0 -0
  99. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/seed/seeder.py +0 -0
  100. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/seed/wheels/__init__.py +0 -0
  101. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/seed/wheels/acquire.py +0 -0
  102. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/seed/wheels/bundle.py +0 -0
  103. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/seed/wheels/embed/pip-25.0.1-py3-none-any.whl +0 -0
  104. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/seed/wheels/embed/pip-26.0.1-py3-none-any.whl +0 -0
  105. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/seed/wheels/embed/setuptools-75.3.4-py3-none-any.whl +0 -0
  106. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/seed/wheels/embed/setuptools-82.0.1-py3-none-any.whl +0 -0
  107. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/seed/wheels/embed/wheel-0.45.1-py3-none-any.whl +0 -0
  108. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/seed/wheels/periodic_update.py +0 -0
  109. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/seed/wheels/util.py +0 -0
  110. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/util/__init__.py +0 -0
  111. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/util/error.py +0 -0
  112. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/util/lock.py +0 -0
  113. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/util/path/__init__.py +0 -0
  114. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/util/path/_permission.py +0 -0
  115. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/util/path/_sync.py +0 -0
  116. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/util/path/_win.py +0 -0
  117. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/util/subprocess/__init__.py +0 -0
  118. {virtualenv-21.2.4 → virtualenv-21.3.0}/src/virtualenv/util/zipapp.py +0 -0
  119. {virtualenv-21.2.4 → virtualenv-21.3.0}/tasks/__main__zipapp.py +0 -0
  120. {virtualenv-21.2.4 → virtualenv-21.3.0}/tasks/make_zipapp.py +0 -0
  121. {virtualenv-21.2.4 → virtualenv-21.3.0}/tasks/release.py +0 -0
  122. {virtualenv-21.2.4 → virtualenv-21.3.0}/tasks/update_embedded.py +0 -0
  123. {virtualenv-21.2.4 → virtualenv-21.3.0}/tasks/upgrade_wheels.py +0 -0
  124. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/conftest.py +0 -0
  125. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/integration/test_cachedir_tag.py +0 -0
  126. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/integration/test_race_condition_simulation.py +0 -0
  127. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/integration/test_run_int.py +0 -0
  128. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/integration/test_zipapp.py +0 -0
  129. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/types.py +0 -0
  130. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/activation/test_activator.py +0 -0
  131. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/activation/test_bash.py +0 -0
  132. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/activation/test_batch.py +0 -0
  133. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/activation/test_csh.py +0 -0
  134. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/activation/test_fish.py +0 -0
  135. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/activation/test_nushell.py +0 -0
  136. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/activation/test_python_activator.py +0 -0
  137. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/config/cli/test_help_formatter.py +0 -0
  138. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/config/cli/test_parser.py +0 -0
  139. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/config/test___main__.py +0 -0
  140. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/config/test_env_var.py +0 -0
  141. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/config/test_ini.py +0 -0
  142. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/conftest.py +0 -0
  143. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/console_app/demo/__init__.py +0 -0
  144. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/console_app/demo/__main__.py +0 -0
  145. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/console_app/setup.cfg +0 -0
  146. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/console_app/setup.py +0 -0
  147. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/test_creator.py +0 -0
  148. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/test_interpreters.py +0 -0
  149. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/via_global_ref/_test_race_condition_helper.py +0 -0
  150. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/via_global_ref/builtin/conftest.py +0 -0
  151. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/via_global_ref/builtin/cpython/conftest.py +0 -0
  152. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/via_global_ref/builtin/cpython/cpython3_win_embed.json +0 -0
  153. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/via_global_ref/builtin/cpython/cpython3_win_free_threaded.json +0 -0
  154. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/via_global_ref/builtin/cpython/test_cpython3_posix.py +0 -0
  155. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/via_global_ref/builtin/cpython/test_cpython3_win.py +0 -0
  156. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/via_global_ref/builtin/pypy/deb_pypy37.json +0 -0
  157. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/via_global_ref/builtin/pypy/deb_pypy38.json +0 -0
  158. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/via_global_ref/builtin/pypy/portable_pypy38.json +0 -0
  159. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/via_global_ref/builtin/pypy/test_pypy3.py +0 -0
  160. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/via_global_ref/builtin/rustpython/rustpython_posix.json +0 -0
  161. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/via_global_ref/builtin/rustpython/rustpython_windows.json +0 -0
  162. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/via_global_ref/builtin/rustpython/test_rustpython.py +0 -0
  163. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/via_global_ref/builtin/testing/__init__.py +0 -0
  164. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/via_global_ref/builtin/testing/helpers.py +0 -0
  165. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/via_global_ref/builtin/testing/path.py +0 -0
  166. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/via_global_ref/builtin/testing/py_info.py +0 -0
  167. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/via_global_ref/greet/greet2.c +0 -0
  168. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/via_global_ref/greet/greet3.c +0 -0
  169. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/via_global_ref/greet/setup.py +0 -0
  170. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/via_global_ref/test_api.py +0 -0
  171. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/via_global_ref/test_build_c_ext.py +0 -0
  172. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/create/via_global_ref/test_race_condition.py +0 -0
  173. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/discovery/test_discovery.py +0 -0
  174. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/seed/embed/test_base_embed.py +0 -0
  175. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/seed/embed/test_pip_invoke.py +0 -0
  176. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/seed/wheels/test_acquire.py +0 -0
  177. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/seed/wheels/test_acquire_find_wheel.py +0 -0
  178. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/seed/wheels/test_bundle.py +0 -0
  179. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/seed/wheels/test_periodic_update.py +0 -0
  180. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/seed/wheels/test_wheels_util.py +0 -0
  181. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/test_file_limit.py +0 -0
  182. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/test_run.py +0 -0
  183. {virtualenv-21.2.4 → virtualenv-21.3.0}/tests/unit/test_util.py +0 -0
  184. {virtualenv-21.2.4 → virtualenv-21.3.0}/tox.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: virtualenv
3
- Version: 21.2.4
3
+ Version: 21.3.0
4
4
  Summary: Virtual Python Environment builder
5
5
  Project-URL: Documentation, https://virtualenv.pypa.io
6
6
  Project-URL: Homepage, https://github.com/pypa/virtualenv
@@ -65,6 +65,7 @@ entry-points."virtualenv.activate".fish = "virtualenv.activation.fish:FishActiva
65
65
  entry-points."virtualenv.activate".nushell = "virtualenv.activation.nushell:NushellActivator"
66
66
  entry-points."virtualenv.activate".powershell = "virtualenv.activation.powershell:PowerShellActivator"
67
67
  entry-points."virtualenv.activate".python = "virtualenv.activation.python:PythonActivator"
68
+ entry-points."virtualenv.activate".xonsh = "virtualenv.activation.xonsh:XonshActivator"
68
69
  entry-points."virtualenv.create".cpython3-mac-brew = "virtualenv.create.via_global_ref.builtin.cpython.mac_os:CPython3macOsBrew"
69
70
  entry-points."virtualenv.create".cpython3-mac-framework = "virtualenv.create.via_global_ref.builtin.cpython.mac_os:CPython3macOsFramework"
70
71
  entry-points."virtualenv.create".cpython3-posix = "virtualenv.create.via_global_ref.builtin.cpython.cpython3:CPython3Posix"
@@ -7,6 +7,7 @@ from .fish import FishActivator
7
7
  from .nushell import NushellActivator
8
8
  from .powershell import PowerShellActivator
9
9
  from .python import PythonActivator
10
+ from .xonsh import XonshActivator
10
11
 
11
12
  __all__ = [
12
13
  "BashActivator",
@@ -16,4 +17,5 @@ __all__ = [
16
17
  "NushellActivator",
17
18
  "PowerShellActivator",
18
19
  "PythonActivator",
20
+ "XonshActivator",
19
21
  ]
@@ -0,0 +1,34 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from virtualenv.activation.via_template import ViaTemplateActivator
6
+
7
+ if TYPE_CHECKING:
8
+ from collections.abc import Iterator
9
+ from pathlib import Path
10
+
11
+ from virtualenv.create.creator import Creator
12
+
13
+
14
+ class XonshActivator(ViaTemplateActivator):
15
+ def templates(self) -> Iterator[str]:
16
+ yield "activate.xsh"
17
+
18
+ @staticmethod
19
+ def quote(string: str) -> str:
20
+ """Quote as a Python literal — xonsh parses the activation script as Python."""
21
+ return repr(string)
22
+
23
+ def replacements(self, creator: Creator, dest_folder: Path) -> dict[str, str]:
24
+ data = super().replacements(creator, dest_folder)
25
+ data.update({
26
+ "__TCL_LIBRARY__": getattr(creator.interpreter, "tcl_lib", None) or "",
27
+ "__TK_LIBRARY__": getattr(creator.interpreter, "tk_lib", None) or "",
28
+ })
29
+ return data
30
+
31
+
32
+ __all__ = [
33
+ "XonshActivator",
34
+ ]
@@ -0,0 +1,101 @@
1
+ # This file must be used with "source bin/activate.xsh" *from xonsh*.
2
+ # You cannot run it directly.
3
+
4
+
5
+ class _VirtualEnvActivator:
6
+ """xonsh activation for virtualenv.
7
+
8
+ Rendered into ``<venv>/bin/activate.xsh`` by the template in
9
+ ``src/virtualenv/activation/xonsh/`` at generate-time.
10
+
11
+ - Project: https://github.com/pypa/virtualenv
12
+ - Template source: https://github.com/pypa/virtualenv/tree/main/src/virtualenv/activation/xonsh
13
+ """
14
+
15
+ # Stashed in _OLD_VIRTUAL_{name} when the variable was not set before
16
+ # activation. deactivate treats this as "unset" rather than "restore to
17
+ # this string". Chosen to be vanishingly unlikely as a real value.
18
+ _UNSET_SENTINEL = "__virtualenv_was_not_set__"
19
+
20
+ def __init__(self):
21
+ self.env = __xonsh__.env
22
+ try:
23
+ # Values substituted by virtualenv's XonshActivator at generate-time.
24
+ # If this file was sourced before template rendering, the bare
25
+ # identifiers below resolve to NameError.
26
+ self.embedded_virtual_env = __VIRTUAL_ENV__
27
+ self.embedded_virtual_prompt = __VIRTUAL_PROMPT__
28
+ self.embedded_bin_name = __BIN_NAME__
29
+ self.embedded_tcl_library = __TCL_LIBRARY__
30
+ self.embedded_tk_library = __TK_LIBRARY__
31
+ except NameError:
32
+ print("virtualenv activate.xsh: template was not rendered")
33
+ raise
34
+ # Variables this activator may save+override; deactivate walks this list.
35
+ self.managed_vars = ("PATH", "PYTHONHOME", "TCL_LIBRARY", "TK_LIBRARY")
36
+
37
+ def _backup_name(self, name):
38
+ return f"_OLD_VIRTUAL_{name}"
39
+
40
+ def _save(self, name):
41
+ """Stash the current value (or sentinel if unset) so deactivate can undo."""
42
+ backup = self._backup_name(name)
43
+ self.env[backup] = self.env[name] if name in self.env else self._UNSET_SENTINEL
44
+
45
+ def _override(self, name, value):
46
+ self._save(name)
47
+ self.env[name] = value
48
+
49
+ def _drop(self, name):
50
+ self._save(name)
51
+ self.env.pop(name, None)
52
+
53
+ def register_pydoc(self):
54
+ aliases["pydoc"] = ["python", "-m", "pydoc"]
55
+
56
+ def unregister_pydoc(self):
57
+ aliases.pop("pydoc", None)
58
+
59
+ def activate(self):
60
+ from os.path import join, basename
61
+
62
+ aliases["deactivate"] = self.deactivate
63
+ self.deactivate(["nondestructive"]) # wipe any stale state from a prior activation
64
+
65
+ $VIRTUAL_ENV = self.embedded_virtual_env
66
+ $VIRTUAL_ENV_PROMPT = self.embedded_virtual_prompt or basename($VIRTUAL_ENV)
67
+
68
+ self._override("PATH", [join($VIRTUAL_ENV, self.embedded_bin_name), *$PATH])
69
+ self._drop("PYTHONHOME")
70
+ for name, value in (("TCL_LIBRARY", self.embedded_tcl_library), ("TK_LIBRARY", self.embedded_tk_library)):
71
+ if value:
72
+ self._override(name, value)
73
+
74
+ self.register_pydoc()
75
+
76
+ def deactivate(self, args=None):
77
+ for name in self.managed_vars:
78
+ backup = self._backup_name(name)
79
+ if backup not in self.env:
80
+ continue
81
+ previous = self.env[backup]
82
+ del self.env[backup]
83
+ if previous == self._UNSET_SENTINEL:
84
+ self.env.pop(name, None)
85
+ else:
86
+ self.env[name] = previous
87
+ for name in ("VIRTUAL_ENV", "VIRTUAL_ENV_PROMPT"):
88
+ self.env.pop(name, None)
89
+ self.unregister_pydoc()
90
+ if args is None or "nondestructive" not in args:
91
+ del aliases["deactivate"]
92
+ try:
93
+ del __xonsh__.xontrib.virtualenv
94
+ except AttributeError:
95
+ pass
96
+
97
+
98
+ if not hasattr(__xonsh__, "xontrib"):
99
+ __xonsh__.xontrib = __xonsh__.imp.types.SimpleNamespace()
100
+ __xonsh__.xontrib.virtualenv = _VirtualEnvActivator()
101
+ __xonsh__.xontrib.virtualenv.activate()
@@ -113,7 +113,8 @@ class VirtualEnvConfigParser(ArgumentParser):
113
113
  if outcome is not None:
114
114
  break
115
115
  if outcome is not None:
116
- action.default, action.default_source = outcome
116
+ action.default, default_source = outcome
117
+ vars(action)["default_source"] = default_source
117
118
  else:
118
119
  outcome = action.default, "default"
119
120
  self.options.set_src(action.dest, *outcome)
@@ -122,7 +123,7 @@ class VirtualEnvConfigParser(ArgumentParser):
122
123
  self._fix_defaults()
123
124
  self.add_argument("-h", "--help", action="help", default=SUPPRESS, help="show this help message and exit")
124
125
 
125
- def parse_known_args(
126
+ def parse_known_args( # ty: ignore[invalid-method-override]
126
127
  self, args: Sequence[str] | None = None, namespace: VirtualEnvOptions | None = None
127
128
  ) -> tuple[VirtualEnvOptions, list[str]]:
128
129
  if namespace is None:
@@ -22,8 +22,14 @@ class PluginLoader:
22
22
  @classmethod
23
23
  def entry_points_for(cls, key: str) -> OrderedDict[str, type]:
24
24
  if sys.version_info >= (3, 10) or importlib_metadata_version >= (3, 6):
25
- return OrderedDict((e.name, e.load()) for e in cls.entry_points().select(group=key)) # ty: ignore[unresolved-attribute]
26
- return OrderedDict((e.name, e.load()) for e in cls.entry_points().get(key, {})) # ty: ignore[unresolved-attribute]
25
+ selected = list(cls.entry_points().select(group=key)) # ty: ignore[unresolved-attribute]
26
+ else:
27
+ selected = list(cls.entry_points().get(key, [])) # ty: ignore[unresolved-attribute]
28
+ # Third-party packages may register entry points with the same name as virtualenv's
29
+ # built-ins (e.g. xonsh's own `virtualenv.activate.xonsh`). Sort so built-ins are
30
+ # inserted last into the OrderedDict, making them win on name collision.
31
+ selected.sort(key=lambda e: e.value.startswith("virtualenv."))
32
+ return OrderedDict((e.name, e.load()) for e in selected)
27
33
 
28
34
  @staticmethod
29
35
  def entry_points() -> object:
@@ -19,27 +19,27 @@ BUNDLE_SUPPORT = {
19
19
  "setuptools": "setuptools-82.0.1-py3-none-any.whl",
20
20
  },
21
21
  "3.10": {
22
- "pip": "pip-26.0.1-py3-none-any.whl",
22
+ "pip": "pip-26.1-py3-none-any.whl",
23
23
  "setuptools": "setuptools-82.0.1-py3-none-any.whl",
24
24
  },
25
25
  "3.11": {
26
- "pip": "pip-26.0.1-py3-none-any.whl",
26
+ "pip": "pip-26.1-py3-none-any.whl",
27
27
  "setuptools": "setuptools-82.0.1-py3-none-any.whl",
28
28
  },
29
29
  "3.12": {
30
- "pip": "pip-26.0.1-py3-none-any.whl",
30
+ "pip": "pip-26.1-py3-none-any.whl",
31
31
  "setuptools": "setuptools-82.0.1-py3-none-any.whl",
32
32
  },
33
33
  "3.13": {
34
- "pip": "pip-26.0.1-py3-none-any.whl",
34
+ "pip": "pip-26.1-py3-none-any.whl",
35
35
  "setuptools": "setuptools-82.0.1-py3-none-any.whl",
36
36
  },
37
37
  "3.14": {
38
- "pip": "pip-26.0.1-py3-none-any.whl",
38
+ "pip": "pip-26.1-py3-none-any.whl",
39
39
  "setuptools": "setuptools-82.0.1-py3-none-any.whl",
40
40
  },
41
41
  "3.15": {
42
- "pip": "pip-26.0.1-py3-none-any.whl",
42
+ "pip": "pip-26.1-py3-none-any.whl",
43
43
  "setuptools": "setuptools-82.0.1-py3-none-any.whl",
44
44
  },
45
45
  }
@@ -50,6 +50,7 @@ MAX = "3.8"
50
50
  BUNDLE_SHA256 = {
51
51
  "pip-25.0.1-py3-none-any.whl": "c46efd13b6aa8279f33f2864459c8ce587ea6a1a59ee20de055868d8f7688f7f",
52
52
  "pip-26.0.1-py3-none-any.whl": "bdb1b08f4274833d62c1aa29e20907365a2ceb950410df15fc9521bad440122b",
53
+ "pip-26.1-py3-none-any.whl": "4e8486d821d814b77319acb7b9e8bf5a4ee7590a643e7cb21029f209be8573c1",
53
54
  "setuptools-75.3.4-py3-none-any.whl": "2dd50a7f42dddfa1d02a36f275dbe716f38ed250224f609d35fb60a09593d93e",
54
55
  "setuptools-82.0.1-py3-none-any.whl": "a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb",
55
56
  "wheel-0.45.1-py3-none-any.whl": "708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248",
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '21.2.4'
22
- __version_tuple__ = version_tuple = (21, 2, 4)
21
+ __version__ = version = '21.3.0'
22
+ __version_tuple__ = version_tuple = (21, 3, 0)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -34,12 +34,13 @@ class ActivationTester:
34
34
  try:
35
35
  process = Popen(
36
36
  self._version_cmd,
37
+ stdin=subprocess.DEVNULL,
37
38
  universal_newlines=True,
38
39
  stdout=subprocess.PIPE,
39
40
  stderr=subprocess.PIPE,
40
41
  encoding="utf-8",
41
42
  )
42
- out, err = process.communicate()
43
+ out, err = process.communicate(timeout=30)
43
44
  except Exception as exception:
44
45
  self._version = exception
45
46
  if raise_on_fail:
@@ -75,12 +76,15 @@ class ActivationTester:
75
76
  invoke, env = [*self._invoke_script, str(test_script)], self.env(tmp_path)
76
77
 
77
78
  try:
78
- process = Popen(invoke, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, env=env)
79
- raw_, _ = process.communicate(timeout=120)
80
- except subprocess.TimeoutExpired:
79
+ process = Popen(invoke, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, env=env)
80
+ raw_, _ = process.communicate(timeout=60)
81
+ except subprocess.TimeoutExpired as exc:
81
82
  process.kill()
82
- process.communicate()
83
- pytest.fail(f"Activation script timed out: {invoke}")
83
+ remaining, _ = process.communicate(timeout=5)
84
+ partial = (exc.stdout or b"") + (remaining or b"")
85
+ pytest.fail(
86
+ f"Activation script timed out:\nPartial output:\n{partial.decode(errors='replace')}\nCommand: {invoke}"
87
+ )
84
88
  except subprocess.CalledProcessError as exception:
85
89
  output = exception.output + exception.stderr
86
90
  assert not exception.returncode, output # noqa: PT017
@@ -103,7 +107,7 @@ class ActivationTester:
103
107
  env["PYTHONIOENCODING"] = "utf-8"
104
108
  env["PATH"] = os.pathsep.join([dirname(sys.executable), *env.get("PATH", "").split(os.pathsep)])
105
109
  # clear up some environment variables so they don't affect the tests
106
- for key in [k for k in env if k.startswith(("_OLD", "VIRTUALENV_"))]:
110
+ for key in [k for k in env if k.startswith(("_OLD", "VIRTUALENV_", "COVERAGE_"))]:
107
111
  del env[key]
108
112
  return env
109
113
 
@@ -116,7 +120,7 @@ class ActivationTester:
116
120
  return test_script
117
121
 
118
122
  def _get_test_lines(self, activate_script):
119
- return [
123
+ steps = [
120
124
  self.print_python_exe(),
121
125
  self.print_os_env_var("VIRTUAL_ENV"),
122
126
  self.print_os_env_var("VIRTUAL_ENV_PROMPT"),
@@ -133,9 +137,17 @@ class ActivationTester:
133
137
  self.print_os_env_var("VIRTUAL_ENV_PROMPT"),
134
138
  "", # just finish with an empty new line
135
139
  ]
140
+ result = []
141
+ for index, step in enumerate(steps):
142
+ result.extend((self.print_marker(index), step))
143
+ return result
144
+
145
+ def print_marker(self, step) -> str:
146
+ return f'echo "__STEP_{step}__"'
136
147
 
137
148
  def assert_output(self, out, raw, tmp_path) -> None:
138
149
  """Compare _get_test_lines() with the expected values."""
150
+ out = [line for line in out if not line.strip('"').startswith("__STEP_")]
139
151
  assert out[0], raw
140
152
  assert out[1] == "None", raw
141
153
  assert out[2] == "None", raw
@@ -213,11 +225,12 @@ class RaiseOnNonSourceCall(ActivationTester):
213
225
  env, activate_script = super().__call__(monkeypatch, tmp_path)
214
226
  process = Popen(
215
227
  self.non_source_activate(activate_script),
228
+ stdin=subprocess.DEVNULL,
216
229
  stdout=subprocess.PIPE,
217
230
  stderr=subprocess.PIPE,
218
231
  env=env,
219
232
  )
220
- _out, err_ = process.communicate()
233
+ _out, err_ = process.communicate(timeout=60)
221
234
  err = err_.decode("utf-8")
222
235
  assert process.returncode
223
236
  assert self.non_source_fail_message in err
@@ -12,12 +12,13 @@ from virtualenv.activation import (
12
12
  FishActivator,
13
13
  PowerShellActivator,
14
14
  PythonActivator,
15
+ XonshActivator,
15
16
  )
16
17
 
17
18
 
18
19
  @pytest.mark.parametrize(
19
20
  "activator_class",
20
- [BatchActivator, PowerShellActivator, PythonActivator, BashActivator, FishActivator],
21
+ [BatchActivator, PowerShellActivator, PythonActivator, BashActivator, FishActivator, XonshActivator],
21
22
  )
22
23
  def test_activator_support_windows(mocker, activator_class) -> None:
23
24
  activator = activator_class(Namespace(prompt=None))
@@ -38,7 +39,7 @@ def test_activator_no_support_windows(mocker, activator_class) -> None:
38
39
 
39
40
  @pytest.mark.parametrize(
40
41
  "activator_class",
41
- [BashActivator, CShellActivator, FishActivator, PowerShellActivator, PythonActivator],
42
+ [BashActivator, CShellActivator, FishActivator, PowerShellActivator, PythonActivator, XonshActivator],
42
43
  )
43
44
  def test_activator_support_posix(mocker, activator_class) -> None:
44
45
  activator = activator_class(Namespace(prompt=None))
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import shutil
3
4
  import sys
4
5
  from argparse import Namespace
5
6
 
@@ -101,7 +102,7 @@ def test_powershell(activation_tester_class, activation_tester, monkeypatch) ->
101
102
 
102
103
  class PowerShell(activation_tester_class):
103
104
  def __init__(self, session) -> None:
104
- cmd = "powershell.exe" if sys.platform == "win32" else "pwsh"
105
+ cmd = "pwsh" if shutil.which("pwsh") else "powershell.exe" if sys.platform == "win32" else "pwsh"
105
106
  super().__init__(PowerShellActivator, session, cmd, "activate.ps1", "ps1")
106
107
  self._version_cmd = [cmd, "-c", "$PSVersionTable"]
107
108
  self._invoke_script = [cmd, "-NonInteractive", "-NoProfile", "-ExecutionPolicy", "ByPass", "-File"]
@@ -0,0 +1,91 @@
1
+ from __future__ import annotations
2
+
3
+ from argparse import Namespace
4
+ from shutil import which
5
+ from unittest.mock import create_autospec
6
+
7
+ import pytest
8
+ from python_discovery import PythonInfo
9
+
10
+ from virtualenv.activation import XonshActivator
11
+ from virtualenv.create.creator import Creator
12
+
13
+
14
+ @pytest.mark.parametrize(
15
+ ("tcl_lib", "tk_lib", "present"),
16
+ [
17
+ ("/path/to/tcl", "/path/to/tk", True),
18
+ (None, None, False),
19
+ ],
20
+ )
21
+ def test_xonsh_tkinter_generation(tmp_path, tcl_lib, tk_lib, present) -> None:
22
+ # GIVEN
23
+ interpreter = create_autospec(PythonInfo, instance=True)
24
+ interpreter.tcl_lib = tcl_lib
25
+ interpreter.tk_lib = tk_lib
26
+
27
+ bin_dir = tmp_path / "bin"
28
+ bin_dir.mkdir()
29
+
30
+ creator = create_autospec(Creator, instance=True)
31
+ creator.dest = tmp_path
32
+ creator.bin_dir = bin_dir
33
+ creator.interpreter = interpreter
34
+ creator.pyenv_cfg = {}
35
+ creator.env_name = "my-env"
36
+
37
+ activator = XonshActivator(Namespace(prompt=None))
38
+
39
+ # WHEN
40
+ activator.generate(creator)
41
+ content = (bin_dir / "activate.xsh").read_text(encoding="utf-8")
42
+
43
+ # THEN
44
+ # `managed_vars` always lists TCL_LIBRARY/TK_LIBRARY so deactivate can clean up
45
+ # whatever activation introduced — regardless of whether the interpreter reported
46
+ # tcl_lib/tk_lib.
47
+ assert '"TCL_LIBRARY"' in content
48
+ assert '"TK_LIBRARY"' in content
49
+
50
+ if present:
51
+ # Paths are embedded in __init__ as Python string literals and used
52
+ # from self.embedded_* attributes during activate().
53
+ assert "self.embedded_tcl_library = '/path/to/tcl'" in content
54
+ assert "self.embedded_tk_library = '/path/to/tk'" in content
55
+ else:
56
+ # Empty strings are falsy, so the override loop is skipped at runtime.
57
+ assert "self.embedded_tcl_library = ''" in content
58
+ assert "self.embedded_tk_library = ''" in content
59
+
60
+
61
+ def test_xonsh_quote() -> None:
62
+ # XonshActivator.quote uses repr() so the template substitution produces valid
63
+ # Python literals — this is what the rest of the tests rely on.
64
+ assert XonshActivator.quote("hello") == "'hello'"
65
+ assert XonshActivator.quote("it's") == '"it\'s"'
66
+ assert XonshActivator.quote("") == "''"
67
+
68
+
69
+ @pytest.mark.skipif(which("xonsh") is None, reason="xonsh is not installed")
70
+ def test_xonsh(activation_tester_class, activation_tester) -> None:
71
+ class Xonsh(activation_tester_class):
72
+ def __init__(self, session) -> None:
73
+ super().__init__(XonshActivator, session, "xonsh", "activate.xsh", "xsh")
74
+ self._invoke_script.append("--no-rc")
75
+
76
+ def env(self, tmp_path):
77
+ env = super().env(tmp_path)
78
+ # Keep the subprocess hermetic: skip auto-loaded xontribs that a dev may
79
+ # have installed locally, and surface tracebacks so test failures are
80
+ # actionable.
81
+ env["XONTRIBS_AUTOLOAD_DISABLED"] = "1"
82
+ env["XONSH_SHOW_TRACEBACK"] = "1"
83
+ return env
84
+
85
+ def print_prompt(self):
86
+ return 'echo @("(" + $VIRTUAL_ENV_PROMPT + ") ")'
87
+
88
+ def activate_call(self, script):
89
+ return f"source {self.quote(str(script))}"
90
+
91
+ activation_tester(Xonsh)
@@ -122,7 +122,12 @@ def test_seed_link_via_app_data(tmp_path, coverage_env, current_fastest, copies,
122
122
  purelib = result.creator.purelib
123
123
  patch_files = {purelib / f"{'_virtualenv'}.{i}" for i in ("py", "pyc", "pth")}
124
124
  patch_files.add(purelib / "__pycache__")
125
- post_run = set(site_package.iterdir()) - patch_files
125
+
126
+ # pip 26.1+ leaves empty parent directories on uninstall (pypa/pip#13725)
127
+ def _has_files(path: Path) -> bool:
128
+ return path.is_file() or (path.is_dir() and any(_has_files(child) for child in path.iterdir()))
129
+
130
+ post_run = {p for p in set(site_package.iterdir()) - patch_files if _has_files(p)}
126
131
  assert not post_run, "\n".join(str(i) for i in post_run)
127
132
 
128
133
 
File without changes
File without changes
File without changes
File without changes
File without changes