Giter Club home page Giter Club logo

xontrib-vox's Introduction

Python virtual environment manager for xonsh shell.

If you like the idea click ⭐ on the repo and tweet.

Installation

To install use pip:

xpip install xontrib-vox
# or: xpip install -U git+https://github.com/xonsh/xontrib-vox

Usage

This package contains three xontribs:

  • vox - Python virtual environment manager for xonsh.
  • autovox - Manages automatic activation of virtual environments.
  • voxapi - API for Vox, the Python virtual environment manager for xonsh.

vox

Python virtual environment manager for xonsh.

xontrib load vox
vox --help

autovox

Manages automatic activation of virtual environments.

xontrib load autovox

This coordinates multiple automatic vox policies and deals with some of the mechanics of venv searching and chdir handling.

This provides no interface for end users.

Developers should look at XSH.builtins.events.autovox_policy

voxapi

API for Vox, the Python virtual environment manager for xonsh.

xontrib load voxapi

Vox defines several events related to the life cycle of virtual environments:

  • vox_on_create(env: str) -> None
  • vox_on_activate(env: str, path: pathlib.Path) -> None
  • vox_on_deactivate(env: str, path: pathlib.Path) -> None
  • vox_on_delete(env: str) -> None

Credits

This package was created with xontrib template.

xontrib-vox's People

Contributors

anki-code avatar pre-commit-ci[bot] avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

xontrib-vox's Issues

Autovox: [bug, feature] Allow subfolder virtualenvs

This is both a feature request and a bug report, but the two are so directly related that I figured they should be included together.

Note that although the xontrib avox is mentioned here, the underlying features are provided by autovox of Xonsh proper.

Bug

When in a subdir within a recognized avox dir that triggers a virtual environment, typing avox create replies with "Working directory already has a virtual environment" -- but then proceeds to exit that virtual environment. When using cd to navigate out of the dir that has the virtualenv associated, it causes a traceback:

Example:

user@host ~/Projects $ mkdir -p example/foo
user@host ~/Projects $ cd example
user@host ~/Projects/example $ avox create
Creating virtual environment example...
Using Interpreter: /usr/bin/python3
Activating...
(example) user@host ~/Projects/example $ cd foo
(example) user@host ~/Projects/example/foo $ avox create
Working directory already has a virtual environment.
user@host ~/Projects/example/foo $ cd ..
user@host ~/Projects/example $ cd ..
xonsh: To log full traceback to a file set: $XONSH_TRACEBACK_LOGFILE = <filename>
Exception raised in event handler; ignored.
Traceback (most recent call last):
  File "/path/to/lib/python3.10/dist-packages/xonsh/__amalgam__.py", line 9768, in fire
    rv = handler(**kwargs)
  File "/path/to/lib/python3.10/dist-packages/xontrib/autovox.py", line 85, in cd_handler
    check_for_new_venv(Path(newdir), Path(olddir))
  File "/path/to/lib/python3.10/dist-packages/xontrib/autovox.py", line 77, in check_for_new_venv
    vox.deactivate()
  File "/path/to/lib/python3.10/dist-packages/xontrib/voxapi.py", line 397, in deactivate
    raise NoEnvironmentActive("No environment currently active.")
xontrib.voxapi.NoEnvironmentActive: No environment currently active.
user@host ~/Projects $

Feature Request

It would be very nice to be able to have nested venvs.

The use case is repositories that have a venv that is typically used, but have subprojects that use a different venv.

Although I think they should be truly nested, that's not an important feature, and it's not what vox does. So, the desired behavior would be:

  • when creating a new venv, or when entering a dir with a different avox-managed venv, first deactivate the current avox-managed venv (if any).
  • when deactivating a venv, traverse the parents to find the nearest avox-managed venv. If present, activate it.

Alternatively, "true" nesting would activate each virtualenv successively, but I don't know if venv supports that.

In any case, thanks for your this feature in general, it has been very useful.

xonfig

$ xonfig

Expected Behavior

Current Behavior

Traceback (if applicable)

traceback

Steps to Reproduce

For community

⬇️ Please click the 👍 reaction instead of leaving a +1 or 👍 comment

`vox activate` fails when currently active virtualenv is removed

xonfig

Clean install (inside a temp virtualenv), started as xonsh --no-rc

