Skip to content

Commit 17837f7

Browse files
committed
refactor!(pytest_plugin): Remove all autouse from default usage
This prevents plugins from being invoked simply by having libtmux installed. We don't want that - it would interrupt systems. Explicit is better than implicit. Move autouse for libtmux itself to the appropriate places.
1 parent 14cde4d commit 17837f7

File tree

4 files changed

+80
-31
lines changed

4 files changed

+80
-31
lines changed

docs/conftest.py

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from libtmux.conftest import * # NOQA: F4

libtmux/conftest.py

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import pathlib
2+
import shutil
3+
import typing as t
4+
5+
import pytest
6+
7+
from _pytest.doctest import DoctestItem
8+
9+
from libtmux.pytest_plugin import USING_ZSH
10+
11+
if t.TYPE_CHECKING:
12+
from libtmux.session import Session
13+
14+
15+
@pytest.fixture(autouse=True)
16+
def add_doctest_fixtures(
17+
request: pytest.FixtureRequest,
18+
doctest_namespace: t.Dict[str, t.Any],
19+
) -> None:
20+
if isinstance(request._pyfuncitem, DoctestItem) and shutil.which("tmux"):
21+
request.getfixturevalue("set_home")
22+
doctest_namespace["server"] = request.getfixturevalue("server")
23+
session: "Session" = request.getfixturevalue("session")
24+
doctest_namespace["session"] = session
25+
doctest_namespace["window"] = session.attached_window
26+
doctest_namespace["pane"] = session.attached_pane
27+
28+
29+
@pytest.fixture(autouse=True, scope="function")
30+
def set_home(
31+
monkeypatch: pytest.MonkeyPatch,
32+
user_path: pathlib.Path,
33+
) -> None:
34+
monkeypatch.setenv("HOME", str(user_path))
35+
36+
37+
@pytest.fixture(autouse=True, scope="session")
38+
@pytest.mark.usefixtures("clear_env")
39+
def setup(
40+
request: pytest.FixtureRequest,
41+
config_file: pathlib.Path,
42+
) -> None:
43+
if USING_ZSH:
44+
request.getfixturevalue("zshrc")

libtmux/pytest_plugin.py

+34-31
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,10 @@
22
import logging
33
import os
44
import pathlib
5-
import shutil
65
import typing as t
76

87
import pytest
98

10-
from _pytest.doctest import DoctestItem
11-
from _pytest.fixtures import SubRequest
12-
from _pytest.monkeypatch import MonkeyPatch
13-
149
from libtmux import exc
1510
from libtmux.server import Server
1611
from libtmux.test import TEST_SESSION_PREFIX, get_test_session_name, namer
@@ -22,20 +17,33 @@
2217
USING_ZSH = "zsh" in os.getenv("SHELL", "")
2318

2419

25-
@pytest.fixture(autouse=True, scope="session")
20+
@pytest.fixture(scope="session")
2621
def home_path(tmp_path_factory: pytest.TempPathFactory) -> pathlib.Path:
22+
"""Temporary `/home/` path."""
2723
return tmp_path_factory.mktemp("home")
2824

2925

30-
@pytest.fixture(autouse=True, scope="session")
31-
def user_path(home_path: pathlib.Path) -> pathlib.Path:
32-
p = home_path / getpass.getuser()
26+
@pytest.fixture(scope="session")
27+
def home_user_name() -> str:
28+
"""Default username to set for :func:`user_path` fixture."""
29+
return getpass.getuser()
30+
31+
32+
@pytest.fixture(scope="session")
33+
def user_path(home_path: pathlib.Path, home_user_name: str) -> pathlib.Path:
34+
"""Default temporary user directory.
35+
36+
Used by: :func:`config_file`, :func:`zshrc`
37+
38+
Note: You will need to set the home directory, see :ref:`set_home`.
39+
"""
40+
p = home_path / home_user_name
3341
p.mkdir()
3442
return p
3543

3644

3745
@pytest.mark.skipif(USING_ZSH, reason="Using ZSH")
38-
@pytest.fixture(autouse=USING_ZSH, scope="session")
46+
@pytest.fixture(scope="session")
3947
def zshrc(user_path: pathlib.Path) -> pathlib.Path:
4048
"""This quiets ZSH default message.
4149
@@ -46,11 +54,15 @@ def zshrc(user_path: pathlib.Path) -> pathlib.Path:
4654
return p
4755

4856

49-
@pytest.fixture(scope="function")
57+
@pytest.fixture(scope="session")
5058
def config_file(user_path: pathlib.Path) -> pathlib.Path:
51-
"""Set default tmux configuration (base indexes for windows, panes)
59+
"""Default `.tmux.conf` configuration.
60+
61+
- ``base-index -g 1``
62+
63+
These guarantee pane and windows targets can be reliably referenced and asserted.
5264
53-
We need this for tests to work across tmux versions in our CI matrix.
65+
Note: You will need to set the home directory, see :ref:`set_home`.
5466
"""
5567
c = user_path / ".tmux.conf"
5668
c.write_text(
@@ -62,8 +74,8 @@ def config_file(user_path: pathlib.Path) -> pathlib.Path:
6274
return c
6375

6476

65-
@pytest.fixture(autouse=True)
66-
def clear_env(monkeypatch: MonkeyPatch) -> None:
77+
@pytest.fixture
78+
def clear_env(monkeypatch: pytest.MonkeyPatch) -> None:
6779
"""Clear out any unnecessary environment variables that could interrupt tests.
6880
6981
tmux show-environment tests were being interrupted due to a lot of crazy env vars.
@@ -92,9 +104,12 @@ def clear_env(monkeypatch: MonkeyPatch) -> None:
92104

93105
@pytest.fixture(scope="function")
94106
def server(
95-
request: SubRequest, monkeypatch: MonkeyPatch, config_file: pathlib.Path
107+
request: pytest.FixtureRequest,
108+
monkeypatch: pytest.MonkeyPatch,
109+
config_file: pathlib.Path,
96110
) -> Server:
97-
t = Server(config_file=str(config_file.absolute()))
111+
"""Returns a new, temporary :class:`libtmux.Server`"""
112+
t = Server()
98113
t.socket_name = "libtmux_test%s" % next(namer)
99114

100115
def fin() -> None:
@@ -106,7 +121,8 @@ def fin() -> None:
106121

107122

108123
@pytest.fixture(scope="function")
109-
def session(request: SubRequest, server: Server) -> "Session":
124+
def session(request: pytest.FixtureRequest, server: Server) -> "Session":
125+
"""Returns a new, temporary :class:`libtmux.Session`"""
110126
session_name = "tmuxp"
111127

112128
if not server.has_session(session_name):
@@ -146,16 +162,3 @@ def session(request: SubRequest, server: Server) -> "Session":
146162
assert TEST_SESSION_NAME != "tmuxp"
147163

148164
return session
149-
150-
151-
@pytest.fixture(autouse=True)
152-
def add_doctest_fixtures(
153-
request: SubRequest,
154-
doctest_namespace: t.Dict[str, t.Any],
155-
) -> None:
156-
if isinstance(request._pyfuncitem, DoctestItem) and shutil.which("tmux"):
157-
doctest_namespace["server"] = request.getfixturevalue("server")
158-
session: "Session" = request.getfixturevalue("session")
159-
doctest_namespace["session"] = session
160-
doctest_namespace["window"] = session.attached_window
161-
doctest_namespace["pane"] = session.attached_pane

tests/conftest.py

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from libtmux.conftest import * # NOQA: F4

0 commit comments

Comments
 (0)