(developing)=
.. todo::
link to sliderepl or ipython notebook slides
Our tests are inside tests/. Tests are implemented using
pytest.
make test will create a tmux server on a separate socket_name
using $ tmux -L test_case.
(install-dev-env)=
To begin developing, check out the code from github:
$ git clone git@github.com:tmux-python/tmuxp.git$ cd tmuxpThe easiest way to configure a dev environment is through uv. This automatically will manage virtualenv and python dependencies for tmuxp. For information on installing uv visit the uv's documentation.
To begin developing, check out the code from github:
$ git clone git@github.com:tmux-python/tmuxp.git$ cd tmuxpYou can create a virtualenv, and install all of the locked packages as listed in uv.lock:
$ uv sync --all-extras --devIf you ever need to update packages during your development session, the following command can be used to update all packages as per uv settings:
$ uv sync --all-extras --dev --upgradeThen before any python command in tty / terminal session, run with:
$ uv run [command]That is it! You are now ready to code!
Now create a virtualenv, if you don't know how to, you can create a virtualenv with:
$ virtualenv .venvThen activate it to your current tty / terminal session with:
$ source .venv/bin/activateGood! Now let's run this:
$ pip install -e .This has pip, a python package manager install the python package
in the current directory. -e means --editable, which means you can
adjust the code and the installed software will reflect the changes.
When you manage dependencies with uv, add the checkout as an editable development dependency instead:
$ uv add --dev --editable .Prefer a one-off, pipx-style execution while you hack? Call tmuxp via uvx:
$ uvx tmuxp$ tmuxppytest is used for tests.
As you've seen above, the tmuxp command will now be available to you,
since you are in the virtual environment, your PATH environment was
updated to include a special version of python inside your .venv
folder with its own packages.
via pytest-watcher (works out of the box):
$ make startvia entr(1) (requires installation):
$ make watch_test$ uv run py.testor:
$ make testPYTEST_ADDOPTS can be set in the commands below. For more
information read docs.pytest.com for the latest documentation.
Verbose:
$ env PYTEST_ADDOPTS="-verbose" make startPick a file:
$ env PYTEST_ADDOPTS="tests/workspace/test_builder.py" uv run make startDrop into test_automatic_rename_option() in tests/workspace/test_builder.py:
$ env PYTEST_ADDOPTS="-s -x -vv tests/workspace/test_builder.py" uv run make startDrop into test_automatic_rename_option() in tests/workspace/test_builder.py and stop on first error:
$ env PYTEST_ADDOPTS="-s -x -vv tests/workspace/test_builder.py::test_automatic_rename_option" uv run make startDrop into pdb on first error:
$ env PYTEST_ADDOPTS="-x -s --pdb" make startIf you have ipython installed:
$ env PYTEST_ADDOPTS="--pdbcls=IPython.terminal.debugger:TerminalPdb" make start$ make testYou probably didn't see anything but tests scroll by.
If you found a problem or are trying to write a test, you can file an issue on github.
(test-specific-tests)=
Test only a file:
$ py.test tests/test_config.pywill test the tests/test_config.py tests.
$ py.test tests/test_config.py::test_export_jsontests test_export_json inside of tests/test_config.py.
Multiple can be separated by spaces:
$ py.test tests/test_{window,pane}.py tests/test_config.py::test_export_json(test-builder-visually)=
You can watch tmux testsuite build sessions visually by keeping a client open in a separate terminal.
Create two terminals:
-
Terminal 1:
$ tmux -L test_case -
Terminal 2:
$ cdinto the tmuxp project and into thevirtualenvif you are using one, see details on installing the dev version of tmuxp above. Then:$ py.test tests/workspace/test_builder.py
Terminal 1 should have flickered and built the session before your eyes. tmuxp hides this building from normal users.
You can re-run tests automatically on file edit.
:::{note}
This requires entr(1).
:::
Install entr. Packages are available on most Linux and BSD variants, including Debian, Ubuntu, FreeBSD, OS X.
To run all tests upon editing any .py file:
$ make watch_testYou can also re-run a specific test file or any other py.test usage argument:
$ make watch_test test=tests/test_config.py$ make watch_test test='-x tests/test_config.py tests/test_util.py'RETRY_TIMEOUT_SECONDS can be toggled if certain workspace builder
tests are being stubborn.
e.g. RETRY_TIMEOUT_SECONDS=10 py.test
:language: yaml
Rebuild the documentation when an .md file is edited:
$ cd doc$ make watch$ make SPHINXBUILD='uv run sphinx-build' watch(tmuxp-developer-config)=
:align: center
After you {ref}install-dev-env, when inside the tmuxp checkout:
$ tmuxp load .this will load the .tmuxp.yaml in the root of the project.
:language: yaml
The project uses ruff to handle formatting, sorting imports and linting.
uv:
```console
$ uv run ruff
```
If you setup manually:
```console
$ ruff check .
```
```console
$ make ruff
```
```console
$ make watch_ruff
```
requires [`entr(1)`].
uv:
```console
$ uv run ruff check . --fix
```
If you setup manually:
```console
$ ruff check . --fix
```
ruff format is used for formatting.
uv:
```console
$ uv run ruff format .
```
If you setup manually:
```console
$ ruff format .
```
```console
$ make ruff_format
```
mypy is used for static type checking.
uv:
```console
$ uv run mypy .
```
If you setup manually:
```console
$ mypy .
```
```console
$ make mypy
```
```console
$ make watch_mypy
```
requires [`entr(1)`].
(gh-actions)=
tmuxp uses github actions for continuous integration / automatic unit testing.
To view the tmux and python versions tested see the .github/workflows/tests.yml.
Builds are done on master and pull requests and can be viewed on
the gh build site.