$ xonfig
+------------------+----------------------+
| xonsh            | 0.9.13.dev1          |
| Git SHA          | 9f7ccc65             |
| Commit Date      | Oct 15 17:14:50 2019 |
| Python           | 3.6.9                |
| PLY              | 3.11                 |
| have readline    | True                 |
| prompt toolkit   | 3.0.3                |
| shell type       | prompt_toolkit2      |
| pygments         | 2.5.2                |
| on posix         | True                 |
| on linux         | True                 |
| distro           | unknown              |
| on darwin        | False                |
| on windows       | False                |
| on cygwin        | False                |
| on msys2         | False                |
| is superuser     | False                |
| default encoding | utf-8                |
| xonsh encoding   | utf-8                |
| encoding errors  | surrogateescape      |
+------------------+----------------------+

Expected Behavior

The old virtualenv should be deactivated and the new virtualenv should be activated

Current Behavior

An error message is shown, old virtualenv is deactivated but new virtualenv isn't activated.

Steps to Reproduce

Open 2 xonsh instances.

In xonsh instance 1:

$  xontrib load vox
$  vox create foo
$  vox create bar
$  vox activate foo

In xonsh instance 2:

$  vox remove foo

or just remove or rename the virtualenv directory directly.

Back in xonsh instance 1:

$  vox activate bar
This environment doesn't exist. Create it with "vox new bar".

Note that a second vox activate bar does succeed (as the foo virtualenv has been deactivated by the first attempt):

$  vox activate bar
Activated "bar".

Additional info

Some quick debugging seems to indicate the problem is due to https://github.com/xonsh/xonsh/blob/master/xontrib/voxapi.py#L288 , the ve.bin dir doesn't exist (obviously, the virtualenv got removed ;) ) so the else: part of the for loop gets triggered, raising a KeyError. This gets caught by the except KeyError: part in cmd_activate() ( https://github.com/xonsh/xonsh/blob/master/xontrib/vox.py#L161 ).

For community

⬇️ Please click the 👍 reaction instead of leaving a +1 or 👍 comment

Vox does not clean up organizational directories

When deleting an organized venv (ie, has a slash in it), the empty parent directory is not removed with it.

For community

⬇️ Please click the 👍 reaction instead of leaving a +1 or 👍 comment

Add `vox enter` command

Basically, a magic command that will apply the named venv to the prompt, or create a new prompt in the venv, without having to install xonsh & xontribs into the venv.

For community

⬇️ Please click the 👍 reaction instead of leaving a +1 or 👍 comment

Out of the box xonsh will not execute within a Python Virtual Env on Windows 10

After downloading and unarchiving xonsh-master.zip, and then following the "Windows Install from Source" directions at https://xon.sh/windows.html, the following (abbreviated) console output was generated;

python -m venv TEST_XONSH
TEST_ONSH\Scripts\activate.bat
(TEST_ONSH) > pip list
Package Version


pip 10.0.1
setuptools 39.0.1

(TEST_XONSH) xonsh-master>python
Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 14:57:15) [MSC v.1915 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.

^Z

(TEST_ONSH) > pip install prompt-toolkit
(TEST_ONSH) > pip list
Package Version


pip 19.1.1
prompt-toolkit 2.0.9
setuptools 39.0.1
six 1.12.0
wcwidth 0.1.7
(TEST_ONSH) > cd xonsh-master
(TEST_ONSH) xonsh-master> python setup.py install
<<much output deleted, which I have if questions arise.>>
(TEST_XONSH) > xonsh-master>xonsh
xonsh-master\xonsh_amalgam_.py:16197: UserWarning: prompt_toolkit is not available, using readline instead.
"prompt_toolkit is not available, using " "readline instead."
Skipping setup. Because no readline implementation available.
Please install a backend (readline, prompt-toolkit, etc) to use
xonsh interactively.
See xonsh/xonsh#1170

After looking at xonsh code and sampling sys.path at runtime, I determined what the problem and fix was...

The reason this error happens is because the xonsh.bat file is making decisions about what Python interpreter to use; namely the one in C:\Windows\py.exe (who put that there??) rather than the one in the defined virtual env.

Replacing xonsh.bat with just the single line:
python -m xonsh %*
fixes the problem; so does just invoking the xonsh module like this:

(TEST_XONSH) xonsh-master>python -m xonsh --version
xonsh/0.9.6

My expectations were that the application would do nothing to automatically select a python interpreter; since the virtual environment creation and "activation" takes care of all those details so the virtual environment is usable.

I am looking forward to playing with xonsh. Thanks for working so hard, writing so much code, and releasing it for others to use!!

For community

⬇️ Please click the 👍 reaction instead of leaving a +1 or 👍 comment

vox doesn't expand ~ for $VIRTUALENV_HOME

Setting $VIRTUALENV_HOME to ~/.local/envs causes environments to be created in ~/\~/.local/envs (e.g. /Users/username/~/.local/envs). It would be nice if one didn't have to call os.expanduser when setting the environment variable.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.