Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions .github/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -282,9 +282,8 @@ current job, but cannot overwrite that entry. A build-script change
invalidates its key for later jobs. Never add a broad restore-key fallback
for native binaries.

The CI scripts require Python 3.11+ for the standard-library TOML reader;
the library keeps its Python 3.10 floor. Run the cache regressions against
an installed tmux:
The CI scripts use the standard-library TOML reader, which Python 3.11
added. Run the cache regressions against an installed tmux:

```console
$ uv run pytest .github/scripts/test_tmux_build.py --reruns=0
Expand Down
2 changes: 1 addition & 1 deletion .tool-versions
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
just 1.59.0
uv 0.13.7
python 3.15 3.14 3.13 3.12 3.11 3.10
python 3.15 3.14 3.13 3.12 3.11
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ live in [src/tmuxp/AGENTS.md](src/tmuxp/AGENTS.md).

## Domain facts

- tmux 3.2+, Python 3.10+ (`requires-python` in `pyproject.toml`); mypy runs
- tmux 3.2+, Python 3.11+ (`requires-python` in `pyproject.toml`); mypy runs
in strict mode.
- One console script (`tmuxp`) and one plugin entry-point group
(`tmuxp.workspace_builders`).
Expand Down
7 changes: 7 additions & 0 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,13 @@ $ tmuxp@next load yoursession
_Notes on the upcoming release will go here._
<!-- END PLACEHOLDER - ADD NEW CHANGELOG ENTRIES BELOW THIS LINE -->

### Breaking changes

#### Python 3.11+ is now required

tmuxp 1.76.0 was the last release supporting Python 3.10. Python 3.10 reached
end of life in October 2026.

### Documentation

#### libtmux.org top and documentation bars
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,7 @@ See donation options at <https://tony.sh/support.html>.
# Project details

- tmux support: 3.2+
- python support: >= 3.10, pypy, pypy3
- python support: >= 3.11, pypy, pypy3
- Source: <https://github.com/tmux-python/tmuxp>
- Docs: <https://tmuxp.git-pull.com>
- API: <https://tmuxp.git-pull.com/internals/api/>
Expand Down
2 changes: 1 addition & 1 deletion docs/quickstart.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ takes you from nothing to a running session.

## Installation

Ensure you have at least tmux **>= 3.2** and python **>= 3.10**.
Ensure you have at least tmux **>= 3.2** and python **>= 3.11**.

```console
$ pip install --user tmuxp
Expand Down
10 changes: 3 additions & 7 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
name = "tmuxp"
version = "1.76.0"
description = "Session manager for tmux, which allows users to save and load tmux sessions through simple configuration files."
requires-python = ">=3.10,<4.0"
requires-python = ">=3.11,<4.0"
authors = [
{name = "Tony Narlock", email = "tony@git-pull.com"}
]
Expand All @@ -15,7 +15,6 @@ classifiers = [
"Environment :: Web Environment",
"Intended Audience :: Developers",
"Programming Language :: Python",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
Expand Down Expand Up @@ -183,7 +182,7 @@ exclude_lines = [

[tool.mypy]
strict = true
python_version = "3.10"
python_version = "3.11"
files = [
"src/",
"tests/",
Expand All @@ -202,10 +201,7 @@ module = [
ignore_missing_imports = true

[tool.ruff]
target-version = "py310"

[tool.ruff.per-file-target-version]
".github/scripts/*.py" = "py311"
target-version = "py311"

[tool.ruff.lint]
# `select` is deliberately unset: ruff 0.16 enables a curated default rule
Expand Down
2 changes: 1 addition & 1 deletion src/tmuxp/_internal/private_path.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
logger = logging.getLogger(__name__)

if t.TYPE_CHECKING:
from typing_extensions import Self
from typing import Self

PrivatePathBase = pathlib.Path
else:
Expand Down
7 changes: 1 addition & 6 deletions src/tmuxp/_internal/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,7 @@
logger = logging.getLogger(__name__)

if t.TYPE_CHECKING:
import sys

if sys.version_info >= (3, 11):
from typing import NotRequired
else:
from typing_extensions import NotRequired
from typing import NotRequired


class PluginConfigSchema(TypedDict):
Expand Down
3 changes: 1 addition & 2 deletions src/tmuxp/cli/_progress.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,7 @@

if t.TYPE_CHECKING:
import types

from typing_extensions import Self
from typing import Self


# ANSI Escape Sequences
Expand Down
4 changes: 2 additions & 2 deletions src/tmuxp/cli/load.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,10 +82,10 @@ def _silence_stream_handlers(logger_name: str = "tmuxp") -> t.Iterator[None]:
)

if t.TYPE_CHECKING:
from typing import TypeAlias
from typing import NotRequired, TypeAlias

from libtmux.session import Session
from typing_extensions import NotRequired, TypedDict
from typing_extensions import TypedDict

from tmuxp.types import StrPath

Expand Down
2 changes: 1 addition & 1 deletion src/tmuxp/cli/ls.py
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ def _get_workspace_info(
"size": stat.st_size,
"mtime": datetime.datetime.fromtimestamp(
stat.st_mtime,
tz=datetime.timezone.utc,
tz=datetime.UTC,
).isoformat(),
"session_name": session_name,
"source": source,
Expand Down
4 changes: 2 additions & 2 deletions src/tmuxp/shell.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,13 @@
if t.TYPE_CHECKING:
from collections.abc import Callable
from types import ModuleType
from typing import TypeAlias
from typing import NotRequired, TypeAlias

from libtmux.pane import Pane
from libtmux.server import Server
from libtmux.session import Session
from libtmux.window import Window
from typing_extensions import NotRequired, TypedDict, Unpack
from typing_extensions import TypedDict, Unpack

CLIShellLiteral: TypeAlias = t.Literal[
"best",
Expand Down
8 changes: 6 additions & 2 deletions tests/fixtures/pluginsystem/partials/_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,15 @@
import typing as t

if t.TYPE_CHECKING:
from typing_extensions import NotRequired, TypedDict
from typing import NotRequired

from typing_extensions import TypedDict
else:
# Fallback for runtime, though this module should not be imported at runtime
try:
from typing_extensions import NotRequired, TypedDict
from typing import NotRequired

from typing_extensions import TypedDict
except ImportError:
# Create dummy classes for runtime
NotRequired = t.Any # type: ignore[misc, assignment]
Expand Down
Loading
Loading