Developing and Testing

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 the latest code from git

Using pip

To begin developing, check out the code from github:

$ git clone [email protected]:tmux-python/tmuxp.git
$ cd tmuxp

Now create a virtualenv, if you don’t know how to, you can create a virtualenv with:

$ virtualenv .venv

Then activate it to your current tty / terminal session with:

$ source .venv/bin/activate

Good! 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.

$ tmuxp

Using pipenv

To begin developing, check out the code from github:

$ git clone [email protected]:tmux-python/tmuxp.git
$ cd tmuxp

You can create a virtualenv, and install all of the locked packages as listed in Pipfile.lock:

$ pipenv install --ignore-pipfile --dev

If you prefer to install updated packages based on Pipfile only, not being bound by Pipfile.lock:

$ pipenv install --skip-lock --dev

If you ever need to update packages during your development session, the following command can be used to update all packages as per Pipfile settings or individual package (second command):

$ pipenv update --dev
$ pipenv update requests

Then activate it to your current tty / terminal session with:

$ pipenv shell

That is it! You are now ready to code!

Test Runner

As you 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.

$ make test

You 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 runner options

Test only a file:

$ py.test tests/test_config.py

will test the tests/test_config.py tests.

$ py.test tests/test_config.py::test_export_json

tests 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

Visual testing

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: $ cd into the tmuxp project and into the virtualenv if you are using one, see details on installing the dev version of tmuxp above. Then:

    $ py.test tests/test_workspacebuilder.py
    

Terminal 1 should have flickered and built the session before your eyes. tmuxp hides this building from normal users.

Run tests on save

You can re-run tests automatically on file edit.

Note

This requires entr(1).

Install entr. Packages are available available on most Linux and BSD variants, including Debian, Ubuntu, FreeBSD, OS X.

To run all tests upon editing any .py file:

$ make watch_test

You 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'

Rebuild sphinx docs on save

Rebuild the documentation when an .rst file is edited:

$ cd doc
$ make watch

tmuxp developer config

_images/tmuxp-dev-screenshot.png

After you Install the latest code from git, when inside the tmuxp checkout:

$ tmuxp load .

this will load the .tmuxp.yaml in the root of the project.

session_name: tmuxp
start_directory: ./ # load session relative to config location (project root).
before_script: pipenv install --dev --skip-lock
shell_command_before: 
  - '[ -d `pipenv --venv` ] && source `pipenv --venv`/bin/activate && reset'
windows:
- window_name: tmuxp
  focus: True
  layout: main-horizontal
  options:
    main-pane-height: 35
  panes:
  - focus: true
  - pane 
  - make watch_test
- window_name: docs
  layout: main-horizontal
  options:
    main-pane-height: 35
  start_directory: doc/
  panes:
  - focus: true
  - pane
  - make serve
  - make watch

Travis CI

tmuxp uses travis-ci for continuous integration / automatic unit testing.

To view the tmux and python versions tested see the .travis.yml. Builds are done on master and pull requests and can be viewed on the travis build site.

Testing options

RETRY_TIMEOUT_SECONDS can be toggled if certain workspace builder tests are being stubborn.

e.g. RETRY_TIMEOUT_SECONDS=10 py.test

language: python
sudo: false
dist: bionic  # 18.04
python:
  - 2.7
  - 3.7
  - pypy3
if: (type = push AND branch IN (master)) OR (type = pull_request)
env:
  global:
    - RETRY_TIMEOUT_SECONDS=15
  matrix:
    - TMUX_VERSION=master
    - TMUX_VERSION=3.0a
    - TMUX_VERSION=2.9
    - TMUX_VERSION=2.8
    - TMUX_VERSION=2.8
    - TMUX_VERSION=2.7
    - TMUX_VERSION=2.6
    - TMUX_VERSION=2.5
    - TMUX_VERSION=2.4
    - TMUX_VERSION=2.3
    - TMUX_VERSION=2.2
    - TMUX_VERSION=2.1
    - TMUX_VERSION=2.0
    - TMUX_VERSION=1.9a
    - TMUX_VERSION=1.8
matrix:
  finish_fast: true
  allow_failures:
  - env: TMUX_VERSION=master
cache:
  - pip
  - apt
  - directories:
    - ~/source
    - ~/build
install:
  - pip install -e .
  - pip install -r requirements/test.txt
  - pip install -r requirements/dev.txt
before_script:
  - mkdir -p ~/source
  - mkdir -p ~/build/tmux-$TMUX_VERSION
  - if [[ ! -d ~/source/tmux-$TMUX_VERSION ]]; then git clone https://github.com/tmux/tmux.git ~/source/tmux-$TMUX_VERSION; fi
  - cd ~/source/tmux-$TMUX_VERSION
  - git checkout $TMUX_VERSION
  - export PATH=$HOME/build/tmux-$TMUX_VERSION/bin:$PATH
  - if [[ $TMUX_VERSION == "master" || ! $(tmux -V | grep $TMUX_VERSION) ]]; then sh autogen.sh; fi
  - if [[ $TMUX_VERSION == "master" || ! $(tmux -V | grep $TMUX_VERSION) ]]; then ./configure --prefix=$HOME/build/tmux-$TMUX_VERSION && make && make install; fi
  - cd $TRAVIS_BUILD_DIR
  - tmux -V
script:
  - py.test --cov
  - make flake8
addons:
  apt:
    packages:
      - libevent-dev
      - libncurses-dev
after_success:
  - codecov